mirror of https://github.com/acidanthera/audk.git
Ring3: Properly freed Ring3 resources.
This commit is contained in:
parent
85fcc4774c
commit
c779a246e9
|
@ -273,6 +273,8 @@ extern LOADED_IMAGE_PRIVATE_DATA * mCurrentImage;
|
|||
|
||||
extern RING3_DATA *gRing3Data;
|
||||
extern VOID *gRing3Interfaces;
|
||||
extern VOID *gCoreSysCallStackBase;
|
||||
extern VOID *gRing3CallStackBase;
|
||||
|
||||
//
|
||||
// Service Initialization Functions
|
||||
|
|
|
@ -763,6 +763,35 @@ CoreExitBootServices (
|
|||
{
|
||||
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
|
||||
// before the memory map is terminated.
|
||||
|
@ -840,18 +869,6 @@ CoreExitBootServices (
|
|||
//
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -10,7 +10,9 @@
|
|||
#include <Register/Intel/ArchitecturalMsr.h>
|
||||
|
||||
VOID *gCoreSysCallStackTop;
|
||||
VOID *gCoreSysCallStackBase;
|
||||
VOID *gRing3CallStackTop;
|
||||
VOID *gRing3CallStackBase;
|
||||
VOID *gRing3EntryPoint;
|
||||
RING3_DATA *gRing3Data;
|
||||
VOID *gRing3Interfaces;
|
||||
|
@ -23,7 +25,6 @@ InitializeRing3 (
|
|||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
VOID *BaseOfStack;
|
||||
VOID *TopOfStack;
|
||||
UINTN SizeOfStack;
|
||||
UINT64 Msr;
|
||||
|
@ -105,35 +106,35 @@ InitializeRing3 (
|
|||
//
|
||||
// Allocate 128KB for the Core SysCall Stack.
|
||||
//
|
||||
BaseOfStack = AllocatePages (EFI_SIZE_TO_PAGES (USER_STACK_SIZE));
|
||||
ASSERT (BaseOfStack != NULL);
|
||||
gCoreSysCallStackBase = AllocatePages (EFI_SIZE_TO_PAGES (USER_STACK_SIZE));
|
||||
ASSERT (gCoreSysCallStackBase != NULL);
|
||||
|
||||
//
|
||||
// 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);
|
||||
|
||||
gCoreSysCallStackTop = TopOfStack;
|
||||
|
||||
SetUefiImageMemoryAttributes ((UINTN)BaseOfStack, SizeOfStack, EFI_MEMORY_XP);
|
||||
SetUefiImageMemoryAttributes ((UINTN)gCoreSysCallStackBase, SizeOfStack, EFI_MEMORY_XP);
|
||||
DEBUG ((DEBUG_ERROR, "Core: gCoreSysCallStackTop = %p\n", gCoreSysCallStackTop));
|
||||
|
||||
//
|
||||
// Allocate 128KB for the User Stack.
|
||||
//
|
||||
BaseOfStack = AllocatePages (EFI_SIZE_TO_PAGES (USER_STACK_SIZE));
|
||||
ASSERT (BaseOfStack != NULL);
|
||||
gRing3CallStackBase = AllocatePages (EFI_SIZE_TO_PAGES (USER_STACK_SIZE));
|
||||
ASSERT (gRing3CallStackBase != NULL);
|
||||
|
||||
//
|
||||
// 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);
|
||||
|
||||
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));
|
||||
|
||||
//
|
||||
|
|
Loading…
Reference in New Issue