mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-23 13:44:33 +02:00
Ring3: Defined SysCallBootService() for AARCH64.
This commit is contained in:
parent
3fc05b0473
commit
d03b93be3d
@ -71,6 +71,7 @@
|
|||||||
#define AARCH64_ESR_ISS(Ecr) ((0x1FFFFFF) & (Ecr))
|
#define AARCH64_ESR_ISS(Ecr) ((0x1FFFFFF) & (Ecr))
|
||||||
|
|
||||||
#define AARCH64_ESR_EC_SMC32 (0x13 << 26)
|
#define AARCH64_ESR_EC_SMC32 (0x13 << 26)
|
||||||
|
#define AARCH64_ESR_EC_SVC64 (0x15 << 26)
|
||||||
#define AARCH64_ESR_EC_SMC64 (0x17 << 26)
|
#define AARCH64_ESR_EC_SMC64 (0x17 << 26)
|
||||||
|
|
||||||
// AArch64 Exception Level
|
// AArch64 Exception Level
|
||||||
|
@ -16,7 +16,8 @@
|
|||||||
@param SystemContext Register state at the time of the Exception
|
@param SystemContext Register state at the time of the Exception
|
||||||
|
|
||||||
**/
|
**/
|
||||||
VOID
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
DefaultExceptionHandler (
|
DefaultExceptionHandler (
|
||||||
IN EFI_EXCEPTION_TYPE ExceptionType,
|
IN EFI_EXCEPTION_TYPE ExceptionType,
|
||||||
IN OUT EFI_SYSTEM_CONTEXT SystemContext
|
IN OUT EFI_SYSTEM_CONTEXT SystemContext
|
||||||
|
@ -332,7 +332,18 @@ ASM_PFX(CommonExceptionEntry):
|
|||||||
ldp x22, x23, [sp, #0xb0]
|
ldp x22, x23, [sp, #0xb0]
|
||||||
ldp x24, x25, [sp, #0xc0]
|
ldp x24, x25, [sp, #0xc0]
|
||||||
ldp x26, x27, [sp, #0xd0]
|
ldp x26, x27, [sp, #0xd0]
|
||||||
|
// Preserve return value for SVC.
|
||||||
|
mrs x1, esr_el1
|
||||||
|
lsr x1, x1, #26
|
||||||
|
and x1, x1, #0x3F
|
||||||
|
cmp x1, #0x15
|
||||||
|
b.eq is_SVC
|
||||||
|
|
||||||
ldp x0, x1, [sp], #0xe0
|
ldp x0, x1, [sp], #0xe0
|
||||||
|
b continue
|
||||||
|
is_SVC:
|
||||||
|
ldr x1, [sp, #0x8]
|
||||||
|
continue:
|
||||||
|
|
||||||
// Pop FP regs from Stack.
|
// Pop FP regs from Stack.
|
||||||
ldp q2, q3, [x28, #0x20]
|
ldp q2, q3, [x28, #0x20]
|
||||||
|
@ -266,7 +266,7 @@ RegisterExceptionHandler (
|
|||||||
return RegisterCpuInterruptHandler (ExceptionType, InterruptHandler);
|
return RegisterCpuInterruptHandler (ExceptionType, InterruptHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
CommonCExceptionHandler (
|
CommonCExceptionHandler (
|
||||||
IN EFI_EXCEPTION_TYPE ExceptionType,
|
IN EFI_EXCEPTION_TYPE ExceptionType,
|
||||||
@ -276,14 +276,14 @@ CommonCExceptionHandler (
|
|||||||
if (ExceptionType <= gMaxExceptionNumber) {
|
if (ExceptionType <= gMaxExceptionNumber) {
|
||||||
if (gExceptionHandlers[ExceptionType]) {
|
if (gExceptionHandlers[ExceptionType]) {
|
||||||
gExceptionHandlers[ExceptionType](ExceptionType, SystemContext);
|
gExceptionHandlers[ExceptionType](ExceptionType, SystemContext);
|
||||||
return;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
DEBUG ((DEBUG_ERROR, "Unknown exception type %d\n", ExceptionType));
|
DEBUG ((DEBUG_ERROR, "Unknown exception type %d\n", ExceptionType));
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
DefaultExceptionHandler (ExceptionType, SystemContext);
|
return DefaultExceptionHandler (ExceptionType, SystemContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -186,7 +186,8 @@ BaseName (
|
|||||||
@param SystemContext Register state at the time of the Exception
|
@param SystemContext Register state at the time of the Exception
|
||||||
|
|
||||||
**/
|
**/
|
||||||
VOID
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
DefaultExceptionHandler (
|
DefaultExceptionHandler (
|
||||||
IN EFI_EXCEPTION_TYPE ExceptionType,
|
IN EFI_EXCEPTION_TYPE ExceptionType,
|
||||||
IN OUT EFI_SYSTEM_CONTEXT SystemContext
|
IN OUT EFI_SYSTEM_CONTEXT SystemContext
|
||||||
@ -197,6 +198,14 @@ DefaultExceptionHandler (
|
|||||||
UINTN CharCount;
|
UINTN CharCount;
|
||||||
INT32 Offset;
|
INT32 Offset;
|
||||||
|
|
||||||
|
if (AARCH64_ESR_EC (SystemContext.SystemContextAArch64->ESR) == AARCH64_ESR_EC_SVC64) {
|
||||||
|
return gBS->SysCallBootService (
|
||||||
|
SystemContext.SystemContextAArch64->X0,
|
||||||
|
&(SystemContext.SystemContextAArch64->X1),
|
||||||
|
&(SystemContext.SystemContextAArch64->X0)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (mRecursiveException) {
|
if (mRecursiveException) {
|
||||||
STATIC CHAR8 CONST Message[] = "\nRecursive exception occurred while dumping the CPU state\n";
|
STATIC CHAR8 CONST Message[] = "\nRecursive exception occurred while dumping the CPU state\n";
|
||||||
SerialPortWrite ((UINT8 *)Message, sizeof Message - 1);
|
SerialPortWrite ((UINT8 *)Message, sizeof Message - 1);
|
||||||
@ -344,4 +353,6 @@ DefaultExceptionHandler (
|
|||||||
|
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
CpuDeadLoop ();
|
CpuDeadLoop ();
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -2722,6 +2722,14 @@ CoreBootServices (
|
|||||||
...
|
...
|
||||||
);
|
);
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
SysCallBootService (
|
||||||
|
IN UINT8 Type,
|
||||||
|
IN VOID *CoreRbp,
|
||||||
|
IN VOID *UserRsp
|
||||||
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
CallRing3 (
|
CallRing3 (
|
||||||
|
@ -89,7 +89,8 @@ EFI_BOOT_SERVICES mBootServices = {
|
|||||||
(EFI_CALCULATE_CRC32)CoreEfiNotAvailableYetArg3, // CalculateCrc32
|
(EFI_CALCULATE_CRC32)CoreEfiNotAvailableYetArg3, // CalculateCrc32
|
||||||
(EFI_COPY_MEM)CopyMem, // CopyMem
|
(EFI_COPY_MEM)CopyMem, // CopyMem
|
||||||
(EFI_SET_MEM)SetMem, // SetMem
|
(EFI_SET_MEM)SetMem, // SetMem
|
||||||
(EFI_CREATE_EVENT_EX)CoreCreateEventEx // CreateEventEx
|
(EFI_CREATE_EVENT_EX)CoreCreateEventEx, // CreateEventEx
|
||||||
|
(EFI_SYS_CALL_BOOT_SERVICE)SysCallBootService
|
||||||
};
|
};
|
||||||
|
|
||||||
EFI_DXE_SERVICES mDxeServices = {
|
EFI_DXE_SERVICES mDxeServices = {
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
// );
|
// );
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
ASM_FUNC(SysCall)
|
ASM_FUNC(SysCall)
|
||||||
|
svc #0
|
||||||
ret
|
ret
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
@ -20,26 +20,6 @@
|
|||||||
ASM_FUNC(CallInstallMultipleProtocolInterfaces)
|
ASM_FUNC(CallInstallMultipleProtocolInterfaces)
|
||||||
ret
|
ret
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// EFI_STATUS
|
|
||||||
// EFIAPI
|
|
||||||
// CoreBootServices (
|
|
||||||
// IN UINT8 Type,
|
|
||||||
// ...
|
|
||||||
// );
|
|
||||||
//
|
|
||||||
// (rcx) RIP of the next instruction saved by SYSCALL in SysCall().
|
|
||||||
// (rdx) Argument 1 of the called function.
|
|
||||||
// (r8) Argument 2 of the called function.
|
|
||||||
// (r9) Argument 3 of the called function.
|
|
||||||
// (r10) Type.
|
|
||||||
// (r11) RFLAGS saved by SYSCALL in SysCall().
|
|
||||||
//
|
|
||||||
// (On User Stack) Argument 4, 5, ...
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
ASM_FUNC(CoreBootServices)
|
|
||||||
ret
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// EFI_STATUS
|
// EFI_STATUS
|
||||||
// EFIAPI
|
// EFIAPI
|
||||||
|
@ -1391,3 +1391,18 @@ CallBootService (
|
|||||||
|
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
SysCallBootService (
|
||||||
|
IN UINT8 Type,
|
||||||
|
IN VOID *CoreRbp,
|
||||||
|
IN VOID *UserRsp
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return CallBootService (
|
||||||
|
Type,
|
||||||
|
(CORE_STACK *)CoreRbp,
|
||||||
|
(RING3_STACK *)UserRsp
|
||||||
|
);
|
||||||
|
}
|
||||||
|
@ -322,7 +322,7 @@ CoreFileSetPosition (
|
|||||||
|
|
||||||
File = (RING3_EFI_FILE_PROTOCOL *)This;
|
File = (RING3_EFI_FILE_PROTOCOL *)This;
|
||||||
|
|
||||||
#if defined (MDE_CPU_X64)
|
#if defined (MDE_CPU_X64) || defined (MDE_CPU_AARCH64)
|
||||||
return GoToRing3 (
|
return GoToRing3 (
|
||||||
2,
|
2,
|
||||||
(VOID *)mRing3FileProtocol.SetPosition,
|
(VOID *)mRing3FileProtocol.SetPosition,
|
||||||
@ -602,7 +602,7 @@ CoreFileOpen (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined (MDE_CPU_X64)
|
#if defined (MDE_CPU_X64) || defined (MDE_CPU_AARCH64)
|
||||||
Status = GoToRing3 (
|
Status = GoToRing3 (
|
||||||
5,
|
5,
|
||||||
(VOID *)mRing3FileProtocol.Open,
|
(VOID *)mRing3FileProtocol.Open,
|
||||||
|
@ -1831,6 +1831,14 @@ EFI_STATUS
|
|||||||
OUT UINT64 *MaximumVariableSize
|
OUT UINT64 *MaximumVariableSize
|
||||||
);
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SYS_CALL_BOOT_SERVICE)(
|
||||||
|
IN UINT8 Type,
|
||||||
|
IN VOID *CoreRbp,
|
||||||
|
IN VOID *UserRsp
|
||||||
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Firmware should stop at a firmware user interface on next boot
|
// Firmware should stop at a firmware user interface on next boot
|
||||||
//
|
//
|
||||||
@ -2011,6 +2019,7 @@ typedef struct {
|
|||||||
EFI_COPY_MEM CopyMem;
|
EFI_COPY_MEM CopyMem;
|
||||||
EFI_SET_MEM SetMem;
|
EFI_SET_MEM SetMem;
|
||||||
EFI_CREATE_EVENT_EX CreateEventEx;
|
EFI_CREATE_EVENT_EX CreateEventEx;
|
||||||
|
EFI_SYS_CALL_BOOT_SERVICE SysCallBootService;
|
||||||
} EFI_BOOT_SERVICES;
|
} EFI_BOOT_SERVICES;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user