diff --git a/MdeModulePkg/Core/Dxe/SysCall/X64/CoreBootServices.nasm b/MdeModulePkg/Core/Dxe/SysCall/X64/CoreBootServices.nasm index 0ab6eebd3a..90bcd4a0a0 100644 --- a/MdeModulePkg/Core/Dxe/SysCall/X64/CoreBootServices.nasm +++ b/MdeModulePkg/Core/Dxe/SysCall/X64/CoreBootServices.nasm @@ -123,6 +123,10 @@ 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 @@ -229,6 +233,8 @@ ASM_PFX(CallRing3): o64 sysret coreReturnAddress: + mov rsp, [ASM_PFX(CoreRsp)] + mov rbp, [ASM_PFX(CoreRbp)] ret SECTION .data diff --git a/MdeModulePkg/Core/Dxe/SysCall/X64/Ring3Dxe.nasm b/MdeModulePkg/Core/Dxe/SysCall/X64/Ring3Dxe.nasm index 09f0d866d2..410f6b41e6 100644 --- a/MdeModulePkg/Core/Dxe/SysCall/X64/Ring3Dxe.nasm +++ b/MdeModulePkg/Core/Dxe/SysCall/X64/Ring3Dxe.nasm @@ -28,5 +28,7 @@ ASM_PFX(_ModuleEntryPoint): mov rdx, r9 call r8 - - ret + + mov r10, 0 + + syscall diff --git a/MdePkg/Include/Uefi/UefiSpec.h b/MdePkg/Include/Uefi/UefiSpec.h index 82697b0c99..730cb1050d 100644 --- a/MdePkg/Include/Uefi/UefiSpec.h +++ b/MdePkg/Include/Uefi/UefiSpec.h @@ -2014,6 +2014,7 @@ typedef struct { } EFI_BOOT_SERVICES; typedef enum { + SysCallReturnToCore = 0, SysCallLocateProtocol = 1, SysCallOpenProtocol = 2, SysCallInstallMultipleProtocolInterfaces = 3,