Ring3: Properly freed Ring3 resources.

This commit is contained in:
Mikhail Krichanov 2024-03-12 16:02:30 +03:00
parent 28221fe295
commit 507435e9f5
3 changed files with 41 additions and 21 deletions

View File

@ -274,6 +274,8 @@ extern LOADED_IMAGE_PRIVATE_DATA * mCurrentImage;
extern RING3_DATA *gRing3Data; extern RING3_DATA *gRing3Data;
extern VOID *gRing3Interfaces; extern VOID *gRing3Interfaces;
extern VOID *gCoreSysCallStackBase;
extern VOID *gRing3CallStackBase;
// //
// Service Initialization Functions // Service Initialization Functions

View File

@ -771,6 +771,35 @@ CoreExitBootServices (
{ {
EFI_STATUS Status; EFI_STATUS Status;
//
// Free resources allocated for Ring3.
//
if (gRing3Data != NULL) {
CoreFreePages (
(EFI_PHYSICAL_ADDRESS)gRing3Data,
EFI_SIZE_TO_PAGES (sizeof (RING3_DATA))
);
gRing3Data = NULL;
CoreFreePages (
(EFI_PHYSICAL_ADDRESS)gRing3Interfaces,
RING3_INTERFACES_PAGES
);
CoreFreePages (
(EFI_PHYSICAL_ADDRESS)gCoreSysCallStackBase,
EFI_SIZE_TO_PAGES (USER_STACK_SIZE)
);
CoreFreePages (
(EFI_PHYSICAL_ADDRESS)gRing3CallStackBase,
EFI_SIZE_TO_PAGES (USER_STACK_SIZE)
);
FreeProtocolsList ();
}
// //
// Notify other drivers of their last chance to use boot services // Notify other drivers of their last chance to use boot services
// before the memory map is terminated. // before the memory map is terminated.
@ -851,18 +880,6 @@ CoreExitBootServices (
// //
gRuntime->AtRuntime = TRUE; gRuntime->AtRuntime = TRUE;
CoreFreePages (
(EFI_PHYSICAL_ADDRESS)gRing3Data,
EFI_SIZE_TO_PAGES (sizeof (RING3_DATA))
);
CoreFreePages (
(EFI_PHYSICAL_ADDRESS)gRing3Interfaces,
RING3_INTERFACES_PAGES
);
FreeProtocolsList ();
return Status; return Status;
} }

View File

@ -10,7 +10,9 @@
#include <Register/Intel/ArchitecturalMsr.h> #include <Register/Intel/ArchitecturalMsr.h>
VOID *gCoreSysCallStackTop; VOID *gCoreSysCallStackTop;
VOID *gCoreSysCallStackBase;
VOID *gRing3CallStackTop; VOID *gRing3CallStackTop;
VOID *gRing3CallStackBase;
VOID *gRing3EntryPoint; VOID *gRing3EntryPoint;
RING3_DATA *gRing3Data; RING3_DATA *gRing3Data;
VOID *gRing3Interfaces; VOID *gRing3Interfaces;
@ -23,7 +25,6 @@ InitializeRing3 (
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
VOID *BaseOfStack;
VOID *TopOfStack; VOID *TopOfStack;
UINTN SizeOfStack; UINTN SizeOfStack;
UINT64 Msr; UINT64 Msr;
@ -105,35 +106,35 @@ InitializeRing3 (
// //
// Allocate 128KB for the Core SysCall Stack. // Allocate 128KB for the Core SysCall Stack.
// //
BaseOfStack = AllocatePages (EFI_SIZE_TO_PAGES (USER_STACK_SIZE)); gCoreSysCallStackBase = AllocatePages (EFI_SIZE_TO_PAGES (USER_STACK_SIZE));
ASSERT (BaseOfStack != NULL); ASSERT (gCoreSysCallStackBase != NULL);
// //
// Compute the top of the allocated stack. Pre-allocate a UINTN for safety. // Compute the top of the allocated stack. Pre-allocate a UINTN for safety.
// //
TopOfStack = (VOID *)((UINTN)BaseOfStack + SizeOfStack - CPU_STACK_ALIGNMENT); TopOfStack = (VOID *)((UINTN)gCoreSysCallStackBase + SizeOfStack - CPU_STACK_ALIGNMENT);
TopOfStack = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT); TopOfStack = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT);
gCoreSysCallStackTop = TopOfStack; gCoreSysCallStackTop = TopOfStack;
SetUefiImageMemoryAttributes ((UINTN)BaseOfStack, SizeOfStack, EFI_MEMORY_XP); SetUefiImageMemoryAttributes ((UINTN)gCoreSysCallStackBase, SizeOfStack, EFI_MEMORY_XP);
DEBUG ((DEBUG_ERROR, "Core: gCoreSysCallStackTop = %p\n", gCoreSysCallStackTop)); DEBUG ((DEBUG_ERROR, "Core: gCoreSysCallStackTop = %p\n", gCoreSysCallStackTop));
// //
// Allocate 128KB for the User Stack. // Allocate 128KB for the User Stack.
// //
BaseOfStack = AllocatePages (EFI_SIZE_TO_PAGES (USER_STACK_SIZE)); gRing3CallStackBase = AllocatePages (EFI_SIZE_TO_PAGES (USER_STACK_SIZE));
ASSERT (BaseOfStack != NULL); ASSERT (gRing3CallStackBase != NULL);
// //
// Compute the top of the allocated stack. Pre-allocate a UINTN for safety. // Compute the top of the allocated stack. Pre-allocate a UINTN for safety.
// //
TopOfStack = (VOID *)((UINTN)BaseOfStack + SizeOfStack - CPU_STACK_ALIGNMENT); TopOfStack = (VOID *)((UINTN)gRing3CallStackBase + SizeOfStack - CPU_STACK_ALIGNMENT);
TopOfStack = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT); TopOfStack = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT);
gRing3CallStackTop = TopOfStack; gRing3CallStackTop = TopOfStack;
SetUefiImageMemoryAttributes ((UINTN)BaseOfStack, SizeOfStack, EFI_MEMORY_XP | EFI_MEMORY_USER); SetUefiImageMemoryAttributes ((UINTN)gRing3CallStackBase, SizeOfStack, EFI_MEMORY_XP | EFI_MEMORY_USER);
DEBUG ((DEBUG_ERROR, "Core: gRing3CallStackTop = %p\n", gRing3CallStackTop)); DEBUG ((DEBUG_ERROR, "Core: gRing3CallStackTop = %p\n", gRing3CallStackTop));
// //