Ring3: Added helper function AllocateRing3Pages() and

draft of Ring3LocateProtocol().
This commit is contained in:
Mikhail Krichanov 2024-01-26 17:01:01 +03:00
parent 633521d91f
commit 87a397740d
5 changed files with 116 additions and 42 deletions

View File

@ -1173,6 +1173,13 @@ CoreAllocatePages (
IN OUT EFI_PHYSICAL_ADDRESS *Memory
);
EFI_STATUS
EFIAPI
AllocateRing3Pages (
IN UINTN NumberOfPages,
IN OUT VOID **Memory
);
/**
Frees previous allocated pages.
@ -1359,7 +1366,7 @@ CoreLoadImage (
@retval EFI_SUCCESS The image has been unloaded.
@retval EFI_UNSUPPORTED The image has been started, and does not support
unload.
@retval EFI_INVALID_PARAMPETER ImageHandle is not a valid image handle.
@retval EFI_INVALID_PARAMETER ImageHandle is not a valid image handle.
**/
EFI_STATUS

View File

@ -89,7 +89,8 @@ EFI_BOOT_SERVICES mBootServices = {
(EFI_CALCULATE_CRC32)CoreEfiNotAvailableYetArg3, // CalculateCrc32
(EFI_COPY_MEM)CopyMem, // CopyMem
(EFI_SET_MEM)SetMem, // SetMem
(EFI_CREATE_EVENT_EX)CoreCreateEventEx // CreateEventEx
(EFI_CREATE_EVENT_EX)CoreCreateEventEx, // CreateEventEx
(EFI_ALLOCATE_RING3_PAGES)AllocateRing3Pages
};
EFI_DXE_SERVICES mDxeServices = {

View File

@ -1565,6 +1565,27 @@ CoreLoadImage (
return Status;
}
EFI_STATUS
EFIAPI
AllocateRing3Pages (
IN UINTN NumberOfPages,
IN OUT VOID **Memory
)
{
if (Memory == NULL) {
return EFI_INVALID_PARAMETER;
}
*Memory = AllocatePages (NumberOfPages);
if (*Memory == NULL) {
return EFI_OUT_OF_RESOURCES;
}
SetUefiImageMemoryAttributes ((UINTN)*Memory, EFI_PAGES_TO_SIZE (NumberOfPages), EFI_MEMORY_USER);
return EFI_SUCCESS;
}
/**
Transfer control to a loaded image's entry point.
@ -1972,7 +1993,7 @@ Done:
@retval EFI_SUCCESS The image has been unloaded.
@retval EFI_UNSUPPORTED The image has been started, and does not support
unload.
@retval EFI_INVALID_PARAMPETER ImageHandle is not a valid image handle.
@retval EFI_INVALID_PARAMETER ImageHandle is not a valid image handle.
**/
EFI_STATUS

View File

@ -213,6 +213,13 @@ EFI_STATUS
IN OUT EFI_PHYSICAL_ADDRESS *Memory
);
typedef
EFI_STATUS
(EFIAPI *EFI_ALLOCATE_RING3_PAGES)(
IN UINTN Pages,
IN OUT VOID **Memory
);
/**
Frees memory pages.
@ -2011,6 +2018,7 @@ typedef struct {
EFI_COPY_MEM CopyMem;
EFI_SET_MEM SetMem;
EFI_CREATE_EVENT_EX CreateEventEx;
EFI_ALLOCATE_RING3_PAGES AllocateRing3Pages;
} EFI_BOOT_SERVICES;
///

View File

@ -11,6 +11,8 @@
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Protocol/DevicePathUtilities.h>
#include "Ring3.h"
EFI_BOOT_SERVICES mBootServices = {
@ -64,12 +66,14 @@ EFI_BOOT_SERVICES mBootServices = {
(EFI_CALCULATE_CRC32)Ring3CalculateCrc32, // CalculateCrc32
(EFI_COPY_MEM)CopyMem, // CopyMem
(EFI_SET_MEM)SetMem, // SetMem
(EFI_CREATE_EVENT_EX)Ring3CreateEventEx // CreateEventEx
(EFI_CREATE_EVENT_EX)Ring3CreateEventEx, // CreateEventEx
};
EFI_BOOT_SERVICES *gBS = &mBootServices;
EFI_BOOT_SERVICES *mCoreBS = NULL;
EFI_DEVICE_PATH_UTILITIES_PROTOCOL *mCoreDevicePathUtilitiesProtocol = NULL;
/**
The function constructs Ring 3 wrappers for the EFI_BOOT_SERVICES.
@ -126,7 +130,7 @@ Ring3AllocatePages (
IN OUT EFI_PHYSICAL_ADDRESS *Memory
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -136,7 +140,7 @@ Ring3FreePages (
IN UINTN NumberOfPages
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -149,7 +153,7 @@ Ring3GetMemoryMap (
OUT UINT32 *DescriptorVersion
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -160,7 +164,7 @@ Ring3AllocatePool (
OUT VOID **Buffer
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -169,7 +173,7 @@ Ring3FreePool (
IN VOID *Buffer
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -182,7 +186,7 @@ Ring3CreateEvent (
OUT EFI_EVENT *Event
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -193,7 +197,7 @@ Ring3SetTimer (
IN UINT64 TriggerTime
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -204,7 +208,7 @@ Ring3WaitForEvent (
OUT UINTN *UserIndex
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -213,7 +217,7 @@ Ring3SignalEvent (
IN EFI_EVENT UserEvent
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -222,7 +226,7 @@ Ring3CloseEvent (
IN EFI_EVENT UserEvent
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -231,7 +235,7 @@ Ring3CheckEvent (
IN EFI_EVENT UserEvent
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -243,7 +247,7 @@ Ring3InstallProtocolInterface (
IN VOID *Interface
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -255,7 +259,7 @@ Ring3ReinstallProtocolInterface (
IN VOID *NewInterface
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -266,7 +270,7 @@ Ring3UninstallProtocolInterface (
IN VOID *Interface
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -277,7 +281,7 @@ Ring3HandleProtocol (
OUT VOID **Interface
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -288,7 +292,7 @@ Ring3RegisterProtocolNotify (
OUT VOID **Registration
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -301,7 +305,7 @@ Ring3LocateHandle (
OUT EFI_HANDLE *Buffer
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -312,7 +316,7 @@ Ring3LocateDevicePath (
OUT EFI_HANDLE *Device
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -322,7 +326,7 @@ Ring3InstallConfigurationTable (
IN VOID *Table
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -336,7 +340,7 @@ Ring3LoadImage (
OUT EFI_HANDLE *ImageHandle
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -347,7 +351,7 @@ Ring3StartImage (
OUT CHAR16 **ExitData OPTIONAL
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -359,7 +363,7 @@ Ring3Exit (
IN CHAR16 *ExitData OPTIONAL
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -368,7 +372,7 @@ Ring3UnloadImage (
IN EFI_HANDLE ImageHandle
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -378,7 +382,7 @@ Ring3ExitBootServices (
IN UINTN MapKey
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -387,7 +391,7 @@ Ring3GetNextMonotonicCount (
OUT UINT64 *Count
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -396,7 +400,7 @@ Ring3Stall (
IN UINTN Microseconds
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -408,7 +412,7 @@ Ring3SetWatchdogTimer (
IN CHAR16 *WatchdogData OPTIONAL
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -420,7 +424,7 @@ Ring3ConnectController (
IN BOOLEAN Recursive
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -431,7 +435,7 @@ Ring3DisconnectController (
IN EFI_HANDLE ChildHandle OPTIONAL
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -445,7 +449,7 @@ Ring3OpenProtocol (
IN UINT32 Attributes
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -457,7 +461,7 @@ Ring3CloseProtocol (
IN EFI_HANDLE ControllerHandle
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -469,7 +473,7 @@ Ring3OpenProtocolInformation (
OUT UINTN *EntryCount
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -480,7 +484,7 @@ Ring3ProtocolsPerHandle (
OUT UINTN *ProtocolBufferCount
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -493,7 +497,7 @@ Ring3LocateHandleBuffer (
OUT EFI_HANDLE **Buffer
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -512,6 +516,39 @@ Ring3LocateProtocol (
Registration,
Interface
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "Ring3: Failed to loacate protocol %g\n", Protocol));
return Status;
}
if (CompareGuid (Protocol, &gEfiDevicePathUtilitiesProtocolGuid)) {
EFI_DEVICE_PATH_UTILITIES_PROTOCOL *UserProtocol;
mCoreDevicePathUtilitiesProtocol = (EFI_DEVICE_PATH_UTILITIES_PROTOCOL *)*Interface;
Status = (EFI_STATUS)SysCall (
(UINTN)mCoreBS + OFFSET_OF (EFI_BOOT_SERVICES, AllocateRing3Pages),
EFI_SIZE_TO_PAGES (sizeof (EFI_DEVICE_PATH_UTILITIES_PROTOCOL)),
(VOID **)&UserProtocol
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "Ring3: Failed to allocate pages for Ring3\n"));
return Status;
}
UserProtocol->GetDevicePathSize = NULL;
UserProtocol->DuplicateDevicePath = NULL;
UserProtocol->AppendDevicePath = NULL;
UserProtocol->AppendDeviceNode = NULL;
UserProtocol->AppendDevicePathInstance = NULL;
UserProtocol->GetNextDevicePathInstance = NULL;
UserProtocol->IsDevicePathMultiInstance = NULL;
UserProtocol->CreateDeviceNode = NULL;
*Interface = UserProtocol;
return Status;
}
return Status;
}
@ -523,7 +560,7 @@ Ring3InstallMultipleProtocolInterfaces (
...
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -533,7 +570,7 @@ Ring3UninstallMultipleProtocolInterfaces (
...
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -544,7 +581,7 @@ Ring3CalculateCrc32 (
OUT UINT32 *Crc32
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}
EFI_STATUS
@ -558,5 +595,5 @@ Ring3CreateEventEx (
OUT EFI_EVENT *Event
)
{
return EFI_SUCCESS;
return EFI_UNSUPPORTED;
}