From 7f8eb4d2f6033ba83ea914cff465aa5a4c45353a Mon Sep 17 00:00:00 2001 From: Mikhail Krichanov Date: Mon, 9 Sep 2024 11:48:53 +0300 Subject: [PATCH] SysCall: Refactored SysCallReturnToCore handling to fix CLANGDWARF NOOPT. --- .../Core/Dxe/SysCall/AARCH64/InitializeMsr.c | 3 +++ MdeModulePkg/Core/Dxe/SysCall/BootServices.c | 9 ++++++++ .../Dxe/SysCall/IA32/CoreBootServices.nasm | 22 +++++++++---------- .../Dxe/SysCall/X64/CoreBootServices.nasm | 16 +++++++++----- MdePkg/Include/Uefi/UefiSpec.h | 2 +- 5 files changed, 34 insertions(+), 18 deletions(-) diff --git a/MdeModulePkg/Core/Dxe/SysCall/AARCH64/InitializeMsr.c b/MdeModulePkg/Core/Dxe/SysCall/AARCH64/InitializeMsr.c index 3ab3bffde7..7d11e063fe 100644 --- a/MdeModulePkg/Core/Dxe/SysCall/AARCH64/InitializeMsr.c +++ b/MdeModulePkg/Core/Dxe/SysCall/AARCH64/InitializeMsr.c @@ -45,6 +45,9 @@ SysCallBootService ( EFI_PHYSICAL_ADDRESS Physical; if (Type == SysCallReturnToCore) { + // + // TODO: Refactoring + // ReturnToCore (*(EFI_STATUS *)CoreRbp, mCoreSp); } diff --git a/MdeModulePkg/Core/Dxe/SysCall/BootServices.c b/MdeModulePkg/Core/Dxe/SysCall/BootServices.c index fabbb41e5f..aafdf60412 100644 --- a/MdeModulePkg/Core/Dxe/SysCall/BootServices.c +++ b/MdeModulePkg/Core/Dxe/SysCall/BootServices.c @@ -65,6 +65,12 @@ CallInstallMultipleProtocolInterfaces ( IN VOID *Function ); +VOID +EFIAPI +ReturnToCore ( + IN EFI_STATUS Status + ); + VOID EFIAPI FreeProtocolsList ( @@ -318,6 +324,9 @@ CallBootService ( DEBUG ((DEBUG_VERBOSE, "Type: %a\n", SysCallNames[Type])); switch (Type) { + case SysCallReturnToCore: + ReturnToCore (CoreRbp->Argument1); + break; case SysCallLocateProtocol: // // Argument 1: EFI_GUID *Protocol diff --git a/MdeModulePkg/Core/Dxe/SysCall/IA32/CoreBootServices.nasm b/MdeModulePkg/Core/Dxe/SysCall/IA32/CoreBootServices.nasm index c4d3714f2c..af51544705 100644 --- a/MdeModulePkg/Core/Dxe/SysCall/IA32/CoreBootServices.nasm +++ b/MdeModulePkg/Core/Dxe/SysCall/IA32/CoreBootServices.nasm @@ -126,10 +126,6 @@ ASM_PFX(CoreBootServices): mov fs, ax mov gs, ax - ; Special case for SysCallReturnToCore. - cmp ecx, 0 - je coreReturnAddress - ; Prepare CallBootService arguments. call ASM_PFX(AllowSupervisorAccessToUserMemory) mov eax, [edx + 4 * 4] ; User Argument 3 @@ -202,19 +198,23 @@ ASM_PFX(CallRing3): sti sysexit -coreReturnAddress: +;------------------------------------------------------------------------------ +; VOID +; EFIAPI +; ReturnToCore ( +; IN EFI_STATUS Status +; ); +;------------------------------------------------------------------------------ +global ASM_PFX(ReturnToCore) +ASM_PFX(ReturnToCore): + mov eax, [esp + 4] + mov esp, [ASM_PFX(CoreEsp)] pop esi pop edi pop ebp pop ebx - call ASM_PFX(AllowSupervisorAccessToUserMemory) - mov eax, [edx + 2 * 4] ; User Argument 1 - push eax - call ASM_PFX(ForbidSupervisorAccessToUserMemory) - pop eax - sti ret diff --git a/MdeModulePkg/Core/Dxe/SysCall/X64/CoreBootServices.nasm b/MdeModulePkg/Core/Dxe/SysCall/X64/CoreBootServices.nasm index 3f9f4661ce..9d72b81935 100644 --- a/MdeModulePkg/Core/Dxe/SysCall/X64/CoreBootServices.nasm +++ b/MdeModulePkg/Core/Dxe/SysCall/X64/CoreBootServices.nasm @@ -132,10 +132,6 @@ ASM_PFX(CoreBootServices): mov fs, ax mov gs, ax - ; Special case for SysCallReturnToCore. - cmp r10, 0 - je coreReturnAddress - ; Save User Stack pointers and switch to Core SysCall Stack. mov rax, [ASM_PFX(gCoreSysCallStackTop)] sub rax, 8 @@ -228,7 +224,15 @@ ASM_PFX(CallRing3): ; Pass control to user image o64 sysret -coreReturnAddress: +;------------------------------------------------------------------------------ +; VOID +; EFIAPI +; ReturnToCore ( +; IN EFI_STATUS Status +; ); +;------------------------------------------------------------------------------ +global ASM_PFX(ReturnToCore) +ASM_PFX(ReturnToCore): mov rsp, [ASM_PFX(CoreRsp)] pop r15 pop r14 @@ -239,7 +243,7 @@ coreReturnAddress: pop rbp pop rbx - mov rax, rdx + mov rax, rcx sti ret diff --git a/MdePkg/Include/Uefi/UefiSpec.h b/MdePkg/Include/Uefi/UefiSpec.h index b6273143eb..26a7fbf235 100644 --- a/MdePkg/Include/Uefi/UefiSpec.h +++ b/MdePkg/Include/Uefi/UefiSpec.h @@ -2029,7 +2029,7 @@ typedef enum { // // BootServices // - SysCallReturnToCore, // Must always be zero for CoreBootServices.nasm. + SysCallReturnToCore, SysCallLocateProtocol, SysCallOpenProtocol, SysCallInstallMultipleProtocolInterfaces,