Ring3: Renamed Ring3 as UserSpace.

This commit is contained in:
Mikhail Krichanov 2025-02-03 13:49:40 +03:00
parent d8ae7a16fa
commit 0b89bd57bb
29 changed files with 631 additions and 620 deletions

View File

@ -115,7 +115,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#define DEPEX_STACK_SIZE_INCREMENT 0x1000
#define STACK_SIZE 0x20000
#define RING3_INTERFACES_PAGES 20
#define USER_SPACE_INTERFACES_PAGES 20
typedef struct {
EFI_GUID *ProtocolGuid;
@ -279,9 +279,9 @@ extern EFI_LOAD_FIXED_ADDRESS_CONFIGURATION_TABLE gLoadModuleAtFixAddressConfig
extern BOOLEAN gLoadFixedAddressCodeMemoryReady;
extern LOADED_IMAGE_PRIVATE_DATA * mCurrentImage;
extern RING3_DATA *gRing3Data;
extern VOID *gRing3Interfaces;
extern VOID *gRing3EntryPoint;
extern USER_SPACE_DATA *gUserSpaceData;
extern VOID *gUserSpaceInterfaces;
extern VOID *gUserSpaceEntryPoint;
extern UINTN gUserPageTable;
extern UINTN gCorePageTable;
extern LIST_ENTRY gUserSpaceDriversHead;
@ -2753,7 +2753,7 @@ ForbidSupervisorAccessToUserMemory (
EFI_STATUS
EFIAPI
GoToRing3 (
GoToUserSpace (
IN UINT8 Number,
IN VOID *EntryPoint,
IN USER_SPACE_DRIVER *UserDriver,
@ -2762,7 +2762,7 @@ GoToRing3 (
EFI_STATUS
EFIAPI
InitializeRing3 (
InitializeUserSpace (
IN EFI_HANDLE ImageHandle,
IN LOADED_IMAGE_PRIVATE_DATA *Image
);

View File

@ -245,7 +245,7 @@ DxeMain (
EFI_VECTOR_HANDOFF_INFO *VectorInfoList;
EFI_VECTOR_HANDOFF_INFO *VectorInfo;
gRing3Data = NULL;
gUserSpaceData = NULL;
gUserPageTable = 0;
//
@ -767,28 +767,28 @@ CoreExitBootServices (
EFI_STATUS Status;
//
// Free resources allocated for Ring3.
// Free resources allocated for UserSpace.
//
if (gRing3Data != NULL) {
if (gUserSpaceData != NULL) {
AllowSupervisorAccessToUserMemory ();
if (gRing3Data->SystemTable.ConfigurationTable != NULL) {
if (gUserSpaceData->SystemTable.ConfigurationTable != NULL) {
CoreFreePages (
(EFI_PHYSICAL_ADDRESS)(UINTN)gRing3Data->SystemTable.ConfigurationTable,
EFI_SIZE_TO_PAGES (gRing3Data->SystemTable.NumberOfTableEntries * sizeof (EFI_CONFIGURATION_TABLE))
(EFI_PHYSICAL_ADDRESS)(UINTN)gUserSpaceData->SystemTable.ConfigurationTable,
EFI_SIZE_TO_PAGES (gUserSpaceData->SystemTable.NumberOfTableEntries * sizeof (EFI_CONFIGURATION_TABLE))
);
}
ForbidSupervisorAccessToUserMemory ();
CoreFreePages (
(EFI_PHYSICAL_ADDRESS)(UINTN)gRing3Data,
EFI_SIZE_TO_PAGES (sizeof (RING3_DATA))
(EFI_PHYSICAL_ADDRESS)(UINTN)gUserSpaceData,
EFI_SIZE_TO_PAGES (sizeof (USER_SPACE_DATA))
);
gRing3Data = NULL;
gUserSpaceData = NULL;
CoreFreePages (
(EFI_PHYSICAL_ADDRESS)(UINTN)gRing3Interfaces,
RING3_INTERFACES_PAGES
(EFI_PHYSICAL_ADDRESS)(UINTN)gUserSpaceInterfaces,
USER_SPACE_INTERFACES_PAGES
);
FreeProtocolsList ();

View File

@ -1,11 +1,11 @@
//------------------------------------------------------------------------------
// Copyright (c) 2024, Mikhail Krichanov. All rights reserved.
// Copyright (c) 2024 - 2025, Mikhail Krichanov. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
//------------------------------------------------------------------------------
#include <AsmMacroIoLibV8.h>
.extern ASM_PFX(Ring3Call)
.extern ASM_PFX(UserSpaceCall)
//------------------------------------------------------------------------------
// EFI_STATUS
@ -23,11 +23,11 @@ ASM_FUNC(SysCall)
//------------------------------------------------------------------------------
// VOID
// EFIAPI
// Ring3EntryPoint (
// IN RING3_CALL_DATA *Data
// UserSpaceEntryPoint (
// IN USER_SPACE_CALL_DATA *Data
// );
//
// (x0) Data
//------------------------------------------------------------------------------
ASM_FUNC(Ring3EntryPoint)
b ASM_PFX(Ring3Call)
ASM_FUNC(UserSpaceEntryPoint)
b ASM_PFX(UserSpaceCall)

View File

@ -1,11 +1,11 @@
//------------------------------------------------------------------------------
// Copyright (c) 2024, Mikhail Krichanov. All rights reserved.
// Copyright (c) 2024 - 2025, Mikhail Krichanov. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
//------------------------------------------------------------------------------
#include <AsmMacroIoLib.h>
.extern ASM_PFX(Ring3Call)
.extern ASM_PFX(UserSpaceCall)
//------------------------------------------------------------------------------
// EFI_STATUS
@ -23,11 +23,11 @@ ASM_FUNC(SysCall)
//------------------------------------------------------------------------------
// VOID
// EFIAPI
// Ring3EntryPoint (
// IN RING3_CALL_DATA *Data
// UserSpaceEntryPoint (
// IN USER_SPACE_CALL_DATA *Data
// );
//
// (r0) Data
//------------------------------------------------------------------------------
ASM_FUNC(Ring3EntryPoint)
b ASM_PFX(Ring3Call)
ASM_FUNC(UserSpaceEntryPoint)
b ASM_PFX(UserSpaceCall)

View File

@ -1,6 +1,8 @@
/** @file
This driver constructs User space wrappers for the EFI_BOOT_SERVICES,
EFI_RUNTIME_SERVICES and EFI_*_PROTOCOLs.
Copyright (c) 2024, Mikhail Krichanov. All rights reserved.
Copyright (c) 2024 - 2025, Mikhail Krichanov. All rights reserved.
SPDX-License-Identifier: BSD-3-Clause
**/
@ -15,86 +17,86 @@
EFI_BOOT_SERVICES mBootServices = {
{
EFI_BOOT_SERVICES_SIGNATURE, // Signature
EFI_BOOT_SERVICES_REVISION, // Revision
sizeof (EFI_BOOT_SERVICES), // HeaderSize
0, // CRC32
0 // Reserved
EFI_BOOT_SERVICES_SIGNATURE, // Signature
EFI_BOOT_SERVICES_REVISION, // Revision
sizeof (EFI_BOOT_SERVICES), // HeaderSize
0, // CRC32
0 // Reserved
},
(EFI_RAISE_TPL)Ring3RaiseTpl, // RaiseTPL
(EFI_RESTORE_TPL)Ring3RestoreTpl, // RestoreTPL
(EFI_ALLOCATE_PAGES)Ring3AllocatePages, // AllocatePages
(EFI_FREE_PAGES)Ring3FreePages, // FreePages
(EFI_GET_MEMORY_MAP)Ring3GetMemoryMap, // GetMemoryMap
(EFI_ALLOCATE_POOL)Ring3AllocatePool, // AllocatePool
(EFI_FREE_POOL)Ring3FreePool, // FreePool
(EFI_CREATE_EVENT)Ring3CreateEvent, // CreateEvent
(EFI_SET_TIMER)Ring3SetTimer, // SetTimer
(EFI_WAIT_FOR_EVENT)Ring3WaitForEvent, // WaitForEvent
(EFI_SIGNAL_EVENT)Ring3SignalEvent, // SignalEvent
(EFI_CLOSE_EVENT)Ring3CloseEvent, // CloseEvent
(EFI_CHECK_EVENT)Ring3CheckEvent, // CheckEvent
(EFI_INSTALL_PROTOCOL_INTERFACE)Ring3InstallProtocolInterface, // InstallProtocolInterface
(EFI_REINSTALL_PROTOCOL_INTERFACE)Ring3ReinstallProtocolInterface, // ReinstallProtocolInterface
(EFI_UNINSTALL_PROTOCOL_INTERFACE)Ring3UninstallProtocolInterface, // UninstallProtocolInterface
(EFI_HANDLE_PROTOCOL)Ring3HandleProtocol, // HandleProtocol
(VOID *)NULL, // Reserved
(EFI_REGISTER_PROTOCOL_NOTIFY)Ring3RegisterProtocolNotify, // RegisterProtocolNotify
(EFI_LOCATE_HANDLE)Ring3LocateHandle, // LocateHandle
(EFI_LOCATE_DEVICE_PATH)Ring3LocateDevicePath, // LocateDevicePath
(EFI_INSTALL_CONFIGURATION_TABLE)Ring3InstallConfigurationTable, // InstallConfigurationTable
(EFI_IMAGE_LOAD)Ring3LoadImage, // LoadImage
(EFI_IMAGE_START)Ring3StartImage, // StartImage
(EFI_EXIT)Ring3Exit, // Exit
(EFI_IMAGE_UNLOAD)Ring3UnloadImage, // UnloadImage
(EFI_EXIT_BOOT_SERVICES)Ring3ExitBootServices, // ExitBootServices
(EFI_GET_NEXT_MONOTONIC_COUNT)Ring3GetNextMonotonicCount, // GetNextMonotonicCount
(EFI_STALL)Ring3Stall, // Stall
(EFI_SET_WATCHDOG_TIMER)Ring3SetWatchdogTimer, // SetWatchdogTimer
(EFI_CONNECT_CONTROLLER)Ring3ConnectController, // ConnectController
(EFI_DISCONNECT_CONTROLLER)Ring3DisconnectController, // DisconnectController
(EFI_OPEN_PROTOCOL)Ring3OpenProtocol, // OpenProtocol
(EFI_CLOSE_PROTOCOL)Ring3CloseProtocol, // CloseProtocol
(EFI_OPEN_PROTOCOL_INFORMATION)Ring3OpenProtocolInformation, // OpenProtocolInformation
(EFI_PROTOCOLS_PER_HANDLE)Ring3ProtocolsPerHandle, // ProtocolsPerHandle
(EFI_LOCATE_HANDLE_BUFFER)Ring3LocateHandleBuffer, // LocateHandleBuffer
(EFI_LOCATE_PROTOCOL)Ring3LocateProtocol, // LocateProtocol
(EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES)Ring3InstallMultipleProtocolInterfaces, // InstallMultipleProtocolInterfaces
(EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES)Ring3UninstallMultipleProtocolInterfaces, // UninstallMultipleProtocolInterfaces
(EFI_CALCULATE_CRC32)Ring3CalculateCrc32, // CalculateCrc32
(EFI_COPY_MEM)CopyMem, // CopyMem
(EFI_SET_MEM)SetMem, // SetMem
(EFI_CREATE_EVENT_EX)Ring3CreateEventEx, // CreateEventEx
(EFI_RAISE_TPL)UserSpaceRaiseTpl, // RaiseTPL
(EFI_RESTORE_TPL)UserSpaceRestoreTpl, // RestoreTPL
(EFI_ALLOCATE_PAGES)UserSpaceAllocatePages, // AllocatePages
(EFI_FREE_PAGES)UserSpaceFreePages, // FreePages
(EFI_GET_MEMORY_MAP)UserSpaceGetMemoryMap, // GetMemoryMap
(EFI_ALLOCATE_POOL)UserSpaceAllocatePool, // AllocatePool
(EFI_FREE_POOL)UserSpaceFreePool, // FreePool
(EFI_CREATE_EVENT)UserSpaceCreateEvent, // CreateEvent
(EFI_SET_TIMER)UserSpaceSetTimer, // SetTimer
(EFI_WAIT_FOR_EVENT)UserSpaceWaitForEvent, // WaitForEvent
(EFI_SIGNAL_EVENT)UserSpaceSignalEvent, // SignalEvent
(EFI_CLOSE_EVENT)UserSpaceCloseEvent, // CloseEvent
(EFI_CHECK_EVENT)UserSpaceCheckEvent, // CheckEvent
(EFI_INSTALL_PROTOCOL_INTERFACE)UserSpaceInstallProtocolInterface, // InstallProtocolInterface
(EFI_REINSTALL_PROTOCOL_INTERFACE)UserSpaceReinstallProtocolInterface, // ReinstallProtocolInterface
(EFI_UNINSTALL_PROTOCOL_INTERFACE)UserSpaceUninstallProtocolInterface, // UninstallProtocolInterface
(EFI_HANDLE_PROTOCOL)UserSpaceHandleProtocol, // HandleProtocol
(VOID *)NULL, // Reserved
(EFI_REGISTER_PROTOCOL_NOTIFY)UserSpaceRegisterProtocolNotify, // RegisterProtocolNotify
(EFI_LOCATE_HANDLE)UserSpaceLocateHandle, // LocateHandle
(EFI_LOCATE_DEVICE_PATH)UserSpaceLocateDevicePath, // LocateDevicePath
(EFI_INSTALL_CONFIGURATION_TABLE)UserSpaceInstallConfigurationTable, // InstallConfigurationTable
(EFI_IMAGE_LOAD)UserSpaceLoadImage, // LoadImage
(EFI_IMAGE_START)UserSpaceStartImage, // StartImage
(EFI_EXIT)UserSpaceExit, // Exit
(EFI_IMAGE_UNLOAD)UserSpaceUnloadImage, // UnloadImage
(EFI_EXIT_BOOT_SERVICES)UserSpaceExitBootServices, // ExitBootServices
(EFI_GET_NEXT_MONOTONIC_COUNT)UserSpaceGetNextMonotonicCount, // GetNextMonotonicCount
(EFI_STALL)UserSpaceStall, // Stall
(EFI_SET_WATCHDOG_TIMER)UserSpaceSetWatchdogTimer, // SetWatchdogTimer
(EFI_CONNECT_CONTROLLER)UserSpaceConnectController, // ConnectController
(EFI_DISCONNECT_CONTROLLER)UserSpaceDisconnectController, // DisconnectController
(EFI_OPEN_PROTOCOL)UserSpaceOpenProtocol, // OpenProtocol
(EFI_CLOSE_PROTOCOL)UserSpaceCloseProtocol, // CloseProtocol
(EFI_OPEN_PROTOCOL_INFORMATION)UserSpaceOpenProtocolInformation, // OpenProtocolInformation
(EFI_PROTOCOLS_PER_HANDLE)UserSpaceProtocolsPerHandle, // ProtocolsPerHandle
(EFI_LOCATE_HANDLE_BUFFER)UserSpaceLocateHandleBuffer, // LocateHandleBuffer
(EFI_LOCATE_PROTOCOL)UserSpaceLocateProtocol, // LocateProtocol
(EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES)UserSpaceInstallMultipleProtocolInterfaces, // InstallMultipleProtocolInterfaces
(EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES)UserSpaceUninstallMultipleProtocolInterfaces, // UninstallMultipleProtocolInterfaces
(EFI_CALCULATE_CRC32)UserSpaceCalculateCrc32, // CalculateCrc32
(EFI_COPY_MEM)CopyMem, // CopyMem
(EFI_SET_MEM)SetMem, // SetMem
(EFI_CREATE_EVENT_EX)UserSpaceCreateEventEx, // CreateEventEx
};
EFI_RUNTIME_SERVICES mRuntimeServices = {
{
EFI_RUNTIME_SERVICES_SIGNATURE, // Signature
EFI_RUNTIME_SERVICES_REVISION, // Revision
sizeof (EFI_RUNTIME_SERVICES), // HeaderSize
0, // CRC32
0 // Reserved
EFI_RUNTIME_SERVICES_SIGNATURE, // Signature
EFI_RUNTIME_SERVICES_REVISION, // Revision
sizeof (EFI_RUNTIME_SERVICES), // HeaderSize
0, // CRC32
0 // Reserved
},
(EFI_GET_TIME)Ring3GetTime, // GetTime
(EFI_SET_TIME)Ring3SetTime, // SetTime
(EFI_GET_WAKEUP_TIME)Ring3GetWakeupTime, // GetWakeupTime
(EFI_SET_WAKEUP_TIME)Ring3SetWakeupTime, // SetWakeupTime
(EFI_SET_VIRTUAL_ADDRESS_MAP)Ring3SetVirtualAddressMap, // SetVirtualAddressMap
(EFI_CONVERT_POINTER)Ring3ConvertPointer, // ConvertPointer
(EFI_GET_VARIABLE)Ring3GetVariable, // GetVariable
(EFI_GET_NEXT_VARIABLE_NAME)Ring3GetNextVariableName, // GetNextVariableName
(EFI_SET_VARIABLE)Ring3SetVariable, // SetVariable
(EFI_GET_NEXT_HIGH_MONO_COUNT)Ring3GetNextHighMonotonicCount, // GetNextHighMonotonicCount
(EFI_RESET_SYSTEM)Ring3ResetSystem, // ResetSystem
(EFI_UPDATE_CAPSULE)Ring3UpdateCapsule, // UpdateCapsule
(EFI_QUERY_CAPSULE_CAPABILITIES)Ring3QueryCapsuleCapabilities, // QueryCapsuleCapabilities
(EFI_QUERY_VARIABLE_INFO)Ring3QueryVariableInfo // QueryVariableInfo
(EFI_GET_TIME)UserSpaceGetTime, // GetTime
(EFI_SET_TIME)UserSpaceSetTime, // SetTime
(EFI_GET_WAKEUP_TIME)UserSpaceGetWakeupTime, // GetWakeupTime
(EFI_SET_WAKEUP_TIME)UserSpaceSetWakeupTime, // SetWakeupTime
(EFI_SET_VIRTUAL_ADDRESS_MAP)UserSpaceSetVirtualAddressMap, // SetVirtualAddressMap
(EFI_CONVERT_POINTER)UserSpaceConvertPointer, // ConvertPointer
(EFI_GET_VARIABLE)UserSpaceGetVariable, // GetVariable
(EFI_GET_NEXT_VARIABLE_NAME)UserSpaceGetNextVariableName, // GetNextVariableName
(EFI_SET_VARIABLE)UserSpaceSetVariable, // SetVariable
(EFI_GET_NEXT_HIGH_MONO_COUNT)UserSpaceGetNextHighMonotonicCount, // GetNextHighMonotonicCount
(EFI_RESET_SYSTEM)UserSpaceResetSystem, // ResetSystem
(EFI_UPDATE_CAPSULE)UserSpaceUpdateCapsule, // UpdateCapsule
(EFI_QUERY_CAPSULE_CAPABILITIES)UserSpaceQueryCapsuleCapabilities, // QueryCapsuleCapabilities
(EFI_QUERY_VARIABLE_INFO)UserSpaceQueryVariableInfo // QueryVariableInfo
};
VOID
EFIAPI
Ring3EntryPoint (
IN RING3_CALL_DATA *Data
UserSpaceEntryPoint (
IN USER_SPACE_CALL_DATA *Data
);
typedef
@ -181,8 +183,8 @@ EFI_STATUS
VOID
EFIAPI
Ring3Call (
IN RING3_CALL_DATA *Data
UserSpaceCall (
IN USER_SPACE_CALL_DATA *Data
)
{
EFI_STATUS Status;
@ -243,18 +245,18 @@ Ring3Call (
EFI_STATUS
EFIAPI
Ring3Initialization (
UserSpaceInitialization (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
RING3_DATA *Ring3Data;
USER_SPACE_DATA *UserSpaceData;
Ring3Data = (RING3_DATA *)SystemTable;
UserSpaceData = (USER_SPACE_DATA *)SystemTable;
Ring3Data->EntryPoint = (VOID *)Ring3EntryPoint;
Ring3Data->BootServices = &mBootServices;
Ring3Data->RuntimeServices = &mRuntimeServices;
UserSpaceData->EntryPoint = (VOID *)UserSpaceEntryPoint;
UserSpaceData->BootServices = &mBootServices;
UserSpaceData->RuntimeServices = &mRuntimeServices;
gBS = &mBootServices;
gRT = &mRuntimeServices;

View File

@ -1,6 +1,6 @@
## @file
#
# Ring3 driver for SysCalls.
# UserSpace driver for SysCalls.
#
# Copyright (c) 2024, Mikhail Krichanov. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
@ -13,7 +13,7 @@
FILE_GUID = 88EA50C2-0DEA-4F13-B691-B506554E632B
MODULE_TYPE = DXE_DRIVER
VERSION_STRING = 1.0
ENTRY_POINT = Ring3Initialization
ENTRY_POINT = UserSpaceInitialization
#
# The following information is for reference only and not required by the build tools.

View File

@ -1,11 +1,11 @@
;------------------------------------------------------------------------------
; Copyright (c) 2024, Mikhail Krichanov. All rights reserved.
; Copyright (c) 2024 - 2025, Mikhail Krichanov. All rights reserved.
; SPDX-License-Identifier: BSD-3-Clause
;------------------------------------------------------------------------------
#include <Uefi/UefiSpec.h>
extern ASM_PFX(Ring3Call)
extern ASM_PFX(UserSpaceCall)
DEFAULT REL
SECTION .text
@ -49,14 +49,14 @@ userReturnAddress:
;------------------------------------------------------------------------------
; VOID
; EFIAPI
; Ring3EntryPoint (
; IN RING3_CALL_DATA *Data
; UserSpaceEntryPoint (
; IN USER_SPACE_CALL_DATA *Data
; );
;
; (eax) Data
;------------------------------------------------------------------------------
global ASM_PFX(Ring3EntryPoint)
ASM_PFX(Ring3EntryPoint):
global ASM_PFX(UserSpaceEntryPoint)
ASM_PFX(UserSpaceEntryPoint):
push eax
call ASM_PFX(Ring3Call)
call ASM_PFX(UserSpaceCall)

View File

@ -1,6 +1,6 @@
/** @file
Copyright (c) 2024, Mikhail Krichanov. All rights reserved.
Copyright (c) 2024 - 2025, Mikhail Krichanov. All rights reserved.
SPDX-License-Identifier: BSD-3-Clause
**/
@ -30,7 +30,7 @@ SysCall (
**/
EFI_TPL
EFIAPI
Ring3RaiseTpl (
UserSpaceRaiseTpl (
IN EFI_TPL NewTpl
);
@ -43,7 +43,7 @@ Ring3RaiseTpl (
**/
VOID
EFIAPI
Ring3RestoreTpl (
UserSpaceRestoreTpl (
IN EFI_TPL NewTpl
);
@ -67,7 +67,7 @@ Ring3RestoreTpl (
**/
EFI_STATUS
EFIAPI
Ring3AllocatePages (
UserSpaceAllocatePages (
IN EFI_ALLOCATE_TYPE Type,
IN EFI_MEMORY_TYPE MemoryType,
IN UINTN NumberOfPages,
@ -87,7 +87,7 @@ Ring3AllocatePages (
**/
EFI_STATUS
EFIAPI
Ring3FreePages (
UserSpaceFreePages (
IN EFI_PHYSICAL_ADDRESS Memory,
IN UINTN NumberOfPages
);
@ -124,7 +124,7 @@ Ring3FreePages (
**/
EFI_STATUS
EFIAPI
Ring3GetMemoryMap (
UserSpaceGetMemoryMap (
IN OUT UINTN *MemoryMapSize,
IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap,
OUT UINTN *MapKey,
@ -149,7 +149,7 @@ Ring3GetMemoryMap (
**/
EFI_STATUS
EFIAPI
Ring3AllocatePool (
UserSpaceAllocatePool (
IN EFI_MEMORY_TYPE PoolType,
IN UINTN Size,
OUT VOID **Buffer
@ -166,7 +166,7 @@ Ring3AllocatePool (
**/
EFI_STATUS
EFIAPI
Ring3FreePool (
UserSpaceFreePool (
IN VOID *Buffer
);
@ -190,7 +190,7 @@ Ring3FreePool (
**/
EFI_STATUS
EFIAPI
Ring3CreateEvent (
UserSpaceCreateEvent (
IN UINT32 Type,
IN EFI_TPL NotifyTpl,
IN EFI_EVENT_NOTIFY NotifyFunction OPTIONAL,
@ -215,7 +215,7 @@ Ring3CreateEvent (
**/
EFI_STATUS
EFIAPI
Ring3SetTimer (
UserSpaceSetTimer (
IN EFI_EVENT UserEvent,
IN EFI_TIMER_DELAY Type,
IN UINT64 TriggerTime
@ -237,7 +237,7 @@ Ring3SetTimer (
**/
EFI_STATUS
EFIAPI
Ring3WaitForEvent (
UserSpaceWaitForEvent (
IN UINTN NumberOfEvents,
IN EFI_EVENT *UserEvents,
OUT UINTN *UserIndex
@ -254,7 +254,7 @@ Ring3WaitForEvent (
**/
EFI_STATUS
EFIAPI
Ring3SignalEvent (
UserSpaceSignalEvent (
IN EFI_EVENT UserEvent
);
@ -269,7 +269,7 @@ Ring3SignalEvent (
**/
EFI_STATUS
EFIAPI
Ring3CloseEvent (
UserSpaceCloseEvent (
IN EFI_EVENT UserEvent
);
@ -285,7 +285,7 @@ Ring3CloseEvent (
**/
EFI_STATUS
EFIAPI
Ring3CheckEvent (
UserSpaceCheckEvent (
IN EFI_EVENT UserEvent
);
@ -305,7 +305,7 @@ Ring3CheckEvent (
**/
EFI_STATUS
EFIAPI
Ring3InstallProtocolInterface (
UserSpaceInstallProtocolInterface (
IN OUT EFI_HANDLE *UserHandle,
IN EFI_GUID *Protocol,
IN EFI_INTERFACE_TYPE InterfaceType,
@ -328,7 +328,7 @@ Ring3InstallProtocolInterface (
**/
EFI_STATUS
EFIAPI
Ring3ReinstallProtocolInterface (
UserSpaceReinstallProtocolInterface (
IN EFI_HANDLE UserHandle,
IN EFI_GUID *Protocol,
IN VOID *OldInterface,
@ -350,7 +350,7 @@ Ring3ReinstallProtocolInterface (
**/
EFI_STATUS
EFIAPI
Ring3UninstallProtocolInterface (
UserSpaceUninstallProtocolInterface (
IN EFI_HANDLE UserHandle,
IN EFI_GUID *Protocol,
IN VOID *Interface
@ -369,7 +369,7 @@ Ring3UninstallProtocolInterface (
**/
EFI_STATUS
EFIAPI
Ring3HandleProtocol (
UserSpaceHandleProtocol (
IN EFI_HANDLE UserHandle,
IN EFI_GUID *Protocol,
OUT VOID **Interface
@ -390,7 +390,7 @@ Ring3HandleProtocol (
**/
EFI_STATUS
EFIAPI
Ring3RegisterProtocolNotify (
UserSpaceRegisterProtocolNotify (
IN EFI_GUID *Protocol,
IN EFI_EVENT Event,
OUT VOID **Registration
@ -416,7 +416,7 @@ Ring3RegisterProtocolNotify (
**/
EFI_STATUS
EFIAPI
Ring3LocateHandle (
UserSpaceLocateHandle (
IN EFI_LOCATE_SEARCH_TYPE SearchType,
IN EFI_GUID *Protocol OPTIONAL,
IN VOID *SearchKey OPTIONAL,
@ -441,7 +441,7 @@ Ring3LocateHandle (
**/
EFI_STATUS
EFIAPI
Ring3LocateDevicePath (
UserSpaceLocateDevicePath (
IN EFI_GUID *Protocol,
IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath,
OUT EFI_HANDLE *Device
@ -464,7 +464,7 @@ Ring3LocateDevicePath (
**/
EFI_STATUS
EFIAPI
Ring3InstallConfigurationTable (
UserSpaceInstallConfigurationTable (
IN EFI_GUID *Guid,
IN VOID *Table
);
@ -505,7 +505,7 @@ Ring3InstallConfigurationTable (
**/
EFI_STATUS
EFIAPI
Ring3LoadImage (
UserSpaceLoadImage (
IN BOOLEAN BootPolicy,
IN EFI_HANDLE ParentImageHandle,
IN EFI_DEVICE_PATH_PROTOCOL *FilePath,
@ -535,7 +535,7 @@ Ring3LoadImage (
**/
EFI_STATUS
EFIAPI
Ring3StartImage (
UserSpaceStartImage (
IN EFI_HANDLE ImageHandle,
OUT UINTN *ExitDataSize,
OUT CHAR16 **ExitData OPTIONAL
@ -566,7 +566,7 @@ Ring3StartImage (
**/
EFI_STATUS
EFIAPI
Ring3Exit (
UserSpaceExit (
IN EFI_HANDLE ImageHandle,
IN EFI_STATUS Status,
IN UINTN ExitDataSize,
@ -587,7 +587,7 @@ Ring3Exit (
**/
EFI_STATUS
EFIAPI
Ring3UnloadImage (
UserSpaceUnloadImage (
IN EFI_HANDLE ImageHandle
);
@ -603,7 +603,7 @@ Ring3UnloadImage (
**/
EFI_STATUS
EFIAPI
Ring3ExitBootServices (
UserSpaceExitBootServices (
IN EFI_HANDLE ImageHandle,
IN UINTN MapKey
);
@ -620,7 +620,7 @@ Ring3ExitBootServices (
**/
EFI_STATUS
EFIAPI
Ring3GetNextMonotonicCount (
UserSpaceGetNextMonotonicCount (
OUT UINT64 *Count
);
@ -636,7 +636,7 @@ Ring3GetNextMonotonicCount (
**/
EFI_STATUS
EFIAPI
Ring3Stall (
UserSpaceStall (
IN UINTN Microseconds
);
@ -664,7 +664,7 @@ Ring3Stall (
**/
EFI_STATUS
EFIAPI
Ring3SetWatchdogTimer (
UserSpaceSetWatchdogTimer (
IN UINTN Timeout,
IN UINT64 WatchdogCode,
IN UINTN DataSize,
@ -699,7 +699,7 @@ Ring3SetWatchdogTimer (
**/
EFI_STATUS
EFIAPI
Ring3ConnectController (
UserSpaceConnectController (
IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE *DriverImageHandle OPTIONAL,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL,
@ -740,7 +740,7 @@ Ring3ConnectController (
**/
EFI_STATUS
EFIAPI
Ring3DisconnectController (
UserSpaceDisconnectController (
IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE DriverImageHandle OPTIONAL,
IN EFI_HANDLE ChildHandle OPTIONAL
@ -768,7 +768,7 @@ Ring3DisconnectController (
**/
EFI_STATUS
EFIAPI
Ring3OpenProtocol (
UserSpaceOpenProtocol (
IN EFI_HANDLE UserHandle,
IN EFI_GUID *Protocol,
OUT VOID **Interface OPTIONAL,
@ -804,7 +804,7 @@ Ring3OpenProtocol (
**/
EFI_STATUS
EFIAPI
Ring3CloseProtocol (
UserSpaceCloseProtocol (
IN EFI_HANDLE UserHandle,
IN EFI_GUID *Protocol,
IN EFI_HANDLE AgentHandle,
@ -824,7 +824,7 @@ Ring3CloseProtocol (
**/
EFI_STATUS
EFIAPI
Ring3OpenProtocolInformation (
UserSpaceOpenProtocolInformation (
IN EFI_HANDLE UserHandle,
IN EFI_GUID *Protocol,
OUT EFI_OPEN_PROTOCOL_INFORMATION_ENTRY **EntryBuffer,
@ -856,7 +856,7 @@ Ring3OpenProtocolInformation (
**/
EFI_STATUS
EFIAPI
Ring3ProtocolsPerHandle (
UserSpaceProtocolsPerHandle (
IN EFI_HANDLE UserHandle,
OUT EFI_GUID ***ProtocolBuffer,
OUT UINTN *ProtocolBufferCount
@ -864,7 +864,7 @@ Ring3ProtocolsPerHandle (
/**
Function returns an array of handles that support the requested protocol
in a buffer allocated from pool. This is a version of Ring3LocateHandle()
in a buffer allocated from pool. This is a version of UserSpaceLocateHandle()
that allocates a buffer for the caller.
@param SearchType Specifies which handle(s) are to be returned.
@ -886,7 +886,7 @@ Ring3ProtocolsPerHandle (
**/
EFI_STATUS
EFIAPI
Ring3LocateHandleBuffer (
UserSpaceLocateHandleBuffer (
IN EFI_LOCATE_SEARCH_TYPE SearchType,
IN EFI_GUID *Protocol OPTIONAL,
IN VOID *SearchKey OPTIONAL,
@ -912,7 +912,7 @@ Ring3LocateHandleBuffer (
**/
EFI_STATUS
EFIAPI
Ring3LocateProtocol (
UserSpaceLocateProtocol (
IN EFI_GUID *Protocol,
IN VOID *Registration OPTIONAL,
OUT VOID **Interface
@ -941,7 +941,7 @@ Ring3LocateProtocol (
**/
EFI_STATUS
EFIAPI
Ring3InstallMultipleProtocolInterfaces (
UserSpaceInstallMultipleProtocolInterfaces (
IN OUT EFI_HANDLE *Handle,
...
);
@ -962,7 +962,7 @@ Ring3InstallMultipleProtocolInterfaces (
**/
EFI_STATUS
EFIAPI
Ring3UninstallMultipleProtocolInterfaces (
UserSpaceUninstallMultipleProtocolInterfaces (
IN EFI_HANDLE Handle,
...
);
@ -984,7 +984,7 @@ Ring3UninstallMultipleProtocolInterfaces (
**/
EFI_STATUS
EFIAPI
Ring3CalculateCrc32 (
UserSpaceCalculateCrc32 (
IN VOID *Data,
IN UINTN DataSize,
OUT UINT32 *Crc32
@ -1012,7 +1012,7 @@ Ring3CalculateCrc32 (
**/
EFI_STATUS
EFIAPI
Ring3CreateEventEx (
UserSpaceCreateEventEx (
IN UINT32 Type,
IN EFI_TPL NotifyTpl,
IN EFI_EVENT_NOTIFY NotifyFunction OPTIONAL,
@ -1034,7 +1034,7 @@ Ring3CreateEventEx (
**/
EFI_STATUS
EFIAPI
Ring3BlockIoReset (
UserSpaceBlockIoReset (
IN EFI_BLOCK_IO_PROTOCOL *This,
IN BOOLEAN ExtendedVerification
);
@ -1060,7 +1060,7 @@ Ring3BlockIoReset (
**/
EFI_STATUS
EFIAPI
Ring3BlockIoRead (
UserSpaceBlockIoRead (
IN EFI_BLOCK_IO_PROTOCOL *This,
IN UINT32 MediaId,
IN EFI_LBA Lba,
@ -1090,7 +1090,7 @@ Ring3BlockIoRead (
**/
EFI_STATUS
EFIAPI
Ring3BlockIoWrite (
UserSpaceBlockIoWrite (
IN EFI_BLOCK_IO_PROTOCOL *This,
IN UINT32 MediaId,
IN EFI_LBA Lba,
@ -1110,7 +1110,7 @@ Ring3BlockIoWrite (
**/
EFI_STATUS
EFIAPI
Ring3BlockIoFlush (
UserSpaceBlockIoFlush (
IN EFI_BLOCK_IO_PROTOCOL *This
);
@ -1133,7 +1133,7 @@ Ring3BlockIoFlush (
**/
EFI_STATUS
EFIAPI
Ring3DiskIoRead (
UserSpaceDiskIoRead (
IN EFI_DISK_IO_PROTOCOL *This,
IN UINT32 MediaId,
IN UINT64 Offset,
@ -1161,7 +1161,7 @@ Ring3DiskIoRead (
**/
EFI_STATUS
EFIAPI
Ring3DiskIoWrite (
UserSpaceDiskIoWrite (
IN EFI_DISK_IO_PROTOCOL *This,
IN UINT32 MediaId,
IN UINT64 Offset,
@ -1184,7 +1184,7 @@ Ring3DiskIoWrite (
**/
EFI_STATUS
EFIAPI
Ring3GetTime (
UserSpaceGetTime (
OUT EFI_TIME *Time,
OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
);
@ -1201,7 +1201,7 @@ Ring3GetTime (
**/
EFI_STATUS
EFIAPI
Ring3SetTime (
UserSpaceSetTime (
IN EFI_TIME *Time
);
@ -1222,7 +1222,7 @@ Ring3SetTime (
**/
EFI_STATUS
EFIAPI
Ring3GetWakeupTime (
UserSpaceGetWakeupTime (
OUT BOOLEAN *Enabled,
OUT BOOLEAN *Pending,
OUT EFI_TIME *Time
@ -1244,7 +1244,7 @@ Ring3GetWakeupTime (
**/
EFI_STATUS
EFIAPI
Ring3SetWakeupTime (
UserSpaceSetWakeupTime (
IN BOOLEAN Enable,
IN EFI_TIME *Time OPTIONAL
);
@ -1270,7 +1270,7 @@ Ring3SetWakeupTime (
**/
EFI_STATUS
EFIAPI
Ring3SetVirtualAddressMap (
UserSpaceSetVirtualAddressMap (
IN UINTN MemoryMapSize,
IN UINTN DescriptorSize,
IN UINT32 DescriptorVersion,
@ -1294,7 +1294,7 @@ Ring3SetVirtualAddressMap (
**/
EFI_STATUS
EFIAPI
Ring3ConvertPointer (
UserSpaceConvertPointer (
IN UINTN DebugDisposition,
IN OUT VOID **Address
);
@ -1325,7 +1325,7 @@ Ring3ConvertPointer (
**/
EFI_STATUS
EFIAPI
Ring3GetVariable (
UserSpaceGetVariable (
IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid,
OUT UINT32 *Attributes OPTIONAL,
@ -1361,7 +1361,7 @@ Ring3GetVariable (
**/
EFI_STATUS
EFIAPI
Ring3GetNextVariableName (
UserSpaceGetNextVariableName (
IN OUT UINTN *VariableNameSize,
IN OUT CHAR16 *VariableName,
IN OUT EFI_GUID *VendorGuid
@ -1403,7 +1403,7 @@ Ring3GetNextVariableName (
**/
EFI_STATUS
EFIAPI
Ring3SetVariable (
UserSpaceSetVariable (
IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid,
IN UINT32 Attributes,
@ -1423,7 +1423,7 @@ Ring3SetVariable (
**/
EFI_STATUS
EFIAPI
Ring3GetNextHighMonotonicCount (
UserSpaceGetNextHighMonotonicCount (
OUT UINT32 *HighCount
);
@ -1444,7 +1444,7 @@ Ring3GetNextHighMonotonicCount (
**/
VOID
EFIAPI
Ring3ResetSystem (
UserSpaceResetSystem (
IN EFI_RESET_TYPE ResetType,
IN EFI_STATUS ResetStatus,
IN UINTN DataSize,
@ -1483,7 +1483,7 @@ Ring3ResetSystem (
**/
EFI_STATUS
EFIAPI
Ring3UpdateCapsule (
UserSpaceUpdateCapsule (
IN EFI_CAPSULE_HEADER **CapsuleHeaderArray,
IN UINTN CapsuleCount,
IN EFI_PHYSICAL_ADDRESS ScatterGatherList OPTIONAL
@ -1514,7 +1514,7 @@ Ring3UpdateCapsule (
**/
EFI_STATUS
EFIAPI
Ring3QueryCapsuleCapabilities (
UserSpaceQueryCapsuleCapabilities (
IN EFI_CAPSULE_HEADER **CapsuleHeaderArray,
IN UINTN CapsuleCount,
OUT UINT64 *MaximumCapsuleSize,
@ -1545,7 +1545,7 @@ Ring3QueryCapsuleCapabilities (
**/
EFI_STATUS
EFIAPI
Ring3QueryVariableInfo (
UserSpaceQueryVariableInfo (
IN UINT32 Attributes,
OUT UINT64 *MaximumVariableStorageSize,
OUT UINT64 *RemainingVariableStorageSize,
@ -1566,7 +1566,7 @@ Ring3QueryVariableInfo (
**/
INTN
EFIAPI
Ring3UnicodeStriColl (
UserSpaceUnicodeStriColl (
IN EFI_UNICODE_COLLATION_PROTOCOL *This,
IN CHAR16 *Str1,
IN CHAR16 *Str2
@ -1586,7 +1586,7 @@ Ring3UnicodeStriColl (
**/
BOOLEAN
EFIAPI
Ring3UnicodeMetaiMatch (
UserSpaceUnicodeMetaiMatch (
IN EFI_UNICODE_COLLATION_PROTOCOL *This,
IN CHAR16 *String,
IN CHAR16 *Pattern
@ -1602,7 +1602,7 @@ Ring3UnicodeMetaiMatch (
**/
VOID
EFIAPI
Ring3UnicodeStrLwr (
UserSpaceUnicodeStrLwr (
IN EFI_UNICODE_COLLATION_PROTOCOL *This,
IN OUT CHAR16 *Str
);
@ -1617,7 +1617,7 @@ Ring3UnicodeStrLwr (
**/
VOID
EFIAPI
Ring3UnicodeStrUpr (
UserSpaceUnicodeStrUpr (
IN EFI_UNICODE_COLLATION_PROTOCOL *This,
IN OUT CHAR16 *Str
);
@ -1636,7 +1636,7 @@ Ring3UnicodeStrUpr (
**/
VOID
EFIAPI
Ring3UnicodeFatToStr (
UserSpaceUnicodeFatToStr (
IN EFI_UNICODE_COLLATION_PROTOCOL *This,
IN UINTN FatSize,
IN CHAR8 *Fat,
@ -1659,7 +1659,7 @@ Ring3UnicodeFatToStr (
**/
BOOLEAN
EFIAPI
Ring3UnicodeStrToFat (
UserSpaceUnicodeStrToFat (
IN EFI_UNICODE_COLLATION_PROTOCOL *This,
IN CHAR16 *String,
IN UINTN FatSize,

View File

@ -1,6 +1,7 @@
/** @file
This driver constructs User space wrappers for the EFI_*_PROTOCOLs.
Copyright (c) 2024, Mikhail Krichanov. All rights reserved.
Copyright (c) 2024 - 2025, Mikhail Krichanov. All rights reserved.
SPDX-License-Identifier: BSD-3-Clause
**/
@ -9,7 +10,7 @@
EFI_STATUS
EFIAPI
Ring3BlockIoReset (
UserSpaceBlockIoReset (
IN EFI_BLOCK_IO_PROTOCOL *This,
IN BOOLEAN ExtendedVerification
)
@ -24,7 +25,7 @@ Ring3BlockIoReset (
EFI_STATUS
EFIAPI
Ring3BlockIoRead (
UserSpaceBlockIoRead (
IN EFI_BLOCK_IO_PROTOCOL *This,
IN UINT32 MediaId,
IN EFI_LBA Lba,
@ -45,7 +46,7 @@ Ring3BlockIoRead (
EFI_STATUS
EFIAPI
Ring3BlockIoWrite (
UserSpaceBlockIoWrite (
IN EFI_BLOCK_IO_PROTOCOL *This,
IN UINT32 MediaId,
IN EFI_LBA Lba,
@ -66,7 +67,7 @@ Ring3BlockIoWrite (
EFI_STATUS
EFIAPI
Ring3BlockIoFlush (
UserSpaceBlockIoFlush (
IN EFI_BLOCK_IO_PROTOCOL *This
)
{
@ -79,7 +80,7 @@ Ring3BlockIoFlush (
EFI_STATUS
EFIAPI
Ring3DiskIoRead (
UserSpaceDiskIoRead (
IN EFI_DISK_IO_PROTOCOL *This,
IN UINT32 MediaId,
IN UINT64 Offset,
@ -100,7 +101,7 @@ Ring3DiskIoRead (
EFI_STATUS
EFIAPI
Ring3DiskIoWrite (
UserSpaceDiskIoWrite (
IN EFI_DISK_IO_PROTOCOL *This,
IN UINT32 MediaId,
IN UINT64 Offset,
@ -121,7 +122,7 @@ Ring3DiskIoWrite (
INTN
EFIAPI
Ring3UnicodeStriColl (
UserSpaceUnicodeStriColl (
IN EFI_UNICODE_COLLATION_PROTOCOL *This,
IN CHAR16 *Str1,
IN CHAR16 *Str2
@ -138,7 +139,7 @@ Ring3UnicodeStriColl (
BOOLEAN
EFIAPI
Ring3UnicodeMetaiMatch (
UserSpaceUnicodeMetaiMatch (
IN EFI_UNICODE_COLLATION_PROTOCOL *This,
IN CHAR16 *String,
IN CHAR16 *Pattern
@ -155,7 +156,7 @@ Ring3UnicodeMetaiMatch (
VOID
EFIAPI
Ring3UnicodeStrLwr (
UserSpaceUnicodeStrLwr (
IN EFI_UNICODE_COLLATION_PROTOCOL *This,
IN OUT CHAR16 *Str
)
@ -170,7 +171,7 @@ Ring3UnicodeStrLwr (
VOID
EFIAPI
Ring3UnicodeStrUpr (
UserSpaceUnicodeStrUpr (
IN EFI_UNICODE_COLLATION_PROTOCOL *This,
IN OUT CHAR16 *Str
)
@ -185,7 +186,7 @@ Ring3UnicodeStrUpr (
VOID
EFIAPI
Ring3UnicodeFatToStr (
UserSpaceUnicodeFatToStr (
IN EFI_UNICODE_COLLATION_PROTOCOL *This,
IN UINTN FatSize,
IN CHAR8 *Fat,
@ -204,7 +205,7 @@ Ring3UnicodeFatToStr (
BOOLEAN
EFIAPI
Ring3UnicodeStrToFat (
UserSpaceUnicodeStrToFat (
IN EFI_UNICODE_COLLATION_PROTOCOL *This,
IN CHAR16 *String,
IN UINTN FatSize,

View File

@ -1,7 +1,7 @@
/** @file
This driver constructs Ring 3 wrappers for the EFI_BOOT_SERVICES.
This driver constructs User space wrappers for the EFI_BOOT_SERVICES.
Copyright (c) 2024, Mikhail Krichanov. All rights reserved.
Copyright (c) 2024 - 2025, Mikhail Krichanov. All rights reserved.
SPDX-License-Identifier: BSD-3-Clause
**/
@ -73,17 +73,17 @@ FixInterface (
BlockIo = (EFI_BLOCK_IO_PROTOCOL *)*Interface;
BlockIo->Reset = Ring3BlockIoReset;
BlockIo->ReadBlocks = Ring3BlockIoRead;
BlockIo->WriteBlocks = Ring3BlockIoWrite;
BlockIo->FlushBlocks = Ring3BlockIoFlush;
BlockIo->Reset = UserSpaceBlockIoReset;
BlockIo->ReadBlocks = UserSpaceBlockIoRead;
BlockIo->WriteBlocks = UserSpaceBlockIoWrite;
BlockIo->FlushBlocks = UserSpaceBlockIoFlush;
} else if (CompareGuid (Protocol, &gEfiDiskIoProtocolGuid)) {
DiskIo = (EFI_DISK_IO_PROTOCOL *)*Interface;
DiskIo->ReadDisk = Ring3DiskIoRead;
DiskIo->WriteDisk = Ring3DiskIoWrite;
DiskIo->ReadDisk = UserSpaceDiskIoRead;
DiskIo->WriteDisk = UserSpaceDiskIoWrite;
} else if (CompareGuid (Protocol, &gEfiDevicePathUtilitiesProtocolGuid)) {
DevicePath = (EFI_DEVICE_PATH_UTILITIES_PROTOCOL *)*Interface;
@ -100,12 +100,12 @@ FixInterface (
} else if (CompareGuid (Protocol, &gEfiUnicodeCollationProtocolGuid)) {
Unicode = (EFI_UNICODE_COLLATION_PROTOCOL *)*Interface;
Unicode->StriColl = Ring3UnicodeStriColl;
Unicode->MetaiMatch = Ring3UnicodeMetaiMatch;
Unicode->StrLwr = Ring3UnicodeStrLwr;
Unicode->StrUpr = Ring3UnicodeStrUpr;
Unicode->FatToStr = Ring3UnicodeFatToStr;
Unicode->StrToFat = Ring3UnicodeStrToFat;
Unicode->StriColl = UserSpaceUnicodeStriColl;
Unicode->MetaiMatch = UserSpaceUnicodeMetaiMatch;
Unicode->StrLwr = UserSpaceUnicodeStrLwr;
Unicode->StrUpr = UserSpaceUnicodeStrUpr;
Unicode->FatToStr = UserSpaceUnicodeFatToStr;
Unicode->StrToFat = UserSpaceUnicodeStrToFat;
} else {
return EFI_UNSUPPORTED;
@ -116,7 +116,7 @@ FixInterface (
EFI_TPL
EFIAPI
Ring3RaiseTpl (
UserSpaceRaiseTpl (
IN EFI_TPL NewTpl
)
{
@ -129,7 +129,7 @@ Ring3RaiseTpl (
VOID
EFIAPI
Ring3RestoreTpl (
UserSpaceRestoreTpl (
IN EFI_TPL NewTpl
)
{
@ -142,7 +142,7 @@ Ring3RestoreTpl (
EFI_STATUS
EFIAPI
Ring3AllocatePages (
UserSpaceAllocatePages (
IN EFI_ALLOCATE_TYPE Type,
IN EFI_MEMORY_TYPE MemoryType,
IN UINTN NumberOfPages,
@ -155,12 +155,12 @@ Ring3AllocatePages (
SysCallAllocatePages,
4,
Type,
EfiRing3MemoryType,
EfiUserSpaceMemoryType,
NumberOfPages,
Memory
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "Ring3: Failed to allocate %d pages.\n", NumberOfPages));
DEBUG ((DEBUG_ERROR, "UserSpace: Failed to allocate %d pages.\n", NumberOfPages));
}
return Status;
@ -168,7 +168,7 @@ Ring3AllocatePages (
EFI_STATUS
EFIAPI
Ring3FreePages (
UserSpaceFreePages (
IN EFI_PHYSICAL_ADDRESS Memory,
IN UINTN NumberOfPages
)
@ -182,7 +182,7 @@ Ring3FreePages (
Memory
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "Ring3: Failed to free %d pages.\n", NumberOfPages));
DEBUG ((DEBUG_ERROR, "UserSpace: Failed to free %d pages.\n", NumberOfPages));
}
return Status;
@ -190,7 +190,7 @@ Ring3FreePages (
EFI_STATUS
EFIAPI
Ring3GetMemoryMap (
UserSpaceGetMemoryMap (
IN OUT UINTN *MemoryMapSize,
IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap,
OUT UINTN *MapKey,
@ -198,14 +198,14 @@ Ring3GetMemoryMap (
OUT UINT32 *DescriptorVersion
)
{
DEBUG ((DEBUG_ERROR, "Ring3: GetMemoryMap is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: GetMemoryMap is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3AllocatePool (
UserSpaceAllocatePool (
IN EFI_MEMORY_TYPE PoolType,
IN UINTN Size,
OUT VOID **Buffer
@ -222,7 +222,7 @@ Ring3AllocatePool (
EFI_STATUS
EFIAPI
Ring3FreePool (
UserSpaceFreePool (
IN VOID *Buffer
)
{
@ -231,7 +231,7 @@ Ring3FreePool (
EFI_STATUS
EFIAPI
Ring3CreateEvent (
UserSpaceCreateEvent (
IN UINT32 Type,
IN EFI_TPL NotifyTpl,
IN EFI_EVENT_NOTIFY NotifyFunction OPTIONAL,
@ -239,114 +239,114 @@ Ring3CreateEvent (
OUT EFI_EVENT *Event
)
{
DEBUG ((DEBUG_ERROR, "Ring3: CreateEvent is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: CreateEvent is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3SetTimer (
UserSpaceSetTimer (
IN EFI_EVENT UserEvent,
IN EFI_TIMER_DELAY Type,
IN UINT64 TriggerTime
)
{
DEBUG ((DEBUG_ERROR, "Ring3: SetTimer is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: SetTimer is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3WaitForEvent (
UserSpaceWaitForEvent (
IN UINTN NumberOfEvents,
IN EFI_EVENT *UserEvents,
OUT UINTN *UserIndex
)
{
DEBUG ((DEBUG_ERROR, "Ring3: WaitForEvent is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: WaitForEvent is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3SignalEvent (
UserSpaceSignalEvent (
IN EFI_EVENT UserEvent
)
{
DEBUG ((DEBUG_ERROR, "Ring3: SignalEvent is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: SignalEvent is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3CloseEvent (
UserSpaceCloseEvent (
IN EFI_EVENT UserEvent
)
{
DEBUG ((DEBUG_ERROR, "Ring3: CloseEvent is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: CloseEvent is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3CheckEvent (
UserSpaceCheckEvent (
IN EFI_EVENT UserEvent
)
{
DEBUG ((DEBUG_ERROR, "Ring3: CheckEvent is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: CheckEvent is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3InstallProtocolInterface (
UserSpaceInstallProtocolInterface (
IN OUT EFI_HANDLE *UserHandle,
IN EFI_GUID *Protocol,
IN EFI_INTERFACE_TYPE InterfaceType,
IN VOID *Interface
)
{
DEBUG ((DEBUG_ERROR, "Ring3: InstallProtocolInterface is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: InstallProtocolInterface is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3ReinstallProtocolInterface (
UserSpaceReinstallProtocolInterface (
IN EFI_HANDLE UserHandle,
IN EFI_GUID *Protocol,
IN VOID *OldInterface,
IN VOID *NewInterface
)
{
DEBUG ((DEBUG_ERROR, "Ring3: ReinstallProtocolInterface is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: ReinstallProtocolInterface is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3UninstallProtocolInterface (
UserSpaceUninstallProtocolInterface (
IN EFI_HANDLE UserHandle,
IN EFI_GUID *Protocol,
IN VOID *Interface
)
{
DEBUG ((DEBUG_ERROR, "Ring3: UninstallProtocolInterface is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: UninstallProtocolInterface is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3HandleProtocol (
UserSpaceHandleProtocol (
IN EFI_HANDLE CoreUserHandle,
IN EFI_GUID *Protocol,
OUT VOID **Interface
@ -362,7 +362,7 @@ Ring3HandleProtocol (
Interface
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "Ring3: Failed to get handle of protocol %g - %r\n", Protocol, Status));
DEBUG ((DEBUG_ERROR, "UserSpace: Failed to get handle of protocol %g - %r\n", Protocol, Status));
return Status;
}
@ -371,20 +371,20 @@ Ring3HandleProtocol (
EFI_STATUS
EFIAPI
Ring3RegisterProtocolNotify (
UserSpaceRegisterProtocolNotify (
IN EFI_GUID *Protocol,
IN EFI_EVENT Event,
OUT VOID **Registration
)
{
DEBUG ((DEBUG_ERROR, "Ring3: RegisterProtocolNotify is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: RegisterProtocolNotify is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3LocateHandle (
UserSpaceLocateHandle (
IN EFI_LOCATE_SEARCH_TYPE SearchType,
IN EFI_GUID *Protocol OPTIONAL,
IN VOID *SearchKey OPTIONAL,
@ -392,39 +392,39 @@ Ring3LocateHandle (
OUT EFI_HANDLE *Buffer
)
{
DEBUG ((DEBUG_ERROR, "Ring3: LocateHandle is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: LocateHandle is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3LocateDevicePath (
UserSpaceLocateDevicePath (
IN EFI_GUID *Protocol,
IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath,
OUT EFI_HANDLE *Device
)
{
DEBUG ((DEBUG_ERROR, "Ring3: LocateDevicePath is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: LocateDevicePath is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3InstallConfigurationTable (
UserSpaceInstallConfigurationTable (
IN EFI_GUID *Guid,
IN VOID *Table
)
{
DEBUG ((DEBUG_ERROR, "Ring3: InstallConfigurationTable is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: InstallConfigurationTable is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3LoadImage (
UserSpaceLoadImage (
IN BOOLEAN BootPolicy,
IN EFI_HANDLE ParentImageHandle,
IN EFI_DEVICE_PATH_PROTOCOL *FilePath,
@ -433,127 +433,127 @@ Ring3LoadImage (
OUT EFI_HANDLE *ImageHandle
)
{
DEBUG ((DEBUG_ERROR, "Ring3: LoadImage is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: LoadImage is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3StartImage (
UserSpaceStartImage (
IN EFI_HANDLE ImageHandle,
OUT UINTN *ExitDataSize,
OUT CHAR16 **ExitData OPTIONAL
)
{
DEBUG ((DEBUG_ERROR, "Ring3: StartImage is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: StartImage is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3Exit (
UserSpaceExit (
IN EFI_HANDLE ImageHandle,
IN EFI_STATUS Status,
IN UINTN ExitDataSize,
IN CHAR16 *ExitData OPTIONAL
)
{
DEBUG ((DEBUG_ERROR, "Ring3: Exit is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: Exit is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3UnloadImage (
UserSpaceUnloadImage (
IN EFI_HANDLE ImageHandle
)
{
DEBUG ((DEBUG_ERROR, "Ring3: UnloadImage is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: UnloadImage is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3ExitBootServices (
UserSpaceExitBootServices (
IN EFI_HANDLE ImageHandle,
IN UINTN MapKey
)
{
DEBUG ((DEBUG_ERROR, "Ring3: ExitBootServices is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: ExitBootServices is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3GetNextMonotonicCount (
UserSpaceGetNextMonotonicCount (
OUT UINT64 *Count
)
{
DEBUG ((DEBUG_ERROR, "Ring3: GetNextMonotonicCount is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: GetNextMonotonicCount is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3Stall (
UserSpaceStall (
IN UINTN Microseconds
)
{
DEBUG ((DEBUG_ERROR, "Ring3: Stall is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: Stall is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3SetWatchdogTimer (
UserSpaceSetWatchdogTimer (
IN UINTN Timeout,
IN UINT64 WatchdogCode,
IN UINTN DataSize,
IN CHAR16 *WatchdogData OPTIONAL
)
{
DEBUG ((DEBUG_ERROR, "Ring3: SetWatchdogTimer is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: SetWatchdogTimer is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3ConnectController (
UserSpaceConnectController (
IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE *DriverImageHandle OPTIONAL,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL,
IN BOOLEAN Recursive
)
{
DEBUG ((DEBUG_ERROR, "Ring3: ConnectController is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: ConnectController is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3DisconnectController (
UserSpaceDisconnectController (
IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE DriverImageHandle OPTIONAL,
IN EFI_HANDLE ChildHandle OPTIONAL
)
{
DEBUG ((DEBUG_ERROR, "Ring3: DisconnectController is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: DisconnectController is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3OpenProtocol (
UserSpaceOpenProtocol (
IN EFI_HANDLE CoreUserHandle,
IN EFI_GUID *Protocol,
OUT VOID **Interface OPTIONAL,
@ -583,7 +583,7 @@ Ring3OpenProtocol (
EFI_STATUS
EFIAPI
Ring3CloseProtocol (
UserSpaceCloseProtocol (
IN EFI_HANDLE UserHandle,
IN EFI_GUID *Protocol,
IN EFI_HANDLE AgentHandle,
@ -602,34 +602,34 @@ Ring3CloseProtocol (
EFI_STATUS
EFIAPI
Ring3OpenProtocolInformation (
UserSpaceOpenProtocolInformation (
IN EFI_HANDLE UserHandle,
IN EFI_GUID *Protocol,
OUT EFI_OPEN_PROTOCOL_INFORMATION_ENTRY **EntryBuffer,
OUT UINTN *EntryCount
)
{
DEBUG ((DEBUG_ERROR, "Ring3: OpenProtocolInformation is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: OpenProtocolInformation is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3ProtocolsPerHandle (
UserSpaceProtocolsPerHandle (
IN EFI_HANDLE UserHandle,
OUT EFI_GUID ***ProtocolBuffer,
OUT UINTN *ProtocolBufferCount
)
{
DEBUG ((DEBUG_ERROR, "Ring3: ProtocolsPerHandle is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: ProtocolsPerHandle is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3LocateHandleBuffer (
UserSpaceLocateHandleBuffer (
IN EFI_LOCATE_SEARCH_TYPE SearchType,
IN EFI_GUID *Protocol OPTIONAL,
IN VOID *SearchKey OPTIONAL,
@ -656,14 +656,14 @@ Ring3LocateHandleBuffer (
&& (Buffer != NULL) && (*Buffer != NULL)) {
PoolSize = *NumberHandles * sizeof (EFI_HANDLE *);
Status = Ring3AllocatePool (EfiRing3MemoryType, PoolSize, &Pool);
Status = UserSpaceAllocatePool (EfiUserSpaceMemoryType, PoolSize, &Pool);
if (EFI_ERROR (Status)) {
return Status;
}
CopyMem (Pool, *Buffer, PoolSize);
Status = Ring3FreePages (
Status = UserSpaceFreePages (
(EFI_PHYSICAL_ADDRESS)(UINTN)*Buffer,
EFI_SIZE_TO_PAGES (PoolSize)
);
@ -679,7 +679,7 @@ Ring3LocateHandleBuffer (
EFI_STATUS
EFIAPI
Ring3LocateProtocol (
UserSpaceLocateProtocol (
IN EFI_GUID *Protocol,
IN VOID *CoreRegistration OPTIONAL,
OUT VOID **Interface
@ -695,7 +695,7 @@ Ring3LocateProtocol (
Interface
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "Ring3: Failed to loacate protocol %g\n", Protocol));
DEBUG ((DEBUG_ERROR, "UserSpace: Failed to loacate protocol %g\n", Protocol));
return Status;
}
@ -704,7 +704,7 @@ Ring3LocateProtocol (
EFI_STATUS
EFIAPI
Ring3InstallMultipleProtocolInterfaces (
UserSpaceInstallMultipleProtocolInterfaces (
IN OUT EFI_HANDLE *Handle,
...
)
@ -722,8 +722,8 @@ Ring3InstallMultipleProtocolInterfaces (
}
VA_END (Marker);
Status = Ring3AllocatePool (
EfiRing3MemoryType,
Status = UserSpaceAllocatePool (
EfiUserSpaceMemoryType,
NumberOfArguments * sizeof (VOID *),
(VOID **)&Arguments
);
@ -745,25 +745,25 @@ Ring3InstallMultipleProtocolInterfaces (
Arguments
);
Ring3FreePool (Arguments);
UserSpaceFreePool (Arguments);
return Status;
}
EFI_STATUS
EFIAPI
Ring3UninstallMultipleProtocolInterfaces (
UserSpaceUninstallMultipleProtocolInterfaces (
IN EFI_HANDLE Handle,
...
)
{
DEBUG ((DEBUG_ERROR, "Ring3: UninstallMultipleProtocolInterfaces is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: UninstallMultipleProtocolInterfaces is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3CalculateCrc32 (
UserSpaceCalculateCrc32 (
IN VOID *Data,
IN UINTN DataSize,
OUT UINT32 *Crc32
@ -780,7 +780,7 @@ Ring3CalculateCrc32 (
EFI_STATUS
EFIAPI
Ring3CreateEventEx (
UserSpaceCreateEventEx (
IN UINT32 Type,
IN EFI_TPL NotifyTpl,
IN EFI_EVENT_NOTIFY NotifyFunction OPTIONAL,
@ -789,7 +789,7 @@ Ring3CreateEventEx (
OUT EFI_EVENT *Event
)
{
DEBUG ((DEBUG_ERROR, "Ring3: CreateEventEx is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: CreateEventEx is not supported\n"));
return EFI_UNSUPPORTED;
}
@ -835,7 +835,7 @@ CoreAllocatePoolPagesI (
{
EFI_PHYSICAL_ADDRESS Memory;
Ring3AllocatePages (AllocateAnyPages, EfiRing3MemoryType, NoPages, &Memory);
UserSpaceAllocatePages (AllocateAnyPages, EfiUserSpaceMemoryType, NoPages, &Memory);
return (VOID *)(UINTN)Memory;
}
@ -847,7 +847,7 @@ CoreFreePoolPagesI (
IN UINTN NoPages
)
{
Ring3FreePages (Memory, NoPages);
UserSpaceFreePages (Memory, NoPages);
}
VOID
@ -857,5 +857,5 @@ CoreFreePoolPagesWithGuard (
IN UINTN NoPages
)
{
CoreFreePoolPagesI (EfiRing3MemoryType, Memory, NoPages);
CoreFreePoolPagesI (EfiUserSpaceMemoryType, Memory, NoPages);
}

View File

@ -1,3 +1,11 @@
/** @file
This driver constructs User space wrappers for the EFI_RUNTIME_SERVICES.
Copyright (c) 2024 - 2025, Mikhail Krichanov. All rights reserved.
SPDX-License-Identifier: BSD-3-Clause
**/
#include <Uefi.h>
#include <Library/BaseMemoryLib.h>
@ -7,81 +15,81 @@
EFI_STATUS
EFIAPI
Ring3GetTime (
UserSpaceGetTime (
OUT EFI_TIME *Time,
OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
)
{
DEBUG ((DEBUG_ERROR, "Ring3: GetTime is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: GetTime is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3SetTime (
UserSpaceSetTime (
IN EFI_TIME *Time
)
{
DEBUG ((DEBUG_ERROR, "Ring3: SetTime is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: SetTime is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3GetWakeupTime (
UserSpaceGetWakeupTime (
OUT BOOLEAN *Enabled,
OUT BOOLEAN *Pending,
OUT EFI_TIME *Time
)
{
DEBUG ((DEBUG_ERROR, "Ring3: GetWakeupTime is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: GetWakeupTime is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3SetWakeupTime (
UserSpaceSetWakeupTime (
IN BOOLEAN Enable,
IN EFI_TIME *Time OPTIONAL
)
{
DEBUG ((DEBUG_ERROR, "Ring3: SetWakeupTime is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: SetWakeupTime is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3SetVirtualAddressMap (
UserSpaceSetVirtualAddressMap (
IN UINTN MemoryMapSize,
IN UINTN DescriptorSize,
IN UINT32 DescriptorVersion,
IN EFI_MEMORY_DESCRIPTOR *VirtualMap
)
{
DEBUG ((DEBUG_ERROR, "Ring3: SetVirtualAddressMap is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: SetVirtualAddressMap is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3ConvertPointer (
UserSpaceConvertPointer (
IN UINTN DebugDisposition,
IN OUT VOID **Address
)
{
DEBUG ((DEBUG_ERROR, "Ring3: ConvertPointer is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: ConvertPointer is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3GetVariable (
UserSpaceGetVariable (
IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid,
OUT UINT32 *Attributes OPTIONAL,
@ -102,20 +110,20 @@ Ring3GetVariable (
EFI_STATUS
EFIAPI
Ring3GetNextVariableName (
UserSpaceGetNextVariableName (
IN OUT UINTN *VariableNameSize,
IN OUT CHAR16 *VariableName,
IN OUT EFI_GUID *VendorGuid
)
{
DEBUG ((DEBUG_ERROR, "Ring3: GetNextVariableName is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: GetNextVariableName is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3SetVariable (
UserSpaceSetVariable (
IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid,
IN UINT32 Attributes,
@ -123,73 +131,73 @@ Ring3SetVariable (
IN VOID *Data
)
{
DEBUG ((DEBUG_ERROR, "Ring3: SetVariable is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: SetVariable is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3GetNextHighMonotonicCount (
UserSpaceGetNextHighMonotonicCount (
OUT UINT32 *HighCount
)
{
DEBUG ((DEBUG_ERROR, "Ring3: GetNextHighMonotonicCount is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: GetNextHighMonotonicCount is not supported\n"));
return EFI_UNSUPPORTED;
}
VOID
EFIAPI
Ring3ResetSystem (
UserSpaceResetSystem (
IN EFI_RESET_TYPE ResetType,
IN EFI_STATUS ResetStatus,
IN UINTN DataSize,
IN VOID *ResetData OPTIONAL
)
{
DEBUG ((DEBUG_ERROR, "Ring3: ResetSystem is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: ResetSystem is not supported\n"));
return;
}
EFI_STATUS
EFIAPI
Ring3UpdateCapsule (
UserSpaceUpdateCapsule (
IN EFI_CAPSULE_HEADER **CapsuleHeaderArray,
IN UINTN CapsuleCount,
IN EFI_PHYSICAL_ADDRESS ScatterGatherList OPTIONAL
)
{
DEBUG ((DEBUG_ERROR, "Ring3: UpdateCapsule is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: UpdateCapsule is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3QueryCapsuleCapabilities (
UserSpaceQueryCapsuleCapabilities (
IN EFI_CAPSULE_HEADER **CapsuleHeaderArray,
IN UINTN CapsuleCount,
OUT UINT64 *MaximumCapsuleSize,
OUT EFI_RESET_TYPE *ResetType
)
{
DEBUG ((DEBUG_ERROR, "Ring3: QueryCapsuleCapabilities is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: QueryCapsuleCapabilities is not supported\n"));
return EFI_UNSUPPORTED;
}
EFI_STATUS
EFIAPI
Ring3QueryVariableInfo (
UserSpaceQueryVariableInfo (
IN UINT32 Attributes,
OUT UINT64 *MaximumVariableStorageSize,
OUT UINT64 *RemainingVariableStorageSize,
OUT UINT64 *MaximumVariableSize
)
{
DEBUG ((DEBUG_ERROR, "Ring3: QueryVariableInfo is not supported\n"));
DEBUG ((DEBUG_ERROR, "UserSpace: QueryVariableInfo is not supported\n"));
return EFI_UNSUPPORTED;
}

View File

@ -1,9 +1,9 @@
;------------------------------------------------------------------------------
; Copyright (c) 2024, Mikhail Krichanov. All rights reserved.
; Copyright (c) 2024 - 2025, Mikhail Krichanov. All rights reserved.
; SPDX-License-Identifier: BSD-3-Clause
;------------------------------------------------------------------------------
extern ASM_PFX(Ring3Call)
extern ASM_PFX(UserSpaceCall)
DEFAULT REL
SECTION .text
@ -43,15 +43,15 @@ makecall:
;------------------------------------------------------------------------------
; VOID
; EFIAPI
; Ring3EntryPoint (
; IN RING3_CALL_DATA *Data
; UserSpaceEntryPoint (
; IN USER_SPACE_CALL_DATA *Data
; );
;
; (rcx) RIP of Ring3EntryPoint saved for SYSRET in CallRing3().
; (rcx) RIP of UserSpaceEntryPoint saved for SYSRET in CallUserSpace().
; (rdx) Data
;------------------------------------------------------------------------------
global ASM_PFX(Ring3EntryPoint)
ASM_PFX(Ring3EntryPoint):
global ASM_PFX(UserSpaceEntryPoint)
ASM_PFX(UserSpaceEntryPoint):
mov rcx, rdx
call ASM_PFX(Ring3Call)
call ASM_PFX(UserSpaceCall)

View File

@ -23,7 +23,7 @@ typedef struct {
STATIC LIST_ENTRY mAvailableEmulators;
STATIC EFI_EVENT mPeCoffEmuProtocolRegistrationEvent;
STATIC VOID *mPeCoffEmuProtocolNotifyRegistration;
STATIC BOOLEAN mDxeRing3 = TRUE;
STATIC BOOLEAN mDxeUserSpace = TRUE;
extern BOOLEAN gBdsStarted;
@ -1349,12 +1349,12 @@ CoreLoadImageCommon (
Image->Info.ParentHandle = ParentImageHandle;
Image->IsUserImage = (FileAttributes & EFI_FV_FILE_ATTRIB_USER) != 0;
if ((!PcdGetBool (PcdEnableUserSpace)) && Image->IsUserImage && mDxeRing3) {
if ((!PcdGetBool (PcdEnableUserSpace)) && Image->IsUserImage && mDxeUserSpace) {
//
// Do not load DxeRing3 driver, if UserSpace is disabled.
// Do not load DxeUserSpace driver, if UserSpace is disabled.
//
mDxeRing3 = FALSE;
Status = EFI_NOT_STARTED;
mDxeUserSpace = FALSE;
Status = EFI_NOT_STARTED;
goto Done;
}
@ -1454,7 +1454,7 @@ CoreLoadImageCommon (
Status = EFI_SUCCESS;
ProtectUefiImage (&Image->Info, ImageOrigin, &ImageContext, Image->IsUserImage);
if (PcdGetBool (PcdEnableUserSpace) && (gRing3Data != NULL) && Image->IsUserImage) {
if (PcdGetBool (PcdEnableUserSpace) && (gUserSpaceData != NULL) && Image->IsUserImage) {
Image->UserPageTable = InitializeUserPageTable (Image);
}
@ -1708,8 +1708,8 @@ CoreStartImage (
Image->Started = TRUE;
if (PcdGetBool (PcdEnableUserSpace) && (Image->IsUserImage)) {
if (gRing3Data == NULL) {
Image->Status = InitializeRing3 (ImageHandle, Image);
if (gUserSpaceData == NULL) {
Image->Status = InitializeUserSpace (ImageHandle, Image);
if (EFI_ERROR (Image->Status)) {
DEBUG ((DEBUG_ERROR, "Core: Failed to initialize User address space - %r.\n", Image->Status));
CpuDeadLoop ();
@ -1729,12 +1729,12 @@ CoreStartImage (
InsertTailList (&gUserSpaceDriversHead, &UserDriver->Link);
Image->Status = GoToRing3 (
Image->Status = GoToUserSpace (
2,
(VOID *)Image->EntryPoint,
UserDriver,
ImageHandle,
gRing3Data
gUserSpaceData
);
} else {
Image->Status = EFI_OUT_OF_RESOURCES;
@ -1979,7 +1979,7 @@ CoreUnloadImage (
if (Image->Info.Unload != NULL) {
//
// TODO: If Image->IsUserImage, use FindInterface() to locate UserSpace
// EFI_LOADED_IMAGE_PROTOCOL->Unload() and GoToRing3().
// EFI_LOADED_IMAGE_PROTOCOL->Unload() and GoToUserSpace().
//
Status = Image->Info.Unload (ImageHandle);
}

View File

@ -63,7 +63,7 @@ EFI_MEMORY_TYPE_STATISTICS mMemoryTypeStatistics[EfiMaxMemoryType + 1] = {
{ 0, MAX_ALLOC_ADDRESS, 0, 0, EfiMaxMemoryType, TRUE, TRUE }, // EfiPalCode
{ 0, MAX_ALLOC_ADDRESS, 0, 0, EfiMaxMemoryType, FALSE, FALSE }, // EfiPersistentMemory
{ 0, MAX_ALLOC_ADDRESS, 0, 0, EfiMaxMemoryType, TRUE, FALSE }, // EfiUnacceptedMemoryType
{ 0, MAX_ALLOC_ADDRESS, 0, 0, EfiMaxMemoryType, FALSE, FALSE }, // EfiRing3MemoryType
{ 0, MAX_ALLOC_ADDRESS, 0, 0, EfiMaxMemoryType, FALSE, FALSE }, // EfiUserSpaceMemoryType
{ 0, MAX_ALLOC_ADDRESS, 0, 0, EfiMaxMemoryType, FALSE, FALSE } // EfiMaxMemoryType
};
@ -87,7 +87,7 @@ EFI_MEMORY_TYPE_INFORMATION gMemoryTypeInformation[EfiMaxMemoryType + 1] = {
{ EfiPalCode, 0 },
{ EfiPersistentMemory, 0 },
{ EfiGcdMemoryTypeUnaccepted, 0 },
{ EfiRing3MemoryType, 0 },
{ EfiUserSpaceMemoryType, 0 },
{ EfiMaxMemoryType, 0 }
};
//

View File

@ -342,7 +342,7 @@ GetPermissionAttributeForMemoryType (
Attributes |= EFI_MEMORY_XP;
}
if (MemoryType == EfiRing3MemoryType) {
if (MemoryType == EfiUserSpaceMemoryType) {
Attributes |= EFI_MEMORY_USER;
}
@ -974,7 +974,7 @@ ApplyMemoryProtectionPolicy (
return EFI_SUCCESS;
}
if ((gUserPageTable != 0) && (NewType == EfiRing3MemoryType)) {
if ((gUserPageTable != 0) && (NewType == EfiUserSpaceMemoryType)) {
gCpu->SetUserMemoryAttributes (gCpu, gUserPageTable, Memory, Length, NewAttributes);
}
} else {

View File

@ -59,17 +59,17 @@ ASM_FUNC_ALIGN(SysCallBase, 4096)
//------------------------------------------------------------------------------
// EFI_STATUS
// EFIAPI
// CallRing3 (
// IN RING3_CALL_DATA *Data,
// IN UINTN UserStackTop
// CallUserSpace (
// IN USER_SPACE_CALL_DATA *Data,
// IN UINTN UserStackTop
// );
//
// (x0) Data
// (x1) UserStackTop
// (x2) gRing3EntryPoint
// (x2) gUserSpaceEntryPoint
// (x3) gUserPageTable
//------------------------------------------------------------------------------
ASM_FUNC(ArmCallRing3)
ASM_FUNC(ArmCallUserSpace)
// Save registers.
sub sp, sp, #0x100
@ -94,7 +94,7 @@ ASM_FUNC(ArmCallRing3)
mrs x6, nzcv
mrs x7, pan
orr x6, x6, x7
// Prepare Ring3 SP and EntryPoint.
// Prepare UserSpace SP and EntryPoint.
msr sp_el0, x1
EL1_OR_EL2(x1)
1:msr elr_el1, x2

View File

@ -21,11 +21,11 @@ STATIC UINTN mUartBaseAddress;
EFI_STATUS
EFIAPI
ArmCallRing3 (
IN RING3_CALL_DATA *Data,
IN UINTN UserStackTop,
IN VOID *EntryPoint,
IN UINTN UserPageTable
ArmCallUserSpace (
IN USER_SPACE_CALL_DATA *Data,
IN UINTN UserStackTop,
IN VOID *EntryPoint,
IN UINTN UserPageTable
);
STATIC
@ -119,7 +119,7 @@ InitializePlatform (
Status = CoreAllocatePages (
AllocateAnyPages,
EfiRing3MemoryType,
EfiUserSpaceMemoryType,
EFI_SIZE_TO_PAGES (mConfigurationTableSize),
&Physical
);
@ -221,15 +221,15 @@ ForbidSupervisorAccessToUserMemory (
EFI_STATUS
EFIAPI
CallRing3 (
IN RING3_CALL_DATA *Data,
IN UINTN UserStackTop
CallUserSpace (
IN USER_SPACE_CALL_DATA *Data,
IN UINTN UserStackTop
)
{
return ArmCallRing3 (
return ArmCallUserSpace (
Data,
UserStackTop,
gRing3EntryPoint,
gUserSpaceEntryPoint,
gUserPageTable
);
}

View File

@ -55,17 +55,17 @@ ASM_FUNC_ALIGN(SysCallBase, 4096)
//------------------------------------------------------------------------------
// EFI_STATUS
// EFIAPI
// CallRing3 (
// IN RING3_CALL_DATA *Data,
// IN UINTN UserStackTop
// CallUserSpace (
// IN USER_SPACE_CALL_DATA *Data,
// IN UINTN UserStackTop
// );
//
// (r0) Data
// (r1) UserStackTop
// (r2) gRing3EntryPoint
// (r2) gUserSpaceEntryPoint
// (r3) gUserPageTable
//------------------------------------------------------------------------------
ASM_FUNC(ArmCallRing3)
ASM_FUNC(ArmCallUserSpace)
// Save registers.
push {R4-R12, LR}
// Save old SP_usr and LR_usr on Core Stack.

View File

@ -20,11 +20,11 @@ STATIC UINTN mUartBaseAddress;
EFI_STATUS
EFIAPI
ArmCallRing3 (
IN RING3_CALL_DATA *Data,
IN UINTN UserStackTop,
IN VOID *EntryPoint,
IN UINTN UserPageTable
ArmCallUserSpace (
IN USER_SPACE_CALL_DATA *Data,
IN UINTN UserStackTop,
IN VOID *EntryPoint,
IN UINTN UserPageTable
);
STATIC
@ -147,7 +147,7 @@ InitializePlatform (
Status = CoreAllocatePages (
AllocateAnyPages,
EfiRing3MemoryType,
EfiUserSpaceMemoryType,
EFI_SIZE_TO_PAGES (mConfigurationTableSize),
&Physical
);
@ -238,15 +238,15 @@ ForbidSupervisorAccessToUserMemory (
EFI_STATUS
EFIAPI
CallRing3 (
IN RING3_CALL_DATA *Data,
IN UINTN UserStackTop
CallUserSpace (
IN USER_SPACE_CALL_DATA *Data,
IN UINTN UserStackTop
)
{
return ArmCallRing3 (
return ArmCallUserSpace (
Data,
UserStackTop,
gRing3EntryPoint,
gUserSpaceEntryPoint,
gUserPageTable
);
}

View File

@ -12,11 +12,11 @@ LIST_ENTRY mProtocolsHead = INITIALIZE_LIST_HEAD_VARIABLE (mProtocolsHead);
typedef struct {
VOID *Core;
VOID *Ring3;
VOID *UserSpace;
LIST_ENTRY Link;
} INTERFACE;
UINTN mRing3InterfacePointer = 0;
UINTN mUserSpaceInterfacePointer = 0;
CHAR8 *SysCallNames[] = {
//
@ -92,76 +92,76 @@ STATIC
EFI_STATUS
EFIAPI
FindGuid (
IN EFI_GUID *Ring3,
IN EFI_GUID *UserSpace,
OUT EFI_GUID **Core,
OUT UINT32 *CoreSize
)
{
ASSERT (Ring3 != NULL);
ASSERT (UserSpace != NULL);
ASSERT (Core != NULL);
ASSERT (CoreSize != NULL);
if (CompareGuid (Ring3, &gEfiDevicePathUtilitiesProtocolGuid)) {
if (CompareGuid (UserSpace, &gEfiDevicePathUtilitiesProtocolGuid)) {
*Core = &gEfiDevicePathUtilitiesProtocolGuid;
*CoreSize = sizeof (EFI_DEVICE_PATH_UTILITIES_PROTOCOL);
} else if (CompareGuid (Ring3, &gEfiLoadedImageProtocolGuid)) {
} else if (CompareGuid (UserSpace, &gEfiLoadedImageProtocolGuid)) {
*Core = &gEfiLoadedImageProtocolGuid;
*CoreSize = sizeof (EFI_LOADED_IMAGE_PROTOCOL);
} else if (CompareGuid (Ring3, &gEfiBlockIoProtocolGuid)) {
} else if (CompareGuid (UserSpace, &gEfiBlockIoProtocolGuid)) {
*Core = &gEfiBlockIoProtocolGuid;
*CoreSize = sizeof (EFI_BLOCK_IO_PROTOCOL);
} else if (CompareGuid (Ring3, &gEfiDiskIoProtocolGuid)) {
} else if (CompareGuid (UserSpace, &gEfiDiskIoProtocolGuid)) {
*Core = &gEfiDiskIoProtocolGuid;
*CoreSize = sizeof (EFI_DISK_IO_PROTOCOL);
} else if (CompareGuid (Ring3, &gEfiDriverBindingProtocolGuid)) {
} else if (CompareGuid (UserSpace, &gEfiDriverBindingProtocolGuid)) {
*Core = &gEfiDriverBindingProtocolGuid;
*CoreSize = sizeof (EFI_DRIVER_BINDING_PROTOCOL);
} else if (CompareGuid (Ring3, &gEfiComponentNameProtocolGuid)) {
} else if (CompareGuid (UserSpace, &gEfiComponentNameProtocolGuid)) {
*Core = &gEfiComponentNameProtocolGuid;
*CoreSize = sizeof (EFI_COMPONENT_NAME_PROTOCOL);
} else if (CompareGuid (Ring3, &gEfiComponentName2ProtocolGuid)) {
} else if (CompareGuid (UserSpace, &gEfiComponentName2ProtocolGuid)) {
*Core = &gEfiComponentName2ProtocolGuid;
*CoreSize = sizeof (EFI_COMPONENT_NAME2_PROTOCOL);
} else if (CompareGuid (Ring3, &gEfiDevicePathProtocolGuid)) {
} else if (CompareGuid (UserSpace, &gEfiDevicePathProtocolGuid)) {
*Core = &gEfiDevicePathProtocolGuid;
*CoreSize = sizeof (EFI_DEVICE_PATH_PROTOCOL);
} else if (CompareGuid (Ring3, &gEfiSimpleFileSystemProtocolGuid)) {
} else if (CompareGuid (UserSpace, &gEfiSimpleFileSystemProtocolGuid)) {
*Core = &gEfiSimpleFileSystemProtocolGuid;
*CoreSize = sizeof (EFI_SIMPLE_FILE_SYSTEM_PROTOCOL);
} else if (CompareGuid (Ring3, &gEfiUnicodeCollationProtocolGuid)) {
} else if (CompareGuid (UserSpace, &gEfiUnicodeCollationProtocolGuid)) {
*Core = &gEfiUnicodeCollationProtocolGuid;
*CoreSize = sizeof (EFI_UNICODE_COLLATION_PROTOCOL);
} else if (CompareGuid (Ring3, &gEfiGlobalVariableGuid)) {
} else if (CompareGuid (UserSpace, &gEfiGlobalVariableGuid)) {
*Core = &gEfiGlobalVariableGuid;
} else if (CompareGuid (Ring3, &gEfiUnicodeCollation2ProtocolGuid)) {
} else if (CompareGuid (UserSpace, &gEfiUnicodeCollation2ProtocolGuid)) {
*Core = &gEfiUnicodeCollation2ProtocolGuid;
*CoreSize = sizeof (EFI_UNICODE_COLLATION_PROTOCOL);
} else {
DEBUG ((DEBUG_ERROR, "Ring0: Unknown protocol - %g.\n", Ring3));
DEBUG ((DEBUG_ERROR, "Core: Unknown protocol - %g.\n", UserSpace));
return EFI_NOT_FOUND;
}
@ -172,7 +172,7 @@ STATIC
VOID *
EFIAPI
FindInterface (
IN BOOLEAN FindRing3,
IN BOOLEAN FindUserSpace,
IN VOID *Interface
)
{
@ -182,12 +182,12 @@ FindInterface (
for (Link = mProtocolsHead.ForwardLink; Link != &mProtocolsHead; Link = Link->ForwardLink) {
Protocol = BASE_CR (Link, INTERFACE, Link);
if (FindRing3) {
if (FindUserSpace) {
if (Protocol->Core == Interface) {
return Protocol->Ring3;
return Protocol->UserSpace;
}
} else {
if (Protocol->Ring3 == Interface) {
if (Protocol->UserSpace == Interface) {
return Protocol->Core;
}
}
@ -199,15 +199,15 @@ FindInterface (
STATIC
VOID *
EFIAPI
PrepareRing3Interface (
PrepareUserSpaceInterface (
IN EFI_GUID *Guid,
IN VOID *CoreInterface,
IN UINT32 CoreSize
)
{
EFI_STATUS Status;
UINTN Ring3Limit;
VOID *Ring3Interface;
UINTN UserSpaceLimit;
VOID *UserSpaceInterface;
EFI_BLOCK_IO_PROTOCOL *BlockIo;
EFI_UNICODE_COLLATION_PROTOCOL *Unicode;
INTERFACE *Protocol;
@ -215,50 +215,50 @@ PrepareRing3Interface (
ASSERT (Guid != NULL);
ASSERT (CoreInterface != NULL);
if (mRing3InterfacePointer == 0) {
mRing3InterfacePointer = (UINTN)gRing3Interfaces;
if (mUserSpaceInterfacePointer == 0) {
mUserSpaceInterfacePointer = (UINTN)gUserSpaceInterfaces;
}
Ring3Interface = FindInterface (TRUE, CoreInterface);
UserSpaceInterface = FindInterface (TRUE, CoreInterface);
if (Ring3Interface != NULL) {
return Ring3Interface;
if (UserSpaceInterface != NULL) {
return UserSpaceInterface;
}
Ring3Limit = (UINTN)gRing3Interfaces + EFI_PAGES_TO_SIZE (RING3_INTERFACES_PAGES);
UserSpaceLimit = (UINTN)gUserSpaceInterfaces + EFI_PAGES_TO_SIZE (USER_SPACE_INTERFACES_PAGES);
ASSERT ((mRing3InterfacePointer + CoreSize) <= Ring3Limit);
ASSERT ((mUserSpaceInterfacePointer + CoreSize) <= UserSpaceLimit);
Ring3Interface = (VOID *)mRing3InterfacePointer;
UserSpaceInterface = (VOID *)mUserSpaceInterfacePointer;
CopyMem ((VOID *)mRing3InterfacePointer, CoreInterface, CoreSize);
mRing3InterfacePointer += CoreSize;
CopyMem ((VOID *)mUserSpaceInterfacePointer, CoreInterface, CoreSize);
mUserSpaceInterfacePointer += CoreSize;
Protocol = AllocatePool (sizeof (INTERFACE));
Protocol->Core = CoreInterface;
Protocol->Ring3 = Ring3Interface;
Protocol->Core = CoreInterface;
Protocol->UserSpace = UserSpaceInterface;
InsertTailList (&mProtocolsHead, &Protocol->Link);
if (CompareGuid (Guid, &gEfiBlockIoProtocolGuid)) {
ASSERT ((mRing3InterfacePointer + sizeof (EFI_BLOCK_IO_MEDIA)) <= Ring3Limit);
ASSERT ((mUserSpaceInterfacePointer + sizeof (EFI_BLOCK_IO_MEDIA)) <= UserSpaceLimit);
BlockIo = (EFI_BLOCK_IO_PROTOCOL *)Ring3Interface;
BlockIo = (EFI_BLOCK_IO_PROTOCOL *)UserSpaceInterface;
CopyMem ((VOID *)mRing3InterfacePointer, (VOID *)BlockIo->Media, sizeof (EFI_BLOCK_IO_MEDIA));
CopyMem ((VOID *)mUserSpaceInterfacePointer, (VOID *)BlockIo->Media, sizeof (EFI_BLOCK_IO_MEDIA));
BlockIo->Media = (EFI_BLOCK_IO_MEDIA *)mRing3InterfacePointer;
BlockIo->Media = (EFI_BLOCK_IO_MEDIA *)mUserSpaceInterfacePointer;
mRing3InterfacePointer += sizeof (EFI_BLOCK_IO_MEDIA);
mUserSpaceInterfacePointer += sizeof (EFI_BLOCK_IO_MEDIA);
} else if (CompareGuid (Guid, &gEfiUnicodeCollationProtocolGuid)) {
Unicode = (EFI_UNICODE_COLLATION_PROTOCOL *)Ring3Interface;
Unicode = (EFI_UNICODE_COLLATION_PROTOCOL *)UserSpaceInterface;
ASSERT ((mRing3InterfacePointer + AsciiStrSize (Unicode->SupportedLanguages)) <= Ring3Limit);
ASSERT ((mUserSpaceInterfacePointer + AsciiStrSize (Unicode->SupportedLanguages)) <= UserSpaceLimit);
Status = AsciiStrCpyS (
(CHAR8 *)mRing3InterfacePointer,
(CHAR8 *)mUserSpaceInterfacePointer,
AsciiStrSize (Unicode->SupportedLanguages),
Unicode->SupportedLanguages
);
@ -267,12 +267,12 @@ PrepareRing3Interface (
return NULL;
}
Unicode->SupportedLanguages = (CHAR8 *)mRing3InterfacePointer;
Unicode->SupportedLanguages = (CHAR8 *)mUserSpaceInterfacePointer;
mRing3InterfacePointer += AsciiStrSize (Unicode->SupportedLanguages);
mUserSpaceInterfacePointer += AsciiStrSize (Unicode->SupportedLanguages);
}
return Ring3Interface;
return UserSpaceInterface;
}
STATIC
@ -347,7 +347,7 @@ CallBootService (
VOID **CoreArgList;
EFI_HANDLE CoreHandle;
UINT32 PagesNumber;
EFI_PHYSICAL_ADDRESS Ring3Pages;
EFI_PHYSICAL_ADDRESS UserSpacePages;
USER_SPACE_DRIVER *NewDriver;
UINTN *Arguments;
EFI_PHYSICAL_ADDRESS PhysAddr;
@ -415,7 +415,7 @@ CallBootService (
AllowSupervisorAccessToUserMemory ();
if (Interface != NULL) {
Interface = PrepareRing3Interface (CoreProtocol, Interface, MemoryCoreSize);
Interface = PrepareUserSpaceInterface (CoreProtocol, Interface, MemoryCoreSize);
ASSERT (Interface != NULL);
*(VOID **)Arguments[3] = Interface;
@ -462,7 +462,7 @@ CallBootService (
if ((VOID **)Arguments[3] != NULL) {
AllowSupervisorAccessToUserMemory ();
if (Interface != NULL) {
Interface = PrepareRing3Interface (CoreProtocol, Interface, MemoryCoreSize);
Interface = PrepareUserSpaceInterface (CoreProtocol, Interface, MemoryCoreSize);
}
*(VOID **)Arguments[3] = Interface;
@ -648,7 +648,7 @@ CallBootService (
AllowSupervisorAccessToUserMemory ();
if (Interface != NULL) {
Interface = PrepareRing3Interface (CoreProtocol, Interface, MemoryCoreSize);
Interface = PrepareUserSpaceInterface (CoreProtocol, Interface, MemoryCoreSize);
ASSERT (Interface != NULL);
*(VOID **)Arguments[3] = Interface;
@ -761,20 +761,20 @@ CallBootService (
Status = CoreAllocatePages (
AllocateAnyPages,
EfiRing3MemoryType,
EfiUserSpaceMemoryType,
PagesNumber,
&Ring3Pages
&UserSpacePages
);
if (EFI_ERROR (Status)) {
break;
}
AllowSupervisorAccessToUserMemory ();
CopyMem ((VOID *)(UINTN)Ring3Pages, (VOID *)Argument5, Argument4 * sizeof (EFI_HANDLE *));
CopyMem ((VOID *)(UINTN)UserSpacePages, (VOID *)Argument5, Argument4 * sizeof (EFI_HANDLE *));
FreePool ((VOID *)Argument5);
*(EFI_HANDLE **)Arguments[5] = (EFI_HANDLE *)(UINTN)Ring3Pages;
*(EFI_HANDLE **)Arguments[5] = (EFI_HANDLE *)(UINTN)UserSpacePages;
ForbidSupervisorAccessToUserMemory ();
}
@ -1465,7 +1465,7 @@ CallBootService (
break;
default:
DEBUG ((DEBUG_ERROR, "Ring0: Unknown syscall type.\n"));
DEBUG ((DEBUG_ERROR, "Core: Unknown syscall type.\n"));
Status = EFI_UNSUPPORTED;
break;
}

View File

@ -8,7 +8,7 @@
#include <Register/Intel/ArchitecturalMsr.h>
extern ASM_PFX(CallBootService)
extern ASM_PFX(gRing3EntryPoint)
extern ASM_PFX(gUserSpaceEntryPoint)
extern ASM_PFX(AsmReadMsr64)
@ -81,7 +81,7 @@ copy:
ret
%macro SetRing3DataSegmentSelectors 0
%macro SetUserSpaceDataSegmentSelectors 0
push dword MSR_IA32_SYSENTER_CS
call ASM_PFX(AsmReadMsr64)
; eax = RING0_CODE32_SEL
@ -146,7 +146,7 @@ ASM_PFX(CoreBootServices):
push eax
cli
SetRing3DataSegmentSelectors
SetUserSpaceDataSegmentSelectors
mov eax, [ASM_PFX(gUserPageTable)]
mov cr3, eax
@ -167,15 +167,15 @@ ASM_PFX(CoreBootServices):
;------------------------------------------------------------------------------
; EFI_STATUS
; EFIAPI
; CallRing3 (
; IN RING3_CALL_DATA *Data,
; IN UINTN UserStackTop
; CallUserSpace (
; IN USER_SPACE_CALL_DATA *Data,
; IN UINTN UserStackTop
; );
;
; (On User Stack) Data, UserStackTop
;------------------------------------------------------------------------------
global ASM_PFX(CallRing3)
ASM_PFX(CallRing3):
global ASM_PFX(CallUserSpace)
ASM_PFX(CallUserSpace):
cli
; Save nonvolatile registers EBX, EBP, EDI, ESI, ESP.
push ebx
@ -194,11 +194,11 @@ ASM_PFX(CallRing3):
mov ecx, MSR_IA32_SYSENTER_ESP
wrmsr
SetRing3DataSegmentSelectors
SetUserSpaceDataSegmentSelectors
; Prepare SYSEXIT arguments.
mov ecx, [esp + 4 * 7] ; UserStackTop
mov edx, [ASM_PFX(gRing3EntryPoint)]
mov edx, [ASM_PFX(gUserSpaceEntryPoint)]
mov eax, [esp + 4 * 6] ; Data
; Switch to User Stack.

View File

@ -1,6 +1,6 @@
/** @file
Copyright (c) 2024, Mikhail Krichanov. All rights reserved.
Copyright (c) 2024 - 2025, Mikhail Krichanov. All rights reserved.
SPDX-License-Identifier: BSD-3-Clause
**/
@ -150,7 +150,7 @@ InitializePlatform (
//
// Initialize MSR_IA32_SYSENTER_CS, MSR_IA32_SYSENTER_EIP for SYSENTER and SYSEXIT.
// MSR_IA32_SYSENTER_ESP is set in CallRing3().
// MSR_IA32_SYSENTER_ESP is set in CallUserSpace().
//
Msr = RING0_CODE32_SEL;
AsmWriteMsr64 (MSR_IA32_SYSENTER_CS, Msr);

View File

@ -7,15 +7,15 @@
#include "DxeMain.h"
VOID *gRing3EntryPoint;
RING3_DATA *gRing3Data;
VOID *gRing3Interfaces;
VOID *gUserSpaceEntryPoint;
USER_SPACE_DATA *gUserSpaceData;
VOID *gUserSpaceInterfaces;
EXCEPTION_ADDRESSES *mExceptionAddresses;
extern UINTN SysCallBase;
extern UINTN SysCallEnd;
STATIC UEFI_IMAGE_RECORD *mDxeRing3;
STATIC UEFI_IMAGE_RECORD *mDxeUserSpace;
STATIC EFI_PHYSICAL_ADDRESS mCoreStackBase;
STATIC UINT64 mCoreStackSize;
@ -40,7 +40,7 @@ MapPlatform (
EFI_STATUS
EFIAPI
InitializeRing3 (
InitializeUserSpace (
IN EFI_HANDLE ImageHandle,
IN LOADED_IMAGE_PRIVATE_DATA *Image
)
@ -51,75 +51,75 @@ InitializeRing3 (
EFI_HOB_MEMORY_ALLOCATION *MemoryHob;
//
// Set Ring3 EntryPoint and BootServices.
// Set UserSpace EntryPoint and BootServices.
//
Status = CoreAllocatePages (
AllocateAnyPages,
EfiRing3MemoryType,
EFI_SIZE_TO_PAGES (sizeof (RING3_DATA)),
EfiUserSpaceMemoryType,
EFI_SIZE_TO_PAGES (sizeof (USER_SPACE_DATA)),
&Physical
);
if (EFI_ERROR (Status)) {
return Status;
}
gRing3Data = (RING3_DATA *)(UINTN)Physical;
gUserSpaceData = (USER_SPACE_DATA *)(UINTN)Physical;
CopyMem ((VOID *)gRing3Data, (VOID *)Image->Info.SystemTable, sizeof (EFI_SYSTEM_TABLE));
CopyMem ((VOID *)gUserSpaceData, (VOID *)Image->Info.SystemTable, sizeof (EFI_SYSTEM_TABLE));
SetUefiImageMemoryAttributes (
(UINTN)gRing3Data,
ALIGN_VALUE (sizeof (RING3_DATA), EFI_PAGE_SIZE),
(UINTN)gUserSpaceData,
ALIGN_VALUE (sizeof (USER_SPACE_DATA), EFI_PAGE_SIZE),
EFI_MEMORY_XP | EFI_MEMORY_USER
);
Status = InitializePlatform (&gRing3Data->SystemTable);
Status = InitializePlatform (&gUserSpaceData->SystemTable);
if (EFI_ERROR (Status)) {
CoreFreePages (
(EFI_PHYSICAL_ADDRESS)(UINTN)gRing3Data,
EFI_SIZE_TO_PAGES (sizeof (RING3_DATA))
(EFI_PHYSICAL_ADDRESS)(UINTN)gUserSpaceData,
EFI_SIZE_TO_PAGES (sizeof (USER_SPACE_DATA))
);
return Status;
}
//
// Initialize DxeRing3 with Supervisor privileges.
// Initialize DxeUserSpace with Supervisor privileges.
//
mDxeRing3 = GetUefiImageRecord (Image);
ASSERT (mDxeRing3 != NULL);
mDxeUserSpace = GetUefiImageRecord (Image);
ASSERT (mDxeUserSpace != NULL);
SetUefiImageProtectionAttributes (mDxeRing3, FALSE);
SetUefiImageProtectionAttributes (mDxeUserSpace, FALSE);
AllowSupervisorAccessToUserMemory ();
Status = Image->EntryPoint (ImageHandle, (EFI_SYSTEM_TABLE *)gRing3Data);
Status = Image->EntryPoint (ImageHandle, (EFI_SYSTEM_TABLE *)gUserSpaceData);
gRing3EntryPoint = gRing3Data->EntryPoint;
gUserSpaceEntryPoint = gUserSpaceData->EntryPoint;
gRing3Data->SystemTable.BootServices = gRing3Data->BootServices;
gRing3Data->SystemTable.RuntimeServices = gRing3Data->RuntimeServices;
gUserSpaceData->SystemTable.BootServices = gUserSpaceData->BootServices;
gUserSpaceData->SystemTable.RuntimeServices = gUserSpaceData->RuntimeServices;
ForbidSupervisorAccessToUserMemory ();
SetUefiImageProtectionAttributes (mDxeRing3, TRUE);
SetUefiImageProtectionAttributes (mDxeUserSpace, TRUE);
Status = CoreAllocatePages (
AllocateAnyPages,
EfiRing3MemoryType,
RING3_INTERFACES_PAGES,
EfiUserSpaceMemoryType,
USER_SPACE_INTERFACES_PAGES,
&Physical
);
if (EFI_ERROR (Status)) {
CoreFreePages (
(EFI_PHYSICAL_ADDRESS)(UINTN)gRing3Data,
EFI_SIZE_TO_PAGES (sizeof (RING3_DATA))
(EFI_PHYSICAL_ADDRESS)(UINTN)gUserSpaceData,
EFI_SIZE_TO_PAGES (sizeof (USER_SPACE_DATA))
);
return Status;
}
gRing3Interfaces = (VOID *)(UINTN)Physical;
gUserSpaceInterfaces = (VOID *)(UINTN)Physical;
SetUefiImageMemoryAttributes (
(UINTN)gRing3Interfaces,
EFI_PAGES_TO_SIZE (RING3_INTERFACES_PAGES),
(UINTN)gUserSpaceInterfaces,
EFI_PAGES_TO_SIZE (USER_SPACE_INTERFACES_PAGES),
EFI_MEMORY_XP | EFI_MEMORY_USER
);
@ -161,27 +161,27 @@ InitializeUserPageTable (
}
//
// Map gRing3Data, gRing3Interfaces, DxeRing3
// Map gUserSpaceData, gUserSpaceInterfaces, DxeUserSpace
//
gCpu->SetUserMemoryAttributes (
gCpu,
UserPageTable,
(UINTN)gRing3Data,
ALIGN_VALUE (sizeof (RING3_DATA), EFI_PAGE_SIZE),
(UINTN)gUserSpaceData,
ALIGN_VALUE (sizeof (USER_SPACE_DATA), EFI_PAGE_SIZE),
EFI_MEMORY_XP | EFI_MEMORY_USER
);
gCpu->SetUserMemoryAttributes (
gCpu,
UserPageTable,
(UINTN)gRing3Interfaces,
EFI_PAGES_TO_SIZE (RING3_INTERFACES_PAGES),
(UINTN)gUserSpaceInterfaces,
EFI_PAGES_TO_SIZE (USER_SPACE_INTERFACES_PAGES),
EFI_MEMORY_XP | EFI_MEMORY_USER
);
SectionAddress = mDxeRing3->StartAddress;
for (Index = 0; Index < mDxeRing3->NumSegments; Index++) {
ImageRecordSegment = &mDxeRing3->Segments[Index];
SectionAddress = mDxeUserSpace->StartAddress;
for (Index = 0; Index < mDxeUserSpace->NumSegments; Index++) {
ImageRecordSegment = &mDxeUserSpace->Segments[Index];
gCpu->SetUserMemoryAttributes (
gCpu,

View File

@ -14,26 +14,26 @@ LIST_ENTRY gUserSpaceDriversHead = INITIALIZE_LIST_HEAD_VARIABLE (gUserSpaceDriv
EFI_STATUS
EFIAPI
CallRing3 (
IN RING3_CALL_DATA *Data,
IN UINTN UserStackTop
CallUserSpace (
IN USER_SPACE_CALL_DATA *Data,
IN UINTN UserStackTop
);
EFI_STATUS
EFIAPI
GoToRing3 (
GoToUserSpace (
IN UINT8 Number,
IN VOID *EntryPoint,
IN USER_SPACE_DRIVER *UserDriver,
...
)
{
EFI_STATUS Status;
RING3_CALL_DATA *Input;
VA_LIST Marker;
UINTN Index;
UINTN UserStackTop;
UINTN UserStackBase;
EFI_STATUS Status;
USER_SPACE_CALL_DATA *Input;
VA_LIST Marker;
UINTN Index;
UINTN UserStackTop;
UINTN UserStackBase;
if (UserDriver->NumberOfCalls > MAX_CALL) {
return EFI_OUT_OF_RESOURCES;
@ -44,9 +44,9 @@ GoToRing3 (
return EFI_OUT_OF_RESOURCES;
}
UserStackTop = UserStackBase + STACK_SIZE - (sizeof (RING3_CALL_DATA) + Number * sizeof (UINTN));
UserStackTop = UserStackBase + STACK_SIZE - (sizeof (USER_SPACE_CALL_DATA) + Number * sizeof (UINTN));
Input = (RING3_CALL_DATA *)UserStackTop;
Input = (USER_SPACE_CALL_DATA *)UserStackTop;
Input->NumberOfArguments = Number;
Input->EntryPoint = EntryPoint;
@ -73,7 +73,7 @@ GoToRing3 (
//
UserStackTop = ALIGN_VALUE (UserStackTop - 8*4 - CPU_STACK_ALIGNMENT, CPU_STACK_ALIGNMENT);
Status = CallRing3 (
Status = CallUserSpace (
Input,
UserStackTop
);
@ -133,7 +133,7 @@ CoreDriverBindingSupported (
EntryPoint = (VOID *)This->Supported;
ForbidSupervisorAccessToUserMemory ();
Status = GoToRing3 (
Status = GoToUserSpace (
3,
EntryPoint,
UserDriver,
@ -169,7 +169,7 @@ CoreDriverBindingStart (
EntryPoint = (VOID *)This->Start;
ForbidSupervisorAccessToUserMemory ();
Status = GoToRing3 (
Status = GoToUserSpace (
3,
EntryPoint,
UserDriver,
@ -206,7 +206,7 @@ CoreDriverBindingStop (
EntryPoint = (VOID *)This->Stop;
ForbidSupervisorAccessToUserMemory ();
Status = GoToRing3 (
Status = GoToUserSpace (
4,
EntryPoint,
UserDriver,
@ -242,7 +242,7 @@ CoreFileClose (
EntryPoint = (VOID *)This->Close;
ForbidSupervisorAccessToUserMemory ();
Status = GoToRing3 (
Status = GoToUserSpace (
1,
EntryPoint,
UserDriver,
@ -278,9 +278,9 @@ CoreFileRead (
)
{
EFI_STATUS Status;
UINTN *Ring3BufferSize;
VOID *Ring3Buffer;
EFI_PHYSICAL_ADDRESS Ring3Pages;
UINTN *UserSpaceBufferSize;
VOID *UserSpaceBuffer;
EFI_PHYSICAL_ADDRESS UserSpacePages;
UINT32 PagesNumber;
USER_SPACE_DRIVER *UserDriver;
VOID *EntryPoint;
@ -290,57 +290,57 @@ CoreFileRead (
return EFI_INVALID_PARAMETER;
}
//
// gUserPageTable must be set before alloctation of EfiRing3MemoryType pages.
// gUserPageTable must be set before alloctation of EfiUserSpaceMemoryType pages.
//
UserDriver = FindUserSpaceDriver (This, &OldPageTable);
ASSERT (UserDriver != NULL);
This = UserDriver->UserSpaceDriver;
Ring3Buffer = NULL;
Ring3Pages = 0;
PagesNumber = (UINT32)EFI_SIZE_TO_PAGES (sizeof (UINTN *) + *BufferSize);
UserSpaceBuffer = NULL;
UserSpacePages = 0;
PagesNumber = (UINT32)EFI_SIZE_TO_PAGES (sizeof (UINTN *) + *BufferSize);
Status = CoreAllocatePages (
AllocateAnyPages,
EfiRing3MemoryType,
EfiUserSpaceMemoryType,
PagesNumber,
&Ring3Pages
&UserSpacePages
);
if (EFI_ERROR (Status)) {
gUserPageTable = OldPageTable;
return Status;
}
Ring3BufferSize = (UINTN *)(UINTN)Ring3Pages;
UserSpaceBufferSize = (UINTN *)(UINTN)UserSpacePages;
AllowSupervisorAccessToUserMemory ();
*Ring3BufferSize = *BufferSize;
EntryPoint = (VOID *)This->Read;
*UserSpaceBufferSize = *BufferSize;
EntryPoint = (VOID *)This->Read;
ForbidSupervisorAccessToUserMemory ();
if (Buffer != NULL) {
Ring3Buffer = (VOID *)((UINTN *)(UINTN)Ring3Pages + 1);
UserSpaceBuffer = (VOID *)((UINTN *)(UINTN)UserSpacePages + 1);
}
Status = GoToRing3 (
Status = GoToUserSpace (
3,
EntryPoint,
UserDriver,
This,
Ring3BufferSize,
Ring3Buffer
UserSpaceBufferSize,
UserSpaceBuffer
);
AllowSupervisorAccessToUserMemory ();
if ((Ring3Buffer != NULL) && (Buffer != NULL) && (*BufferSize >= *Ring3BufferSize)) {
CopyMem (Buffer, Ring3Buffer, *Ring3BufferSize);
if ((UserSpaceBuffer != NULL) && (Buffer != NULL) && (*BufferSize >= *UserSpaceBufferSize)) {
CopyMem (Buffer, UserSpaceBuffer, *UserSpaceBufferSize);
}
*BufferSize = *Ring3BufferSize;
*BufferSize = *UserSpaceBufferSize;
ForbidSupervisorAccessToUserMemory ();
CoreFreePages (Ring3Pages, PagesNumber);
CoreFreePages (UserSpacePages, PagesNumber);
gUserPageTable = OldPageTable;
@ -382,7 +382,7 @@ CoreFileSetPosition (
ForbidSupervisorAccessToUserMemory ();
#if defined (MDE_CPU_X64) || defined (MDE_CPU_AARCH64)
Status = GoToRing3 (
Status = GoToUserSpace (
2,
EntryPoint,
UserDriver,
@ -393,7 +393,7 @@ CoreFileSetPosition (
//
// UINT64 Position is passed as 2 double words on stack.
//
Status = GoToRing3 (
Status = GoToUserSpace (
3,
EntryPoint,
UserDriver,
@ -405,7 +405,7 @@ CoreFileSetPosition (
// UINT64 Position is passed as 2 words in 2 registers and is aligned on 8 bytes.
// R0 == This, R1 == NULL, R2 == Position_Low, R3 == Position_High.
//
Status = GoToRing3 (
Status = GoToUserSpace (
4,
EntryPoint,
UserDriver,
@ -430,7 +430,7 @@ CoreFileGetPosition (
)
{
EFI_STATUS Status;
EFI_PHYSICAL_ADDRESS Ring3Position;
EFI_PHYSICAL_ADDRESS UserSpacePosition;
USER_SPACE_DRIVER *UserDriver;
VOID *EntryPoint;
UINTN OldPageTable;
@ -446,9 +446,9 @@ CoreFileGetPosition (
Status = CoreAllocatePages (
AllocateAnyPages,
EfiRing3MemoryType,
EfiUserSpaceMemoryType,
1,
&Ring3Position
&UserSpacePosition
);
if (EFI_ERROR (Status)) {
gUserPageTable = OldPageTable;
@ -456,23 +456,23 @@ CoreFileGetPosition (
}
AllowSupervisorAccessToUserMemory ();
*(UINT64 *)(UINTN)Ring3Position = *Position;
EntryPoint = (VOID *)This->GetPosition;
*(UINT64 *)(UINTN)UserSpacePosition = *Position;
EntryPoint = (VOID *)This->GetPosition;
ForbidSupervisorAccessToUserMemory ();
Status = GoToRing3 (
Status = GoToUserSpace (
2,
EntryPoint,
UserDriver,
This,
Ring3Position
UserSpacePosition
);
AllowSupervisorAccessToUserMemory ();
*Position = *(UINT64 *)(UINTN)Ring3Position;
*Position = *(UINT64 *)(UINTN)UserSpacePosition;
ForbidSupervisorAccessToUserMemory ();
CoreFreePages (Ring3Position, 1);
CoreFreePages (UserSpacePosition, 1);
gUserPageTable = OldPageTable;
@ -490,10 +490,10 @@ CoreFileGetInfo (
)
{
EFI_STATUS Status;
EFI_GUID *Ring3InformationType;
UINTN *Ring3BufferSize;
VOID *Ring3Buffer;
EFI_PHYSICAL_ADDRESS Ring3Pages;
EFI_GUID *UserSpaceInformationType;
UINTN *UserSpaceBufferSize;
VOID *UserSpaceBuffer;
EFI_PHYSICAL_ADDRESS UserSpacePages;
UINT32 PagesNumber;
USER_SPACE_DRIVER *UserDriver;
VOID *EntryPoint;
@ -508,61 +508,61 @@ CoreFileGetInfo (
This = UserDriver->UserSpaceDriver;
Ring3Buffer = NULL;
Ring3InformationType = NULL;
Ring3Pages = 0;
UserSpaceBuffer = NULL;
UserSpaceInformationType = NULL;
UserSpacePages = 0;
PagesNumber = (UINT32)EFI_SIZE_TO_PAGES (sizeof (UINTN *) + *BufferSize + sizeof (EFI_GUID));
Status = CoreAllocatePages (
AllocateAnyPages,
EfiRing3MemoryType,
EfiUserSpaceMemoryType,
PagesNumber,
&Ring3Pages
&UserSpacePages
);
if (EFI_ERROR (Status)) {
gUserPageTable = OldPageTable;
return Status;
}
Ring3BufferSize = (UINTN *)(UINTN)Ring3Pages;
UserSpaceBufferSize = (UINTN *)(UINTN)UserSpacePages;
AllowSupervisorAccessToUserMemory ();
*Ring3BufferSize = *BufferSize;
EntryPoint = (VOID *)This->GetInfo;
*UserSpaceBufferSize = *BufferSize;
EntryPoint = (VOID *)This->GetInfo;
ForbidSupervisorAccessToUserMemory ();
if (Buffer != NULL) {
Ring3Buffer = (VOID *)((UINTN *)(UINTN)Ring3Pages + 1);
UserSpaceBuffer = (VOID *)((UINTN *)(UINTN)UserSpacePages + 1);
}
if (InformationType != NULL) {
Ring3InformationType = (EFI_GUID *)((UINTN)Ring3Pages + sizeof (UINTN *) + *BufferSize);
UserSpaceInformationType = (EFI_GUID *)((UINTN)UserSpacePages + sizeof (UINTN *) + *BufferSize);
AllowSupervisorAccessToUserMemory ();
CopyGuid (Ring3InformationType, InformationType);
CopyGuid (UserSpaceInformationType, InformationType);
ForbidSupervisorAccessToUserMemory ();
}
Status = GoToRing3 (
Status = GoToUserSpace (
4,
EntryPoint,
UserDriver,
This,
Ring3InformationType,
Ring3BufferSize,
Ring3Buffer
UserSpaceInformationType,
UserSpaceBufferSize,
UserSpaceBuffer
);
AllowSupervisorAccessToUserMemory ();
if ((Ring3Buffer != NULL) && (Buffer != NULL) && (*BufferSize >= *Ring3BufferSize)) {
CopyMem (Buffer, Ring3Buffer, *Ring3BufferSize);
if ((UserSpaceBuffer != NULL) && (Buffer != NULL) && (*BufferSize >= *UserSpaceBufferSize)) {
CopyMem (Buffer, UserSpaceBuffer, *UserSpaceBufferSize);
}
*BufferSize = *Ring3BufferSize;
*BufferSize = *UserSpaceBufferSize;
ForbidSupervisorAccessToUserMemory ();
CoreFreePages (Ring3Pages, PagesNumber);
CoreFreePages (UserSpacePages, PagesNumber);
gUserPageTable = OldPageTable;
@ -653,9 +653,9 @@ CoreFileOpen (
{
EFI_STATUS Status;
EFI_FILE_PROTOCOL *NewFile;
EFI_FILE_PROTOCOL **Ring3NewHandle;
CHAR16 *Ring3FileName;
EFI_PHYSICAL_ADDRESS Ring3Pages;
EFI_FILE_PROTOCOL **UserSpaceNewHandle;
CHAR16 *UserSpaceFileName;
EFI_PHYSICAL_ADDRESS UserSpacePages;
UINT32 PagesNumber;
USER_SPACE_DRIVER *UserDriver;
USER_SPACE_DRIVER *NewDriver;
@ -671,17 +671,17 @@ CoreFileOpen (
This = UserDriver->UserSpaceDriver;
Ring3NewHandle = NULL;
Ring3FileName = NULL;
Ring3Pages = 0;
UserSpaceNewHandle = NULL;
UserSpaceFileName = NULL;
UserSpacePages = 0;
PagesNumber = (UINT32)EFI_SIZE_TO_PAGES (sizeof (EFI_FILE_PROTOCOL *) + StrSize (FileName));
Status = CoreAllocatePages (
AllocateAnyPages,
EfiRing3MemoryType,
EfiUserSpaceMemoryType,
PagesNumber,
&Ring3Pages
&UserSpacePages
);
if (EFI_ERROR (Status)) {
*NewHandle = NULL;
@ -689,28 +689,28 @@ CoreFileOpen (
return Status;
}
Ring3NewHandle = (EFI_FILE_PROTOCOL **)(UINTN)Ring3Pages;
Ring3FileName = (CHAR16 *)((EFI_FILE_PROTOCOL **)(UINTN)Ring3Pages + 1);
UserSpaceNewHandle = (EFI_FILE_PROTOCOL **)(UINTN)UserSpacePages;
UserSpaceFileName = (CHAR16 *)((EFI_FILE_PROTOCOL **)(UINTN)UserSpacePages + 1);
AllowSupervisorAccessToUserMemory ();
Status = StrCpyS (Ring3FileName, StrLen (FileName) + 1, FileName);
Status = StrCpyS (UserSpaceFileName, StrLen (FileName) + 1, FileName);
EntryPoint = (VOID *)This->Open;
ForbidSupervisorAccessToUserMemory ();
if (EFI_ERROR (Status)) {
*NewHandle = NULL;
CoreFreePages (Ring3Pages, PagesNumber);
CoreFreePages (UserSpacePages, PagesNumber);
gUserPageTable = OldPageTable;
return Status;
}
#if defined (MDE_CPU_X64) || defined (MDE_CPU_AARCH64)
Status = GoToRing3 (
Status = GoToUserSpace (
5,
EntryPoint,
UserDriver,
This,
Ring3NewHandle,
Ring3FileName,
UserSpaceNewHandle,
UserSpaceFileName,
OpenMode,
Attributes
);
@ -718,13 +718,13 @@ CoreFileOpen (
//
// UINT64 OpenMode and Attributes are each passed as 2 double words on stack.
//
Status = GoToRing3 (
Status = GoToUserSpace (
7,
EntryPoint,
UserDriver,
This,
Ring3NewHandle,
Ring3FileName,
UserSpaceNewHandle,
UserSpaceFileName,
OpenMode,
Attributes
);
@ -732,16 +732,16 @@ CoreFileOpen (
//
// UINT64 OpenMode and Attributes are each passed as 2 words on stack.
// Each of them is aligned on 8 bytes.
// R0 == This, R1 == Ring3NewHandle, R2 == Ring3FileName, R3 == NULL,
// R0 == This, R1 == UserSpaceNewHandle, R2 == UserSpaceFileName, R3 == NULL,
// [SP] == OpenMode, [SP + 8] == Attributes.
//
Status = GoToRing3 (
Status = GoToUserSpace (
8,
EntryPoint,
UserDriver,
This,
Ring3NewHandle,
Ring3FileName,
UserSpaceNewHandle,
UserSpaceFileName,
NULL,
(UINT32)OpenMode,
(UINT32)(OpenMode >> 32),
@ -751,7 +751,7 @@ CoreFileOpen (
#endif
if (EFI_ERROR (Status)) {
*NewHandle = NULL;
CoreFreePages (Ring3Pages, PagesNumber);
CoreFreePages (UserSpacePages, PagesNumber);
gUserPageTable = OldPageTable;
return Status;
}
@ -759,7 +759,7 @@ CoreFileOpen (
NewFile = AllocatePool (sizeof (EFI_FILE_PROTOCOL));
if (NewFile == NULL) {
*NewHandle = NULL;
CoreFreePages (Ring3Pages, PagesNumber);
CoreFreePages (UserSpacePages, PagesNumber);
gUserPageTable = OldPageTable;
return EFI_OUT_OF_RESOURCES;
}
@ -768,7 +768,7 @@ CoreFileOpen (
if (NewDriver == NULL) {
*NewHandle = NULL;
FreePool (NewFile);
CoreFreePages (Ring3Pages, PagesNumber);
CoreFreePages (UserSpacePages, PagesNumber);
gUserPageTable = OldPageTable;
return EFI_OUT_OF_RESOURCES;
}
@ -778,8 +778,8 @@ CoreFileOpen (
NewDriver->NumberOfCalls = 0;
AllowSupervisorAccessToUserMemory ();
NewDriver->UserSpaceDriver = *Ring3NewHandle;
NewFile->Revision = (*Ring3NewHandle)->Revision;
NewDriver->UserSpaceDriver = *UserSpaceNewHandle;
NewFile->Revision = (*UserSpaceNewHandle)->Revision;
ForbidSupervisorAccessToUserMemory ();
InsertTailList (&gUserSpaceDriversHead, &NewDriver->Link);
@ -801,7 +801,7 @@ CoreFileOpen (
*NewHandle = (EFI_FILE_PROTOCOL *)NewFile;
CoreFreePages (Ring3Pages, PagesNumber);
CoreFreePages (UserSpacePages, PagesNumber);
gUserPageTable = OldPageTable;
@ -816,7 +816,7 @@ CoreSimpleFileSystemOpenVolume (
)
{
EFI_STATUS Status;
EFI_FILE_PROTOCOL **Ring3Root;
EFI_FILE_PROTOCOL **UserSpaceRoot;
EFI_FILE_PROTOCOL *File;
EFI_PHYSICAL_ADDRESS Physical;
USER_SPACE_DRIVER *UserDriver;
@ -839,7 +839,7 @@ CoreSimpleFileSystemOpenVolume (
Status = CoreAllocatePages (
AllocateAnyPages,
EfiRing3MemoryType,
EfiUserSpaceMemoryType,
1,
&Physical
);
@ -849,14 +849,14 @@ CoreSimpleFileSystemOpenVolume (
return Status;
}
Ring3Root = (EFI_FILE_PROTOCOL **)(UINTN)Physical;
UserSpaceRoot = (EFI_FILE_PROTOCOL **)(UINTN)Physical;
Status = GoToRing3 (
Status = GoToUserSpace (
2,
EntryPoint,
UserDriver,
This,
Ring3Root
UserSpaceRoot
);
if (EFI_ERROR (Status)) {
*Root = NULL;
@ -887,8 +887,8 @@ CoreSimpleFileSystemOpenVolume (
NewDriver->NumberOfCalls = 0;
AllowSupervisorAccessToUserMemory ();
NewDriver->UserSpaceDriver = *Ring3Root;
File->Revision = (*Ring3Root)->Revision;
NewDriver->UserSpaceDriver = *UserSpaceRoot;
File->Revision = (*UserSpaceRoot)->Revision;
ForbidSupervisorAccessToUserMemory ();
InsertTailList (&gUserSpaceDriversHead, &NewDriver->Link);
@ -943,7 +943,7 @@ CoreUnicodeCollationStriColl (
Status = CoreAllocatePages (
AllocateAnyPages,
EfiRing3MemoryType,
EfiUserSpaceMemoryType,
EFI_SIZE_TO_PAGES (Size1 + Size2),
&UserMem
);
@ -958,7 +958,7 @@ CoreUnicodeCollationStriColl (
EntryPoint = (VOID *)This->StriColl;
ForbidSupervisorAccessToUserMemory ();
Status = GoToRing3 (
Status = GoToUserSpace (
3,
EntryPoint,
UserDriver,
@ -1000,7 +1000,7 @@ CoreUnicodeCollationMetaiMatch (
Status = CoreAllocatePages (
AllocateAnyPages,
EfiRing3MemoryType,
EfiUserSpaceMemoryType,
EFI_SIZE_TO_PAGES (Size1 + Size2),
&UserMem
);
@ -1015,7 +1015,7 @@ CoreUnicodeCollationMetaiMatch (
EntryPoint = (VOID *)This->MetaiMatch;
ForbidSupervisorAccessToUserMemory ();
Status = GoToRing3 (
Status = GoToUserSpace (
3,
EntryPoint,
UserDriver,
@ -1054,7 +1054,7 @@ CoreUnicodeCollationStrLwr (
Status = CoreAllocatePages (
AllocateAnyPages,
EfiRing3MemoryType,
EfiUserSpaceMemoryType,
EFI_SIZE_TO_PAGES (Size1),
&UserMem
);
@ -1068,7 +1068,7 @@ CoreUnicodeCollationStrLwr (
EntryPoint = (VOID *)This->StrLwr;
ForbidSupervisorAccessToUserMemory ();
Status = GoToRing3 (
Status = GoToUserSpace (
2,
EntryPoint,
UserDriver,
@ -1108,7 +1108,7 @@ CoreUnicodeCollationStrUpr (
Status = CoreAllocatePages (
AllocateAnyPages,
EfiRing3MemoryType,
EfiUserSpaceMemoryType,
EFI_SIZE_TO_PAGES (Size1),
&UserMem
);
@ -1122,7 +1122,7 @@ CoreUnicodeCollationStrUpr (
EntryPoint = (VOID *)This->StrUpr;
ForbidSupervisorAccessToUserMemory ();
Status = GoToRing3 (
Status = GoToUserSpace (
2,
EntryPoint,
UserDriver,
@ -1161,7 +1161,7 @@ CoreUnicodeCollationFatToStr (
Status = CoreAllocatePages (
AllocateAnyPages,
EfiRing3MemoryType,
EfiUserSpaceMemoryType,
EFI_SIZE_TO_PAGES (FatSize * 3),
&UserMem
);
@ -1175,7 +1175,7 @@ CoreUnicodeCollationFatToStr (
EntryPoint = (VOID *)This->FatToStr;
ForbidSupervisorAccessToUserMemory ();
Status = GoToRing3 (
Status = GoToUserSpace (
4,
EntryPoint,
UserDriver,
@ -1219,7 +1219,7 @@ CoreUnicodeCollationStrToFat (
Status = CoreAllocatePages (
AllocateAnyPages,
EfiRing3MemoryType,
EfiUserSpaceMemoryType,
EFI_SIZE_TO_PAGES (FatSize + Size1),
&UserMem
);
@ -1233,7 +1233,7 @@ CoreUnicodeCollationStrToFat (
EntryPoint = (VOID *)This->StrToFat;
ForbidSupervisorAccessToUserMemory ();
Status = GoToRing3 (
Status = GoToUserSpace (
4,
EntryPoint,
UserDriver,

View File

@ -8,7 +8,7 @@
#include <Register/Intel/ArchitecturalMsr.h>
extern ASM_PFX(CallBootService)
extern ASM_PFX(gRing3EntryPoint)
extern ASM_PFX(gUserSpaceEntryPoint)
DEFAULT REL
SECTION .text
@ -89,7 +89,7 @@ copy:
ret
%macro SetRing3DataSegmentSelectors 0
%macro SetUserSpaceDataSegmentSelectors 0
mov rcx, MSR_IA32_STAR
rdmsr
shl rdx, 0x20
@ -157,7 +157,7 @@ ASM_PFX(CoreBootServices):
push rax
cli
SetRing3DataSegmentSelectors
SetUserSpaceDataSegmentSelectors
pop rax
@ -181,16 +181,16 @@ o64 sysret
;------------------------------------------------------------------------------
; EFI_STATUS
; EFIAPI
; CallRing3 (
; IN RING3_CALL_DATA *Data,
; IN UINTN UserStackTop
; CallUserSpace (
; IN USER_SPACE_CALL_DATA *Data,
; IN UINTN UserStackTop
; );
;
; (rcx) Data
; (rdx) UserStackTop
;------------------------------------------------------------------------------
global ASM_PFX(CallRing3)
ASM_PFX(CallRing3):
global ASM_PFX(CallUserSpace)
ASM_PFX(CallUserSpace):
pushfq
pop r11
cli
@ -211,11 +211,11 @@ ASM_PFX(CallRing3):
mov rbx, rdx
mov r10, rcx
SetRing3DataSegmentSelectors
SetUserSpaceDataSegmentSelectors
; Prepare SYSRET arguments.
mov rdx, r10
mov rcx, [ASM_PFX(gRing3EntryPoint)]
mov rcx, [ASM_PFX(gUserSpaceEntryPoint)]
; Switch to User Stack.
mov rsp, rbx

View File

@ -1,6 +1,6 @@
/** @file
Copyright (c) 2024, Mikhail Krichanov. All rights reserved.
Copyright (c) 2024 - 2025, Mikhail Krichanov. All rights reserved.
SPDX-License-Identifier: BSD-3-Clause
**/

View File

@ -43,7 +43,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
@param IsCore Selects between the purposes of mPoolHead array.
In DxeCore each element describes EFI_MEMORY_TYPE.
In DxeRing3 each element describes User space.
In DxeUserSpace each element describes User space.
**/
VOID

View File

@ -109,9 +109,9 @@ typedef enum {
///
EfiUnacceptedMemoryType,
///
/// Memory allocated for (by) Ring3 Images.
/// Memory allocated for (by) UserSpace Images.
///
EfiRing3MemoryType,
EfiUserSpaceMemoryType,
EfiMaxMemoryType
} EFI_MEMORY_TYPE;

View File

@ -2151,13 +2151,13 @@ typedef struct {
VOID *EntryPoint;
EFI_BOOT_SERVICES *BootServices;
EFI_RUNTIME_SERVICES *RuntimeServices;
} RING3_DATA;
} USER_SPACE_DATA;
typedef struct {
UINT8 NumberOfArguments;
VOID *EntryPoint;
UINTN Arguments[];
} RING3_CALL_DATA;
} USER_SPACE_CALL_DATA;
/**
This is the declaration of an EFI image entry point. This entry point is