From 046dcae0e7a8131953fa5779e030be40278c2c67 Mon Sep 17 00:00:00 2001 From: Mikhail Krichanov Date: Mon, 2 Sep 2024 11:14:11 +0300 Subject: [PATCH] SysCall: Restored nonvolatile registers for IA32, X64. --- .../Dxe/SysCall/IA32/CoreBootServices.nasm | 18 +++++++------ .../Dxe/SysCall/X64/CoreBootServices.nasm | 25 ++++++++++++++----- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/MdeModulePkg/Core/Dxe/SysCall/IA32/CoreBootServices.nasm b/MdeModulePkg/Core/Dxe/SysCall/IA32/CoreBootServices.nasm index f0ae792209..32a8dad0dd 100644 --- a/MdeModulePkg/Core/Dxe/SysCall/IA32/CoreBootServices.nasm +++ b/MdeModulePkg/Core/Dxe/SysCall/IA32/CoreBootServices.nasm @@ -176,10 +176,14 @@ ASM_PFX(CoreBootServices): global ASM_PFX(CallRing3) ASM_PFX(CallRing3): cli + ; Save nonvolatile registers EBX, EBP, EDI, ESI, ESP. + push ebx + push ebp + push edi + push esi - ; Save Core Stack pointers. + ; Save Core Stack pointer. mov [ASM_PFX(CoreEsp)], esp - mov [ASM_PFX(CoreEbp)], ebp push dword [ASM_PFX(gRing3EntryPoint)] push dword [ASM_PFX(gRing3CallStackTop)] @@ -189,7 +193,7 @@ ASM_PFX(CallRing3): ; Prepare SYSEXIT arguments. pop ecx pop edx - mov eax, [esp + 4] ; Data + mov eax, [esp + 4 * 5] ; Data ; Switch to User Stack. mov ebp, ecx @@ -200,7 +204,10 @@ ASM_PFX(CallRing3): coreReturnAddress: mov esp, [ASM_PFX(CoreEsp)] - mov ebp, [ASM_PFX(CoreEbp)] + pop esi + pop edi + pop ebp + pop ebx call ASM_PFX(DisableSMAP) mov eax, [edx + 2 * 4] ; User Argument 1 @@ -214,6 +221,3 @@ coreReturnAddress: SECTION .data ASM_PFX(CoreEsp): resd 1 - -ASM_PFX(CoreEbp): - resd 1 diff --git a/MdeModulePkg/Core/Dxe/SysCall/X64/CoreBootServices.nasm b/MdeModulePkg/Core/Dxe/SysCall/X64/CoreBootServices.nasm index 555387bba7..a18680ed6c 100644 --- a/MdeModulePkg/Core/Dxe/SysCall/X64/CoreBootServices.nasm +++ b/MdeModulePkg/Core/Dxe/SysCall/X64/CoreBootServices.nasm @@ -195,10 +195,18 @@ ASM_PFX(CallRing3): pushfq pop r11 cli + ; Save nonvolatile registers RBX, RBP, RDI, RSI, RSP, R12, R13, R14, and R15. + push rbx + push rbp + push rdi + push rsi + push r12 + push r13 + push r14 + push r15 - ; Save Core Stack pointers. + ; Save Core Stack pointer. mov [ASM_PFX(CoreRsp)], rsp - mov [ASM_PFX(CoreRbp)], rbp ; Save input Arguments. mov r8, [ASM_PFX(gRing3CallStackTop)] @@ -220,7 +228,15 @@ o64 sysret coreReturnAddress: mov rsp, [ASM_PFX(CoreRsp)] - mov rbp, [ASM_PFX(CoreRbp)] + pop r15 + pop r14 + pop r13 + pop r12 + pop rsi + pop rdi + pop rbp + pop rbx + mov rax, rdx sti ret @@ -228,6 +244,3 @@ coreReturnAddress: SECTION .data ASM_PFX(CoreRsp): resq 1 - -ASM_PFX(CoreRbp): - resq 1