mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-27 07:34:06 +02:00
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 RING3_DATA *gRing3Data;
|
||||||
extern VOID *gRing3Interfaces;
|
extern VOID *gRing3Interfaces;
|
||||||
|
extern VOID *gCoreSysCallStackBase;
|
||||||
|
extern VOID *gRing3CallStackBase;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Service Initialization Functions
|
// Service Initialization Functions
|
||||||
|
@ -763,6 +763,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.
|
||||||
@ -840,18 +869,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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));
|
||||||
|
|
||||||
//
|
//
|
||||||
|
Loading…
x
Reference in New Issue
Block a user