From 31fef0a12e73b6843fb20eaa9f06d54bf9eb6d46 Mon Sep 17 00:00:00 2001 From: Mikhail Krichanov Date: Mon, 27 Jan 2025 19:27:01 +0300 Subject: [PATCH] Core/Dxe: Added sanity checks. --- MdeModulePkg/Core/Dxe/Image/Image.c | 1 + .../Core/Dxe/SysCall/AARCH64/InitializeAARCH64.c | 16 +++++++--------- .../Core/Dxe/SysCall/ARM/InitializeARM.c | 16 +++++++--------- .../Core/Dxe/SysCall/IA32/InitializeIA32.c | 8 ++++++-- MdeModulePkg/Core/Dxe/SysCall/Initialization.c | 14 +++++++------- .../Core/Dxe/SysCall/X64/InitializeX64.c | 7 ++++--- 6 files changed, 32 insertions(+), 30 deletions(-) diff --git a/MdeModulePkg/Core/Dxe/Image/Image.c b/MdeModulePkg/Core/Dxe/Image/Image.c index 6fa3c90160..417b6c9c58 100644 --- a/MdeModulePkg/Core/Dxe/Image/Image.c +++ b/MdeModulePkg/Core/Dxe/Image/Image.c @@ -1701,6 +1701,7 @@ CoreStartImage ( if (gRing3Data == NULL) { Image->Status = InitializeRing3 (ImageHandle, Image); if (EFI_ERROR (Image->Status)) { + DEBUG ((DEBUG_ERROR, "Core: Failed to initialize User address space - %r.\n", Image->Status)); CpuDeadLoop (); } } else { diff --git a/MdeModulePkg/Core/Dxe/SysCall/AARCH64/InitializeAARCH64.c b/MdeModulePkg/Core/Dxe/SysCall/AARCH64/InitializeAARCH64.c index 854f80301c..21e5865bc5 100644 --- a/MdeModulePkg/Core/Dxe/SysCall/AARCH64/InitializeAARCH64.c +++ b/MdeModulePkg/Core/Dxe/SysCall/AARCH64/InitializeAARCH64.c @@ -66,7 +66,7 @@ SysCallBootService ( return Status; } -VOID +EFI_STATUS EFIAPI MakeUserPageTableTemplate ( OUT UINTN *UserPageTableTemplate, @@ -77,9 +77,8 @@ MakeUserPageTableTemplate ( VOID *MemorySizeHob; MemorySizeHob = GetFirstGuidHob (&gArmVirtSystemMemorySizeGuid); - ASSERT (MemorySizeHob != NULL); if (MemorySizeHob == NULL) { - return; + return EFI_NOT_FOUND; } Descriptor.PhysicalBase = PcdGet64 (PcdSystemMemoryBase); @@ -87,11 +86,11 @@ MakeUserPageTableTemplate ( Descriptor.Length = *(UINT64 *)GET_GUID_HOB_DATA (MemorySizeHob); Descriptor.Attributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK; - ArmMakeUserPageTableTemplate ( - &Descriptor, - UserPageTableTemplate, - UserPageTableTemplateSize - ); + return ArmMakeUserPageTableTemplate ( + &Descriptor, + UserPageTableTemplate, + UserPageTableTemplateSize + ); } EFI_STATUS @@ -118,7 +117,6 @@ InitializePlatform ( &Physical ); if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "Core: Failed to allocate memory for Ring3 ConfigurationTable.\n")); return Status; } diff --git a/MdeModulePkg/Core/Dxe/SysCall/ARM/InitializeARM.c b/MdeModulePkg/Core/Dxe/SysCall/ARM/InitializeARM.c index dd0bc1c51f..37c5e55b9a 100644 --- a/MdeModulePkg/Core/Dxe/SysCall/ARM/InitializeARM.c +++ b/MdeModulePkg/Core/Dxe/SysCall/ARM/InitializeARM.c @@ -93,7 +93,7 @@ SysCallBootService ( return Status; } -VOID +EFI_STATUS EFIAPI MakeUserPageTableTemplate ( OUT UINTN *UserPageTableTemplate, @@ -104,9 +104,8 @@ MakeUserPageTableTemplate ( VOID *MemorySizeHob; MemorySizeHob = GetFirstGuidHob (&gArmVirtSystemMemorySizeGuid); - ASSERT (MemorySizeHob != NULL); if (MemorySizeHob == NULL) { - return; + return EFI_NOT_FOUND; } Descriptor.PhysicalBase = PcdGet64 (PcdSystemMemoryBase); @@ -114,11 +113,11 @@ MakeUserPageTableTemplate ( Descriptor.Length = *(UINT64 *)GET_GUID_HOB_DATA (MemorySizeHob); Descriptor.Attributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK; - ArmMakeUserPageTableTemplate ( - &Descriptor, - UserPageTableTemplate, - UserPageTableTemplateSize - ); + return ArmMakeUserPageTableTemplate ( + &Descriptor, + UserPageTableTemplate, + UserPageTableTemplateSize + ); } EFI_STATUS @@ -143,7 +142,6 @@ InitializePlatform ( &Physical ); if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "Core: Failed to allocate memory for Ring3 ConfigurationTable.\n")); return Status; } diff --git a/MdeModulePkg/Core/Dxe/SysCall/IA32/InitializeIA32.c b/MdeModulePkg/Core/Dxe/SysCall/IA32/InitializeIA32.c index f9b615914a..dd9b34e284 100644 --- a/MdeModulePkg/Core/Dxe/SysCall/IA32/InitializeIA32.c +++ b/MdeModulePkg/Core/Dxe/SysCall/IA32/InitializeIA32.c @@ -12,7 +12,7 @@ extern EXCEPTION_ADDRESSES *mExceptionAddresses; -VOID +EFI_STATUS EFIAPI MakeUserPageTableTemplate ( OUT UINTN *UserPageTableTemplate, @@ -45,7 +45,9 @@ MakeUserPageTableTemplate ( TotalPagesNum = NumberOfPdpEntriesNeeded + 1; PageAddress = (UINTN)AllocatePages (TotalPagesNum); - ASSERT (PageAddress != 0); + if (PageAddress == 0) { + return EFI_OUT_OF_RESOURCES; + } PageMap = (VOID *)PageAddress; PageAddress += SIZE_4KB; @@ -87,6 +89,8 @@ MakeUserPageTableTemplate ( *UserPageTableTemplate = (UINTN)PageMap; *UserPageTableTemplateSize = EFI_PAGES_TO_SIZE (TotalPagesNum); + + return EFI_SUCCESS; } EFI_STATUS diff --git a/MdeModulePkg/Core/Dxe/SysCall/Initialization.c b/MdeModulePkg/Core/Dxe/SysCall/Initialization.c index 7302ef6e49..ee9a256080 100644 --- a/MdeModulePkg/Core/Dxe/SysCall/Initialization.c +++ b/MdeModulePkg/Core/Dxe/SysCall/Initialization.c @@ -19,7 +19,7 @@ STATIC UEFI_IMAGE_RECORD *mDxeRing3; STATIC EFI_PHYSICAL_ADDRESS mCoreStackBase; STATIC UINT64 mCoreStackSize; -VOID +EFI_STATUS EFIAPI MakeUserPageTableTemplate ( OUT UINTN *UserPageTableTemplate, @@ -60,7 +60,6 @@ InitializeRing3 ( &Physical ); if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "Core: Failed to allocate memory for Ring3Data.\n")); return Status; } @@ -98,7 +97,6 @@ InitializeRing3 ( &Physical ); if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "Core: Failed to allocate memory for Ring3Interfaces.\n")); CoreFreePages ( (EFI_PHYSICAL_ADDRESS)(UINTN)gRing3Data, EFI_SIZE_TO_PAGES (sizeof (RING3_DATA)) @@ -150,6 +148,7 @@ InitializeUserPageTable ( IN LOADED_IMAGE_PRIVATE_DATA *Image ) { + EFI_STATUS Status; UINTN UserPageTable; UINTN UserPageTableSize; UEFI_IMAGE_RECORD_SEGMENT *ImageRecordSegment; @@ -157,10 +156,11 @@ InitializeUserPageTable ( UINT32 Index; UEFI_IMAGE_RECORD *UserImageRecord; - // - // TODO: Remove ASSERTs, add proper checks and return status. - // - MakeUserPageTableTemplate (&UserPageTable, &UserPageTableSize); + Status = MakeUserPageTableTemplate (&UserPageTable, &UserPageTableSize); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Core: Failed to initialize User page table - %r.\n", Status)); + CpuDeadLoop (); + } // // Map gRing3Data, gRing3Interfaces, DxeRing3 diff --git a/MdeModulePkg/Core/Dxe/SysCall/X64/InitializeX64.c b/MdeModulePkg/Core/Dxe/SysCall/X64/InitializeX64.c index 9428f7fbb9..fe87433b83 100644 --- a/MdeModulePkg/Core/Dxe/SysCall/X64/InitializeX64.c +++ b/MdeModulePkg/Core/Dxe/SysCall/X64/InitializeX64.c @@ -13,7 +13,7 @@ extern EXCEPTION_ADDRESSES *mExceptionAddresses; -VOID +EFI_STATUS EFIAPI MakeUserPageTableTemplate ( OUT UINTN *UserPageTableTemplate, @@ -159,8 +159,7 @@ MakeUserPageTableTemplate ( BigPageAddress = (UINTN)AllocatePages (TotalPagesNum); if (BigPageAddress == 0) { - DEBUG ((DEBUG_ERROR, "Core: Could not allocate buffer for User page table.\n")); - CpuDeadLoop (); + return EFI_OUT_OF_RESOURCES; } // @@ -284,6 +283,8 @@ MakeUserPageTableTemplate ( *UserPageTableTemplate = (UINTN)PageMap; *UserPageTableTemplateSize = EFI_PAGES_TO_SIZE (TotalPagesNum); + + return EFI_SUCCESS; } EFI_STATUS