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 IN OUT EFI_PHYSICAL_ADDRESS *Memory
); );
EFI_STATUS
EFIAPI
AllocateRing3Pages (
IN UINTN NumberOfPages,
IN OUT VOID **Memory
);
/** /**
Frees previous allocated pages. Frees previous allocated pages.
@ -1359,7 +1366,7 @@ CoreLoadImage (
@retval EFI_SUCCESS The image has been unloaded. @retval EFI_SUCCESS The image has been unloaded.
@retval EFI_UNSUPPORTED The image has been started, and does not support @retval EFI_UNSUPPORTED The image has been started, and does not support
unload. 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 EFI_STATUS

View File

@ -89,7 +89,8 @@ EFI_BOOT_SERVICES mBootServices = {
(EFI_CALCULATE_CRC32)CoreEfiNotAvailableYetArg3, // CalculateCrc32 (EFI_CALCULATE_CRC32)CoreEfiNotAvailableYetArg3, // CalculateCrc32
(EFI_COPY_MEM)CopyMem, // CopyMem (EFI_COPY_MEM)CopyMem, // CopyMem
(EFI_SET_MEM)SetMem, // SetMem (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 = { EFI_DXE_SERVICES mDxeServices = {

View File

@ -1565,6 +1565,27 @@ CoreLoadImage (
return Status; 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. Transfer control to a loaded image's entry point.
@ -1972,7 +1993,7 @@ Done:
@retval EFI_SUCCESS The image has been unloaded. @retval EFI_SUCCESS The image has been unloaded.
@retval EFI_UNSUPPORTED The image has been started, and does not support @retval EFI_UNSUPPORTED The image has been started, and does not support
unload. 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 EFI_STATUS

View File

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

View File

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