mirror of https://github.com/acidanthera/audk.git
Ring3: Renamed Ring3 as UserSpace.
This commit is contained in:
parent
d8ae7a16fa
commit
0b89bd57bb
|
@ -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
|
||||
);
|
||||
|
|
|
@ -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 ();
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 }
|
||||
};
|
||||
//
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
**/
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue