mirror of
https://github.com/acidanthera/audk.git
synced 2025-09-29 04:28:39 +02:00
266 lines
11 KiB
C
266 lines
11 KiB
C
/** @file
|
|
|
|
Copyright (c) 2024, Mikhail Krichanov. All rights reserved.
|
|
SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
**/
|
|
|
|
#include <Uefi.h>
|
|
#include <Library/BaseMemoryLib.h>
|
|
#include <Library/MemoryPoolLib.h>
|
|
#include <Library/UefiBootServicesTableLib.h>
|
|
#include <Library/UefiRuntimeServicesTableLib.h>
|
|
|
|
#include "Ring3.h"
|
|
|
|
EFI_BOOT_SERVICES mBootServices = {
|
|
{
|
|
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)CoreAllocatePool, // AllocatePool
|
|
(EFI_FREE_POOL)CoreFreePool, // 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_RUNTIME_SERVICES mRuntimeServices = {
|
|
{
|
|
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
|
|
};
|
|
|
|
VOID
|
|
EFIAPI
|
|
Ring3EntryPoint (
|
|
IN RING3_CALL_DATA *Data
|
|
);
|
|
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *FUNCTION_0)(
|
|
VOID
|
|
);
|
|
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *FUNCTION_1)(
|
|
IN UINTN Argument1
|
|
);
|
|
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *FUNCTION_2)(
|
|
IN UINTN Argument1,
|
|
IN UINTN Argument2
|
|
);
|
|
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *FUNCTION_3)(
|
|
IN UINTN Argument1,
|
|
IN UINTN Argument2,
|
|
IN UINTN Argument3
|
|
);
|
|
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *FUNCTION_4)(
|
|
IN UINTN Argument1,
|
|
IN UINTN Argument2,
|
|
IN UINTN Argument3,
|
|
IN UINTN Argument4
|
|
);
|
|
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *FUNCTION_5)(
|
|
IN UINTN Argument1,
|
|
IN UINTN Argument2,
|
|
IN UINTN Argument3,
|
|
IN UINTN Argument4,
|
|
IN UINTN Argument5
|
|
);
|
|
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *FUNCTION_6)(
|
|
IN UINTN Argument1,
|
|
IN UINTN Argument2,
|
|
IN UINTN Argument3,
|
|
IN UINTN Argument4,
|
|
IN UINTN Argument5,
|
|
IN UINTN Argument6
|
|
);
|
|
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *FUNCTION_7)(
|
|
IN UINTN Argument1,
|
|
IN UINTN Argument2,
|
|
IN UINTN Argument3,
|
|
IN UINTN Argument4,
|
|
IN UINTN Argument5,
|
|
IN UINTN Argument6,
|
|
IN UINTN Argument7
|
|
);
|
|
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *FUNCTION_8)(
|
|
IN UINTN Argument1,
|
|
IN UINTN Argument2,
|
|
IN UINTN Argument3,
|
|
IN UINTN Argument4,
|
|
IN UINTN Argument5,
|
|
IN UINTN Argument6,
|
|
IN UINTN Argument7,
|
|
IN UINTN Argument8
|
|
);
|
|
|
|
VOID
|
|
EFIAPI
|
|
Ring3Call (
|
|
IN RING3_CALL_DATA *Data
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
FUNCTION_0 Function0;
|
|
FUNCTION_1 Function1;
|
|
FUNCTION_2 Function2;
|
|
FUNCTION_3 Function3;
|
|
FUNCTION_4 Function4;
|
|
FUNCTION_5 Function5;
|
|
FUNCTION_6 Function6;
|
|
FUNCTION_7 Function7;
|
|
FUNCTION_8 Function8;
|
|
|
|
switch (Data->NumberOfArguments) {
|
|
case 0:
|
|
Function0 = (FUNCTION_0)Data->EntryPoint;
|
|
Status = Function0 ();
|
|
break;
|
|
case 1:
|
|
Function1 = (FUNCTION_1)Data->EntryPoint;
|
|
Status = Function1 (Data->Arguments[0]);
|
|
break;
|
|
case 2:
|
|
Function2 = (FUNCTION_2)Data->EntryPoint;
|
|
Status = Function2 (Data->Arguments[0], Data->Arguments[1]);
|
|
break;
|
|
case 3:
|
|
Function3 = (FUNCTION_3)Data->EntryPoint;
|
|
Status = Function3 (Data->Arguments[0], Data->Arguments[1], Data->Arguments[2]);
|
|
break;
|
|
case 4:
|
|
Function4 = (FUNCTION_4)Data->EntryPoint;
|
|
Status = Function4 (Data->Arguments[0], Data->Arguments[1], Data->Arguments[2], Data->Arguments[3]);
|
|
break;
|
|
case 5:
|
|
Function5 = (FUNCTION_5)Data->EntryPoint;
|
|
Status = Function5 (Data->Arguments[0], Data->Arguments[1], Data->Arguments[2], Data->Arguments[3], Data->Arguments[4]);
|
|
break;
|
|
case 6:
|
|
Function6 = (FUNCTION_6)Data->EntryPoint;
|
|
Status = Function6 (Data->Arguments[0], Data->Arguments[1], Data->Arguments[2], Data->Arguments[3], Data->Arguments[4], Data->Arguments[5]);
|
|
break;
|
|
case 7:
|
|
Function7 = (FUNCTION_7)Data->EntryPoint;
|
|
Status = Function7 (Data->Arguments[0], Data->Arguments[1], Data->Arguments[2], Data->Arguments[3], Data->Arguments[4], Data->Arguments[5], Data->Arguments[6]);
|
|
break;
|
|
case 8:
|
|
Function8 = (FUNCTION_8)Data->EntryPoint;
|
|
Status = Function8 (Data->Arguments[0], Data->Arguments[1], Data->Arguments[2], Data->Arguments[3], Data->Arguments[4], Data->Arguments[5], Data->Arguments[6], Data->Arguments[7]);
|
|
break;
|
|
default:
|
|
Status = EFI_UNSUPPORTED;
|
|
break;
|
|
}
|
|
|
|
SysCall (SysCallReturnToCore, 1, Status);
|
|
}
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
Ring3Initialization (
|
|
IN EFI_HANDLE ImageHandle,
|
|
IN EFI_SYSTEM_TABLE *SystemTable
|
|
)
|
|
{
|
|
RING3_DATA *Ring3Data;
|
|
|
|
Ring3Data = (RING3_DATA *)SystemTable;
|
|
|
|
Ring3Data->EntryPoint = (VOID *)Ring3EntryPoint;
|
|
Ring3Data->BootServices = &mBootServices;
|
|
Ring3Data->RuntimeServices = &mRuntimeServices;
|
|
|
|
gBS = &mBootServices;
|
|
gRT = &mRuntimeServices;
|
|
|
|
CoreInitializePool ();
|
|
|
|
return EFI_SUCCESS;
|
|
}
|