SysCall: Refactored ReturnToCore() for AARCH64, ARM.

This commit is contained in:
Mikhail Krichanov 2024-10-18 11:16:38 +03:00
parent 32768e43f3
commit 3cab34a4ba
4 changed files with 39 additions and 26 deletions

View File

@ -113,11 +113,13 @@ ASM_FUNC(ArmCallRing3)
// VOID
// EFIAPI
// ReturnToCore (
// IN EFI_STATUS Status,
// IN UINTN CoreSp
// IN EFI_STATUS Status
// );
//
// (x0) Status
// (x1) mCoreSp
//------------------------------------------------------------------------------
ASM_FUNC(ReturnToCore)
ASM_FUNC(ArmReturnToCore)
// Switch to Core Stack.
mov sp, x1
// Restore registers and Stack.

View File

@ -26,11 +26,20 @@ ArmCallRing3 (
VOID
EFIAPI
ReturnToCore (
ArmReturnToCore (
IN EFI_STATUS Status,
IN UINTN CoreSp
);
VOID
EFIAPI
ReturnToCore (
IN EFI_STATUS Status
)
{
ArmReturnToCore (Status, mCoreSp);
}
STATIC
EFI_STATUS
EFIAPI
@ -43,13 +52,6 @@ SysCallBootService (
EFI_STATUS Status;
EFI_PHYSICAL_ADDRESS Physical;
if (Type == SysCallReturnToCore) {
//
// TODO: Refactoring
//
ReturnToCore (*(EFI_STATUS *)CoreRbp, mCoreSp);
}
Status = CoreAllocatePages (
AllocateAnyPages,
EfiRing3MemoryType,

View File

@ -102,11 +102,13 @@ ASM_FUNC(ArmCallRing3)
// VOID
// EFIAPI
// ReturnToCore (
// IN EFI_STATUS Status,
// IN UINTN CoreSp
// IN EFI_STATUS Status
// );
//
// (r0) Status
// (r1) mCoreSp
//------------------------------------------------------------------------------
ASM_FUNC(ReturnToCore)
ASM_FUNC(ArmReturnToCore)
// Switch to Core Stack.
mov SP, R1

View File

@ -25,11 +25,20 @@ ArmCallRing3 (
VOID
EFIAPI
ReturnToCore (
ArmReturnToCore (
IN EFI_STATUS Status,
IN UINTN CoreSp
);
VOID
EFIAPI
ReturnToCore (
IN EFI_STATUS Status
)
{
ArmReturnToCore (Status, mCoreSp);
}
STATIC
EFI_STATUS
EFIAPI
@ -42,10 +51,6 @@ SysCallBootService (
EFI_STATUS Status;
EFI_PHYSICAL_ADDRESS Physical;
if (Type == SysCallReturnToCore) {
ReturnToCore (*(EFI_STATUS *)CoreRbp, mCoreSp);
}
Status = CoreAllocatePages (
AllocateAnyPages,
EfiRing3MemoryType,
@ -78,14 +83,16 @@ SysCallBootService (
(CORE_STACK *)CoreRbp,
(RING3_STACK *)(UINTN)Physical
);
//
// TODO: Fix memory leak for ReturnToCore().
//
CoreFreePages (Physical, EFI_SIZE_TO_PAGES (9 * sizeof (UINTN)));
CoreFreePages (Physical, EFI_SIZE_TO_PAGES (9 * sizeof (UINTN)));
SetUefiImageMemoryAttributes (
gUartBaseAddress,
EFI_PAGE_SIZE,
EFI_MEMORY_XP | EFI_MEMORY_USER
);
SetUefiImageMemoryAttributes (
gUartBaseAddress,
EFI_PAGE_SIZE,
EFI_MEMORY_XP | EFI_MEMORY_USER
);
return Status;
}