mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-23 13:44:33 +02:00
Ring3: Defined SysCallBootService() for ARM.
This commit is contained in:
parent
ae234e908f
commit
bdea79e171
@ -9,6 +9,14 @@
|
|||||||
#ifndef DEFAULT_EXCEPTION_HANDLER_LIB_H_
|
#ifndef DEFAULT_EXCEPTION_HANDLER_LIB_H_
|
||||||
#define DEFAULT_EXCEPTION_HANDLER_LIB_H_
|
#define DEFAULT_EXCEPTION_HANDLER_LIB_H_
|
||||||
|
|
||||||
|
typedef
|
||||||
|
EFI_STATUS
|
||||||
|
(EFIAPI *EFI_SYS_CALL_BOOT_SERVICE)(
|
||||||
|
IN UINT8 Type,
|
||||||
|
IN VOID *CoreRbp,
|
||||||
|
IN VOID *UserRsp
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This is the default action to take on an unexpected exception
|
This is the default action to take on an unexpected exception
|
||||||
|
|
||||||
@ -26,7 +34,7 @@ DefaultExceptionHandler (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InitializeSysCallHandler (
|
InitializeSysCallHandler (
|
||||||
IN VOID *Handler
|
IN EFI_SYS_CALL_BOOT_SERVICE Handler
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif // DEFAULT_EXCEPTION_HANDLER_LIB_H_
|
#endif // DEFAULT_EXCEPTION_HANDLER_LIB_H_
|
||||||
|
@ -220,8 +220,12 @@ ASM_PFX(AsmCommonExceptionEntry):
|
|||||||
cmp R3, #0x1f @ if ((CPSR == 0x10) || (CPSR == 0x1f))
|
cmp R3, #0x1f @ if ((CPSR == 0x10) || (CPSR == 0x1f))
|
||||||
cmpne R3, #0x10 @
|
cmpne R3, #0x10 @
|
||||||
stmdaeq R2, {lr}^ @ save unbanked lr
|
stmdaeq R2, {lr}^ @ save unbanked lr
|
||||||
|
addeq R2, SP, #0x34 @ Make R2 point to EFI_SYSTEM_CONTEXT_ARM.SP
|
||||||
|
stmdaeq R2, {sp}^ @ save unbanked sp
|
||||||
@ else
|
@ else
|
||||||
stmdane R2, {lr} @ save SVC lr
|
stmdane R2, {lr} @ save SVC lr
|
||||||
|
addne R1, SP, #0x60 @ We pushed 0x60 bytes on the stack
|
||||||
|
strne R1, [SP, #0x34] @ Store it in EFI_SYSTEM_CONTEXT_ARM.SP
|
||||||
|
|
||||||
|
|
||||||
ldr R5, [SP, #0x58] @ PC is the LR pushed by srsfd
|
ldr R5, [SP, #0x58] @ PC is the LR pushed by srsfd
|
||||||
@ -230,6 +234,7 @@ ASM_PFX(AsmCommonExceptionEntry):
|
|||||||
cmp r4, #1 @ // UND & SVC have different LR adjust for Thumb
|
cmp r4, #1 @ // UND & SVC have different LR adjust for Thumb
|
||||||
bhi NoAdjustNeeded
|
bhi NoAdjustNeeded
|
||||||
|
|
||||||
|
ldr R1, [SP, #0x5c] @ srsdb saved pre-exception CPSR on the stack
|
||||||
tst r1, #0x20 @ if ((CPSR & T)) == T) { // Thumb Mode on entry
|
tst r1, #0x20 @ if ((CPSR & T)) == T) { // Thumb Mode on entry
|
||||||
addne R5, R5, #2 @ PC += 2;
|
addne R5, R5, #2 @ PC += 2;
|
||||||
strne R5,[SP,#0x58] @ Update LR value pushed by srsfd
|
strne R5,[SP,#0x58] @ Update LR value pushed by srsfd
|
||||||
@ -238,9 +243,6 @@ NoAdjustNeeded:
|
|||||||
|
|
||||||
str R5, [SP, #0x3c] @ Store it in EFI_SYSTEM_CONTEXT_ARM.PC
|
str R5, [SP, #0x3c] @ Store it in EFI_SYSTEM_CONTEXT_ARM.PC
|
||||||
|
|
||||||
add R1, SP, #0x60 @ We pushed 0x60 bytes on the stack
|
|
||||||
str R1, [SP, #0x34] @ Store it in EFI_SYSTEM_CONTEXT_ARM.SP
|
|
||||||
|
|
||||||
@ R0 is ExceptionType
|
@ R0 is ExceptionType
|
||||||
mov R1,SP @ R1 is SystemContext
|
mov R1,SP @ R1 is SystemContext
|
||||||
|
|
||||||
@ -253,7 +255,7 @@ NoAdjustNeeded:
|
|||||||
subne SP, SP, #4 @ Adjust SP if not 8-byte aligned
|
subne SP, SP, #4 @ Adjust SP if not 8-byte aligned
|
||||||
|
|
||||||
/*
|
/*
|
||||||
VOID
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
CommonCExceptionHandler (
|
CommonCExceptionHandler (
|
||||||
IN EFI_EXCEPTION_TYPE ExceptionType, R0
|
IN EFI_EXCEPTION_TYPE ExceptionType, R0
|
||||||
@ -261,6 +263,8 @@ CommonCExceptionHandler (
|
|||||||
)
|
)
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
mov R5, R0 @ R5 is ExceptionType
|
||||||
|
|
||||||
blx ASM_PFX(CommonCExceptionHandler) @ Call exception handler
|
blx ASM_PFX(CommonCExceptionHandler) @ Call exception handler
|
||||||
|
|
||||||
mov SP, R4 @ Restore SP
|
mov SP, R4 @ Restore SP
|
||||||
@ -275,25 +279,14 @@ CommonCExceptionHandler (
|
|||||||
ldr R1, [SP, #0x44] @ Restore EFI_SYSTEM_CONTEXT_ARM.DFSR
|
ldr R1, [SP, #0x44] @ Restore EFI_SYSTEM_CONTEXT_ARM.DFSR
|
||||||
mcr p15, 0, R1, c5, c0, 0 @ Write DFSR
|
mcr p15, 0, R1, c5, c0, 0 @ Write DFSR
|
||||||
|
|
||||||
ldr R1,[SP,#0x3c] @ EFI_SYSTEM_CONTEXT_ARM.PC
|
cmp R5, #2 @ if (ExceptionType == SoftwareInterrupt)
|
||||||
str R1,[SP,#0x58] @ Store it back to srsfd stack slot so it can be restored
|
addeq SP, SP, #0x4 @ Preserve EFI_STATUS return result in R0.
|
||||||
|
ldmfdeq SP!, {R1-R12} @
|
||||||
ldr R1,[SP,#0x40] @ EFI_SYSTEM_CONTEXT_ARM.CPSR
|
|
||||||
str R1,[SP,#0x5c] @ Store it back to srsfd stack slot so it can be restored
|
|
||||||
|
|
||||||
add R3, SP, #0x54 @ Make R3 point to SVC LR saved on entry
|
|
||||||
add R2, SP, #0x38 @ Make R2 point to EFI_SYSTEM_CONTEXT_ARM.LR
|
|
||||||
and R1, R1, #0x1f @ Check to see if User or System Mode
|
|
||||||
cmp R1, #0x1f @ if ((CPSR == 0x10) || (CPSR == 0x1f))
|
|
||||||
cmpne R1, #0x10 @
|
|
||||||
ldmibeq R2, {lr}^ @ restore unbanked lr
|
|
||||||
@ else
|
@ else
|
||||||
ldmibne R3, {lr} @ restore SVC lr, via ldmfd SP!, {LR}
|
ldmfdne SP!, {R0-R12} @ Restore general purpose registers
|
||||||
|
|
||||||
ldmfd SP!,{R0-R12} @ Restore general purpose registers
|
|
||||||
@ Exception handler can not change SP
|
@ Exception handler can not change SP
|
||||||
|
|
||||||
add SP,SP,#0x20 @ Clear out the remaining stack space
|
add SP,SP,#0x20 @ Clear out the remaining stack space
|
||||||
ldmfd SP!,{LR} @ restore the link register for this context
|
ldmfd SP!,{LR} @ restore the link register for this context
|
||||||
rfefd SP! @ return from exception via srsfd stack slot
|
rfefd SP! @ return from exception via srsfd stack slot
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include <Guid/DebugImageInfoTable.h>
|
#include <Guid/DebugImageInfoTable.h>
|
||||||
#include <Protocol/DebugSupport.h>
|
#include <Protocol/DebugSupport.h>
|
||||||
#include <Protocol/LoadedImage.h>
|
#include <Protocol/LoadedImage.h>
|
||||||
|
#include <Library/DefaultExceptionHandlerLib.h>
|
||||||
|
|
||||||
//
|
//
|
||||||
// Maximum number of characters to print to serial (UINT8s) and to console if
|
// Maximum number of characters to print to serial (UINT8s) and to console if
|
||||||
@ -29,14 +30,6 @@
|
|||||||
//
|
//
|
||||||
#define MAX_PRINT_CHARS 100
|
#define MAX_PRINT_CHARS 100
|
||||||
|
|
||||||
typedef
|
|
||||||
EFI_STATUS
|
|
||||||
(EFIAPI *EFI_SYS_CALL_BOOT_SERVICE)(
|
|
||||||
IN UINT8 Type,
|
|
||||||
IN VOID *CoreRbp,
|
|
||||||
IN VOID *UserRsp
|
|
||||||
);
|
|
||||||
|
|
||||||
STATIC CHAR8 *gExceptionTypeString[] = {
|
STATIC CHAR8 *gExceptionTypeString[] = {
|
||||||
"Synchronous",
|
"Synchronous",
|
||||||
"IRQ",
|
"IRQ",
|
||||||
@ -195,10 +188,10 @@ BaseName (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InitializeSysCallHandler (
|
InitializeSysCallHandler (
|
||||||
IN VOID *Handler
|
IN EFI_SYS_CALL_BOOT_SERVICE Handler
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
mSysCallHandler = (EFI_SYS_CALL_BOOT_SERVICE)Handler;
|
mSysCallHandler = Handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -39,6 +39,8 @@ typedef struct {
|
|||||||
CHAR8 Char;
|
CHAR8 Char;
|
||||||
} CPSR_CHAR;
|
} CPSR_CHAR;
|
||||||
|
|
||||||
|
STATIC EFI_SYS_CALL_BOOT_SERVICE mSysCallHandler;
|
||||||
|
|
||||||
STATIC CONST CPSR_CHAR mCpsrChar[] = {
|
STATIC CONST CPSR_CHAR mCpsrChar[] = {
|
||||||
{ 31, 'n' },
|
{ 31, 'n' },
|
||||||
{ 30, 'z' },
|
{ 30, 'z' },
|
||||||
@ -187,6 +189,15 @@ STATIC CHAR8 *gExceptionTypeString[] = {
|
|||||||
"FIQ"
|
"FIQ"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
InitializeSysCallHandler (
|
||||||
|
IN EFI_SYS_CALL_BOOT_SERVICE Handler
|
||||||
|
)
|
||||||
|
{
|
||||||
|
mSysCallHandler = Handler;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This is the default action to take on an unexpected exception
|
This is the default action to take on an unexpected exception
|
||||||
|
|
||||||
@ -212,6 +223,14 @@ DefaultExceptionHandler (
|
|||||||
BOOLEAN DfsrWrite;
|
BOOLEAN DfsrWrite;
|
||||||
UINT32 PcAdjust;
|
UINT32 PcAdjust;
|
||||||
|
|
||||||
|
if (ExceptionType == EXCEPT_ARM_SOFTWARE_INTERRUPT) {
|
||||||
|
return mSysCallHandler (
|
||||||
|
SystemContext.SystemContextArm->R0,
|
||||||
|
&(SystemContext.SystemContextArm->R1),
|
||||||
|
&(SystemContext.SystemContextArm->SP)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
PcAdjust = 0;
|
PcAdjust = 0;
|
||||||
|
|
||||||
CharCount = AsciiSPrint (
|
CharCount = AsciiSPrint (
|
||||||
|
@ -22,26 +22,6 @@
|
|||||||
ASM_FUNC(CallInstallMultipleProtocolInterfaces)
|
ASM_FUNC(CallInstallMultipleProtocolInterfaces)
|
||||||
bx LR
|
bx LR
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// 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)
|
|
||||||
bx LR
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// EFI_STATUS
|
// EFI_STATUS
|
||||||
// EFIAPI
|
// EFIAPI
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
**/
|
**/
|
||||||
|
|
||||||
#include <Library/ArmLib.h>
|
#include <Library/ArmLib.h>
|
||||||
|
#include <Library/DefaultExceptionHandlerLib.h>
|
||||||
|
|
||||||
#include "DxeMain.h"
|
#include "DxeMain.h"
|
||||||
|
|
||||||
@ -33,6 +34,50 @@ ArmClearPan (
|
|||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
|
STATIC
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
SysCallBootService (
|
||||||
|
IN UINT8 Type,
|
||||||
|
IN VOID *CoreRbp,
|
||||||
|
IN VOID *UserRsp
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_PHYSICAL_ADDRESS Physical;
|
||||||
|
|
||||||
|
Status = CoreAllocatePages (
|
||||||
|
AllocateAnyPages,
|
||||||
|
EfiRing3MemoryType,
|
||||||
|
EFI_SIZE_TO_PAGES (9 * sizeof (UINTN)),
|
||||||
|
&Physical
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
DisableSMAP ();
|
||||||
|
//
|
||||||
|
// First 3 arguments are passed through R1-R3 and copied to SysCall Stack.
|
||||||
|
//
|
||||||
|
CopyMem ((VOID *)((UINTN)Physical + sizeof (UINTN)), (VOID *)CoreRbp, 3 * sizeof (UINTN));
|
||||||
|
//
|
||||||
|
// All remaining arguments are on User Stack.
|
||||||
|
//
|
||||||
|
CopyMem ((VOID *)((UINTN)Physical + 4 * sizeof (UINTN)), (VOID *)UserRsp, 5 * sizeof (UINTN));
|
||||||
|
EnableSMAP ();
|
||||||
|
|
||||||
|
Status = CallBootService (
|
||||||
|
Type,
|
||||||
|
(CORE_STACK *)CoreRbp,
|
||||||
|
(RING3_STACK *)(UINTN)Physical
|
||||||
|
);
|
||||||
|
|
||||||
|
CoreFreePages (Physical, EFI_SIZE_TO_PAGES (9 * sizeof (UINTN)));
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InitializeMsr (
|
InitializeMsr (
|
||||||
@ -49,6 +94,8 @@ InitializeMsr (
|
|||||||
DEBUG ((DEBUG_ERROR, "Core: Failed to initialize MSRs for Ring3.\n"));
|
DEBUG ((DEBUG_ERROR, "Core: Failed to initialize MSRs for Ring3.\n"));
|
||||||
// ASSERT (FALSE);
|
// ASSERT (FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
InitializeSysCallHandler (SysCallBootService);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
Loading…
x
Reference in New Issue
Block a user