From 233a5cff09fb397d904ad32db9d63ae9a653e425 Mon Sep 17 00:00:00 2001 From: Mikhail Krichanov Date: Thu, 18 Jan 2024 14:00:47 +0300 Subject: [PATCH] Ring3: Fixed LibraryConstructors' initialization and allowed user to access ports. --- MdeModulePkg/Core/Dxe/DxeMain.inf | 2 ++ MdeModulePkg/Core/Dxe/Image/Image.c | 9 +++++++++ MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 4 ++++ 3 files changed, 15 insertions(+) diff --git a/MdeModulePkg/Core/Dxe/DxeMain.inf b/MdeModulePkg/Core/Dxe/DxeMain.inf index 681ad580a2..55169a392d 100644 --- a/MdeModulePkg/Core/Dxe/DxeMain.inf +++ b/MdeModulePkg/Core/Dxe/DxeMain.inf @@ -193,6 +193,8 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdImageLargeAddressLoad ## CONSUMES gEfiMdePkgTokenSpaceGuid.PcdDebugRaisePropertyMask ## CONSUMES gEfiMdePkgTokenSpaceGuid.PcdImageProtectionPolicy ## CONSUMES + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase ## CONSUMES + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize ## CONSUMES # [Hob] # RESOURCE_DESCRIPTOR ## CONSUMES diff --git a/MdeModulePkg/Core/Dxe/Image/Image.c b/MdeModulePkg/Core/Dxe/Image/Image.c index 2b45e3b30f..bcca272218 100644 --- a/MdeModulePkg/Core/Dxe/Image/Image.c +++ b/MdeModulePkg/Core/Dxe/Image/Image.c @@ -1714,6 +1714,15 @@ CoreStartImage ( TopOfStack = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT); // DEBUG ((DEBUG_ERROR, "RING3_CODE64_SEL = 0x%x RING3_DATA64_SEL = 0x%x\n", (UINT16)RING3_CODE64_SEL, (UINT16)RING3_DATA64_SEL)); + // + // Necessary fix for ProcessLibraryConstructorList() -> DxeCcProbeLibConstructor() + // + SetUefiImageMemoryAttributes ( + FixedPcdGet32 (PcdOvmfWorkAreaBase), + FixedPcdGet32 (PcdOvmfWorkAreaSize), + EFI_MEMORY_XP | EFI_MEMORY_USER + ); + EnterUserImage ( (SWITCH_STACK_ENTRY_POINT)(UINTN)Image->EntryPoint, ImageHandle, diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c index 5da703641e..503f9a364d 100644 --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c @@ -992,6 +992,10 @@ CreateIdentityMappingPageTables ( Eflags.UintN = AsmReadEflags (); Eflags.Bits.AC = 0; + // + // Allow user image to access ports. + // + Eflags.Bits.IOPL = 3; AsmWriteEflags (Eflags.UintN); }