mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-23 13:44:33 +02:00
Ring3: Added MemoryPoolLib into DxeRing3.
This commit is contained in:
parent
68dce7677d
commit
07188c19a8
@ -7,6 +7,8 @@
|
|||||||
|
|
||||||
#include <Uefi.h>
|
#include <Uefi.h>
|
||||||
#include <Library/BaseMemoryLib.h>
|
#include <Library/BaseMemoryLib.h>
|
||||||
|
#include <Library/MemoryPoolLib.h>
|
||||||
|
#include <Library/UefiBootServicesTableLib.h>
|
||||||
|
|
||||||
#include "Ring3.h"
|
#include "Ring3.h"
|
||||||
|
|
||||||
@ -23,8 +25,8 @@ EFI_BOOT_SERVICES mBootServices = {
|
|||||||
(EFI_ALLOCATE_PAGES)Ring3AllocatePages, // AllocatePages
|
(EFI_ALLOCATE_PAGES)Ring3AllocatePages, // AllocatePages
|
||||||
(EFI_FREE_PAGES)Ring3FreePages, // FreePages
|
(EFI_FREE_PAGES)Ring3FreePages, // FreePages
|
||||||
(EFI_GET_MEMORY_MAP)Ring3GetMemoryMap, // GetMemoryMap
|
(EFI_GET_MEMORY_MAP)Ring3GetMemoryMap, // GetMemoryMap
|
||||||
(EFI_ALLOCATE_POOL)Ring3AllocatePool, // AllocatePool
|
(EFI_ALLOCATE_POOL)CoreAllocatePool, // AllocatePool
|
||||||
(EFI_FREE_POOL)Ring3FreePool, // FreePool
|
(EFI_FREE_POOL)CoreFreePool, // FreePool
|
||||||
(EFI_CREATE_EVENT)Ring3CreateEvent, // CreateEvent
|
(EFI_CREATE_EVENT)Ring3CreateEvent, // CreateEvent
|
||||||
(EFI_SET_TIMER)Ring3SetTimer, // SetTimer
|
(EFI_SET_TIMER)Ring3SetTimer, // SetTimer
|
||||||
(EFI_WAIT_FOR_EVENT)Ring3WaitForEvent, // WaitForEvent
|
(EFI_WAIT_FOR_EVENT)Ring3WaitForEvent, // WaitForEvent
|
||||||
@ -177,5 +179,9 @@ Ring3Initialization (
|
|||||||
Ring3Data->EntryPoint = (VOID *)Ring3EntryPoint;
|
Ring3Data->EntryPoint = (VOID *)Ring3EntryPoint;
|
||||||
Ring3Data->BootServices = &mBootServices;
|
Ring3Data->BootServices = &mBootServices;
|
||||||
|
|
||||||
|
gBS = &mBootServices;
|
||||||
|
|
||||||
|
CoreInitializePool ();
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -32,13 +32,16 @@
|
|||||||
|
|
||||||
[Packages]
|
[Packages]
|
||||||
MdePkg/MdePkg.dec
|
MdePkg/MdePkg.dec
|
||||||
|
MdeModulePkg/MdeModulePkg.dec
|
||||||
|
|
||||||
[LibraryClasses]
|
[LibraryClasses]
|
||||||
BaseLib
|
BaseLib
|
||||||
BaseMemoryLib
|
BaseMemoryLib
|
||||||
DebugLib
|
DebugLib
|
||||||
|
MemoryPoolLib
|
||||||
|
UefiBootServicesTableLib
|
||||||
UefiDriverEntryPoint
|
UefiDriverEntryPoint
|
||||||
|
|
||||||
[Protocols]
|
[Protocols]
|
||||||
gEfiDevicePathUtilitiesProtocolGuid ## SOMETIMES_CONSUMES
|
gEfiDevicePathUtilitiesProtocolGuid ## SOMETIMES_CONSUMES
|
||||||
gEfiLoadedImageProtocolGuid ## SOMETIMES_CONSUMES
|
gEfiLoadedImageProtocolGuid ## SOMETIMES_CONSUMES
|
||||||
|
@ -8,18 +8,25 @@
|
|||||||
|
|
||||||
#include <Uefi.h>
|
#include <Uefi.h>
|
||||||
|
|
||||||
|
#include <Guid/MemoryProfile.h>
|
||||||
|
|
||||||
#include <Library/BaseMemoryLib.h>
|
#include <Library/BaseMemoryLib.h>
|
||||||
#include <Library/DebugLib.h>
|
#include <Library/DebugLib.h>
|
||||||
|
|
||||||
#include "Ring3.h"
|
#include "Ring3.h"
|
||||||
|
|
||||||
|
BOOLEAN mOnGuarding = FALSE;
|
||||||
|
|
||||||
EFI_TPL
|
EFI_TPL
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Ring3RaiseTpl (
|
Ring3RaiseTpl (
|
||||||
IN EFI_TPL NewTpl
|
IN EFI_TPL NewTpl
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return NewTpl;
|
return (EFI_TPL)SysCall (
|
||||||
|
SysCallRaiseTpl,
|
||||||
|
NewTpl
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
@ -28,7 +35,10 @@ Ring3RestoreTpl (
|
|||||||
IN EFI_TPL NewTpl
|
IN EFI_TPL NewTpl
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
SysCall (
|
||||||
|
SysCallRestoreTpl,
|
||||||
|
NewTpl
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -40,7 +50,20 @@ Ring3AllocatePages (
|
|||||||
IN OUT EFI_PHYSICAL_ADDRESS *Memory
|
IN OUT EFI_PHYSICAL_ADDRESS *Memory
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return EFI_UNSUPPORTED;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
|
Status = SysCall (
|
||||||
|
SysCallAllocatePages,
|
||||||
|
Type,
|
||||||
|
MemoryType,
|
||||||
|
NumberOfPages,
|
||||||
|
Memory
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "Ring3: Failed to allocate %d pages.\n", NumberOfPages));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -50,7 +73,18 @@ Ring3FreePages (
|
|||||||
IN UINTN NumberOfPages
|
IN UINTN NumberOfPages
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return EFI_UNSUPPORTED;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
|
Status = SysCall (
|
||||||
|
SysCallFreePages,
|
||||||
|
Memory,
|
||||||
|
NumberOfPages
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "Ring3: Failed to free %d pages.\n", NumberOfPages));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -66,48 +100,6 @@ Ring3GetMemoryMap (
|
|||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
|
||||||
EFIAPI
|
|
||||||
Ring3AllocatePool (
|
|
||||||
IN EFI_MEMORY_TYPE PoolType,
|
|
||||||
IN UINTN Size,
|
|
||||||
OUT VOID **Buffer
|
|
||||||
)
|
|
||||||
{
|
|
||||||
EFI_STATUS Status;
|
|
||||||
|
|
||||||
Status = SysCall (
|
|
||||||
SysCallAllocatePool,
|
|
||||||
PoolType,
|
|
||||||
Size,
|
|
||||||
Buffer
|
|
||||||
);
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
DEBUG ((DEBUG_ERROR, "Ring3: Failed to allocate %d bytes.\n", Size));
|
|
||||||
}
|
|
||||||
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
EFI_STATUS
|
|
||||||
EFIAPI
|
|
||||||
Ring3FreePool (
|
|
||||||
IN VOID *Buffer
|
|
||||||
)
|
|
||||||
{
|
|
||||||
EFI_STATUS Status;
|
|
||||||
|
|
||||||
Status = SysCall (
|
|
||||||
SysCallFreePool,
|
|
||||||
Buffer
|
|
||||||
);
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
DEBUG ((DEBUG_ERROR, "Ring3: Failed to free buffer.\n"));
|
|
||||||
}
|
|
||||||
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Ring3CreateEvent (
|
Ring3CreateEvent (
|
||||||
@ -614,3 +606,69 @@ Ring3CreateEventEx (
|
|||||||
{
|
{
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
CoreUpdateProfile (
|
||||||
|
IN EFI_PHYSICAL_ADDRESS CallerAddress,
|
||||||
|
IN MEMORY_PROFILE_ACTION Action,
|
||||||
|
IN EFI_MEMORY_TYPE MemoryType,
|
||||||
|
IN UINTN Size, // Valid for AllocatePages/FreePages/AllocatePool
|
||||||
|
IN VOID *Buffer,
|
||||||
|
IN CHAR8 *ActionString OPTIONAL
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
InstallMemoryAttributesTableOnMemoryAllocation (
|
||||||
|
IN EFI_MEMORY_TYPE MemoryType
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
EFIAPI
|
||||||
|
IsMemoryGuarded (
|
||||||
|
IN EFI_PHYSICAL_ADDRESS Address
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID *
|
||||||
|
CoreAllocatePoolPagesI (
|
||||||
|
IN EFI_MEMORY_TYPE PoolType,
|
||||||
|
IN UINTN NoPages,
|
||||||
|
IN UINTN Granularity,
|
||||||
|
IN BOOLEAN NeedGuard
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_PHYSICAL_ADDRESS Memory;
|
||||||
|
|
||||||
|
Ring3AllocatePages (AllocateAnyPages, EfiRing3MemoryType, NoPages, &Memory);
|
||||||
|
|
||||||
|
return (VOID *)Memory;
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
CoreFreePoolPagesI (
|
||||||
|
IN EFI_MEMORY_TYPE PoolType,
|
||||||
|
IN EFI_PHYSICAL_ADDRESS Memory,
|
||||||
|
IN UINTN NoPages
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Ring3FreePages (Memory, NoPages);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
CoreFreePoolPagesWithGuard (
|
||||||
|
IN EFI_MEMORY_TYPE PoolType,
|
||||||
|
IN EFI_PHYSICAL_ADDRESS Memory,
|
||||||
|
IN UINTN NoPages
|
||||||
|
)
|
||||||
|
{
|
||||||
|
CoreFreePoolPagesI (PoolType, Memory, NoPages);
|
||||||
|
}
|
||||||
|
@ -1735,6 +1735,13 @@ CoreFreePages (
|
|||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_MEMORY_TYPE MemoryType;
|
EFI_MEMORY_TYPE MemoryType;
|
||||||
|
|
||||||
|
ApplyMemoryProtectionPolicy (
|
||||||
|
EfiMaxMemoryType,
|
||||||
|
EfiConventionalMemory,
|
||||||
|
Memory,
|
||||||
|
EFI_PAGES_TO_SIZE (NumberOfPages)
|
||||||
|
);
|
||||||
|
|
||||||
Status = CoreInternalFreePages (Memory, NumberOfPages, &MemoryType);
|
Status = CoreInternalFreePages (Memory, NumberOfPages, &MemoryType);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
GuardFreedPagesChecked (Memory, NumberOfPages);
|
GuardFreedPagesChecked (Memory, NumberOfPages);
|
||||||
@ -1747,12 +1754,6 @@ CoreFreePages (
|
|||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
InstallMemoryAttributesTableOnMemoryAllocation (MemoryType);
|
InstallMemoryAttributesTableOnMemoryAllocation (MemoryType);
|
||||||
ApplyMemoryProtectionPolicy (
|
|
||||||
MemoryType,
|
|
||||||
EfiConventionalMemory,
|
|
||||||
Memory,
|
|
||||||
EFI_PAGES_TO_SIZE (NumberOfPages)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
|
@ -950,9 +950,6 @@ ApplyMemoryProtectionPolicy (
|
|||||||
// policy is the same between OldType and NewType
|
// policy is the same between OldType and NewType
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
} else if (NewAttributes == 0) {
|
|
||||||
// newly added region of a type that does not require protection
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return gCpu->SetMemoryAttributes (gCpu, Memory, Length, NewAttributes);
|
return gCpu->SetMemoryAttributes (gCpu, Memory, Length, NewAttributes);
|
||||||
|
@ -291,34 +291,6 @@ CallBootService (
|
|||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
|
|
||||||
case SysCallAllocatePool:
|
|
||||||
//
|
|
||||||
// Argument 1: EFI_MEMORY_TYPE PoolType
|
|
||||||
// Argument 2: UINTN Size
|
|
||||||
// Argument 3: VOID **Buffer
|
|
||||||
//
|
|
||||||
DisableSMAP ();
|
|
||||||
Status = gBS->AllocatePool (
|
|
||||||
EfiRing3MemoryType,
|
|
||||||
CoreRbp->Argument2,
|
|
||||||
(VOID **)CoreRbp->Argument3
|
|
||||||
);
|
|
||||||
EnableSMAP ();
|
|
||||||
|
|
||||||
return Status;
|
|
||||||
|
|
||||||
case SysCallFreePool:
|
|
||||||
//
|
|
||||||
// Argument 1: VOID *Buffer
|
|
||||||
//
|
|
||||||
DisableSMAP ();
|
|
||||||
Status = gBS->FreePool (
|
|
||||||
(VOID *)CoreRbp->Argument1
|
|
||||||
);
|
|
||||||
EnableSMAP ();
|
|
||||||
|
|
||||||
return Status;
|
|
||||||
|
|
||||||
case SysCallCloseProtocol:
|
case SysCallCloseProtocol:
|
||||||
//
|
//
|
||||||
// Argument 1: EFI_HANDLE CoreUserHandle
|
// Argument 1: EFI_HANDLE CoreUserHandle
|
||||||
@ -379,6 +351,52 @@ CallBootService (
|
|||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
|
|
||||||
|
case SysCallAllocatePages:
|
||||||
|
//
|
||||||
|
// Argument 1: EFI_ALLOCATE_TYPE Type
|
||||||
|
// Argument 2: EFI_MEMORY_TYPE MemoryType
|
||||||
|
// Argument 3: UINTN NumberOfPages
|
||||||
|
// Argument 4: EFI_PHYSICAL_ADDRESS *Memory
|
||||||
|
//
|
||||||
|
Status = gBS->AllocatePages (
|
||||||
|
(EFI_ALLOCATE_TYPE)CoreRbp->Argument1,
|
||||||
|
(EFI_MEMORY_TYPE)CoreRbp->Argument2,
|
||||||
|
CoreRbp->Argument3,
|
||||||
|
(EFI_PHYSICAL_ADDRESS *)&Argument4
|
||||||
|
);
|
||||||
|
|
||||||
|
DisableSMAP ();
|
||||||
|
*(EFI_PHYSICAL_ADDRESS *)UserRsp->Arguments[4] = (EFI_PHYSICAL_ADDRESS)Argument4;
|
||||||
|
EnableSMAP ();
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
case SysCallFreePages:
|
||||||
|
//
|
||||||
|
// Argument 1: EFI_PHYSICAL_ADDRESS Memory
|
||||||
|
// Argument 2: UINTN NumberOfPages
|
||||||
|
//
|
||||||
|
return gBS->FreePages (
|
||||||
|
(EFI_PHYSICAL_ADDRESS)CoreRbp->Argument1,
|
||||||
|
CoreRbp->Argument2
|
||||||
|
);
|
||||||
|
|
||||||
|
case SysCallRaiseTpl:
|
||||||
|
//
|
||||||
|
// Argument 1: EFI_TPL NewTpl
|
||||||
|
//
|
||||||
|
return (EFI_STATUS)gBS->RaiseTPL (
|
||||||
|
(EFI_TPL)CoreRbp->Argument1
|
||||||
|
);
|
||||||
|
|
||||||
|
case SysCallRestoreTpl:
|
||||||
|
//
|
||||||
|
// Argument 1: EFI_TPL NewTpl
|
||||||
|
//
|
||||||
|
gBS->RestoreTPL ((EFI_TPL)CoreRbp->Argument1);
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
|
||||||
case SysCallBlockIoReset:
|
case SysCallBlockIoReset:
|
||||||
//
|
//
|
||||||
// Argument 1: EFI_BLOCK_IO_PROTOCOL *This
|
// Argument 1: EFI_BLOCK_IO_PROTOCOL *This
|
||||||
|
@ -2018,10 +2018,12 @@ typedef enum {
|
|||||||
SysCallLocateProtocol,
|
SysCallLocateProtocol,
|
||||||
SysCallOpenProtocol,
|
SysCallOpenProtocol,
|
||||||
SysCallInstallMultipleProtocolInterfaces,
|
SysCallInstallMultipleProtocolInterfaces,
|
||||||
SysCallAllocatePool,
|
|
||||||
SysCallFreePool,
|
|
||||||
SysCallCloseProtocol,
|
SysCallCloseProtocol,
|
||||||
SysCallHandleProtocol,
|
SysCallHandleProtocol,
|
||||||
|
SysCallAllocatePages,
|
||||||
|
SysCallFreePages,
|
||||||
|
SysCallRaiseTpl,
|
||||||
|
SysCallRestoreTpl,
|
||||||
//
|
//
|
||||||
// Protocols
|
// Protocols
|
||||||
//
|
//
|
||||||
|
Loading…
x
Reference in New Issue
Block a user