diff --git a/MdeModulePkg/Core/Dxe/DxeMain.h b/MdeModulePkg/Core/Dxe/DxeMain.h index 60b60ac441..eeda21ad3b 100644 --- a/MdeModulePkg/Core/Dxe/DxeMain.h +++ b/MdeModulePkg/Core/Dxe/DxeMain.h @@ -2727,7 +2727,9 @@ EFI_STATUS EFIAPI CallBootService ( IN UINT8 Type, - IN UINTN *UserArguments + IN UINTN *UserArguments, + IN UINTN UserStackTop, + IN UINTN SysCallStackTop ); VOID diff --git a/MdeModulePkg/Core/Dxe/SysCall/AARCH64/CoreBootServices.S b/MdeModulePkg/Core/Dxe/SysCall/AARCH64/CoreBootServices.S index 45264f3197..f0bf051cde 100644 --- a/MdeModulePkg/Core/Dxe/SysCall/AARCH64/CoreBootServices.S +++ b/MdeModulePkg/Core/Dxe/SysCall/AARCH64/CoreBootServices.S @@ -92,7 +92,7 @@ ASM_FUNC(ArmCallRing3) // Disable interrupts. msr daifset, #0xf isb - // Save Core SP and switch to CoreSysCall Stack. + // Save Core SP and switch to SysCallStackTop. mov x6, sp str x6, [x4] mov sp, x3 diff --git a/MdeModulePkg/Core/Dxe/SysCall/AARCH64/InitializeAARCH64.c b/MdeModulePkg/Core/Dxe/SysCall/AARCH64/InitializeAARCH64.c index c7076578b3..0802050fe2 100644 --- a/MdeModulePkg/Core/Dxe/SysCall/AARCH64/InitializeAARCH64.c +++ b/MdeModulePkg/Core/Dxe/SysCall/AARCH64/InitializeAARCH64.c @@ -13,17 +13,17 @@ #include "DxeMain.h" STATIC UINTN mCoreSp; +STATIC UINTN mUserStackTop; +STATIC UINTN mSysCallStackTop; UINTN gUserPageTable; -UINTN mRing3CallStackTop; -UINTN mCoreSysCallStackTop; EFI_STATUS EFIAPI ArmCallRing3 ( IN RING3_CALL_DATA *Data, - IN UINTN StackPointer, + IN UINTN UserStackTop, IN VOID *EntryPoint, - IN UINTN SysCallStack, + IN UINTN SysCallStackTop, IN VOID *CoreStack, IN UINTN UserPageTable ); @@ -74,7 +74,9 @@ SysCallBootService ( Status = CallBootService ( Type, - (UINTN *)((UINTN)Physical + sizeof (UINTN)) + (UINTN *)((UINTN)Physical + sizeof (UINTN)), + mUserStackTop, + mSysCallStackTop ); CoreFreePages (Physical, EFI_SIZE_TO_PAGES (9 * sizeof (UINTN))); @@ -173,8 +175,15 @@ CallRing3 ( IN UINTN SysCallStackTop ) { - mRing3CallStackTop = UserStackTop; - mCoreSysCallStackTop = SysCallStackTop; + mUserStackTop = UserStackTop; + mSysCallStackTop = SysCallStackTop; - return ArmCallRing3 (Data, UserStackTop, gRing3EntryPoint, SysCallStackTop, &mCoreSp, gUserPageTable); + return ArmCallRing3 ( + Data, + UserStackTop, + gRing3EntryPoint, + SysCallStackTop, + &mCoreSp, + gUserPageTable + ); } diff --git a/MdeModulePkg/Core/Dxe/SysCall/ARM/CoreBootServices.S b/MdeModulePkg/Core/Dxe/SysCall/ARM/CoreBootServices.S index 03b326f20d..1a324bb0c5 100644 --- a/MdeModulePkg/Core/Dxe/SysCall/ARM/CoreBootServices.S +++ b/MdeModulePkg/Core/Dxe/SysCall/ARM/CoreBootServices.S @@ -94,7 +94,7 @@ ASM_FUNC(ArmCallRing3) // Set SPSR M[3:0] bits to User mode. and R4, R4, #0xFFFFFFF0 - // Save Core SP and switch to CoreSysCall Stack. + // Save Core SP and switch to SysCallStackTop. mov R5, SP str R5, [R6] mov SP, R3 diff --git a/MdeModulePkg/Core/Dxe/SysCall/ARM/InitializeARM.c b/MdeModulePkg/Core/Dxe/SysCall/ARM/InitializeARM.c index ec368ed17e..ee3675f6cc 100644 --- a/MdeModulePkg/Core/Dxe/SysCall/ARM/InitializeARM.c +++ b/MdeModulePkg/Core/Dxe/SysCall/ARM/InitializeARM.c @@ -12,17 +12,17 @@ #include "DxeMain.h" STATIC UINTN mCoreSp; +STATIC UINTN mUserStackTop; +STATIC UINTN mSysCallStackTop; UINTN gUserPageTable; -UINTN mRing3CallStackTop; -UINTN mCoreSysCallStackTop; EFI_STATUS EFIAPI ArmCallRing3 ( IN RING3_CALL_DATA *Data, - IN UINTN StackPointer, + IN UINTN UserStackTop, IN VOID *EntryPoint, - IN UINTN SysCallStack, + IN UINTN SysCallStackTop, IN VOID *CoreStack, IN UINTN UserPageTable ); @@ -80,7 +80,9 @@ SysCallBootService ( Status = CallBootService ( Type, - (UINTN *)((UINTN)Physical + sizeof (UINTN)) + (UINTN *)((UINTN)Physical + sizeof (UINTN)), + mUserStackTop, + mSysCallStackTop ); // // TODO: Fix memory leak for ReturnToCore(). @@ -168,8 +170,15 @@ CallRing3 ( IN UINTN SysCallStackTop ) { - mRing3CallStackTop = UserStackTop; - mCoreSysCallStackTop = SysCallStackTop; + mUserStackTop = UserStackTop; + mSysCallStackTop = SysCallStackTop; - return ArmCallRing3 (Data, UserStackTop, gRing3EntryPoint, SysCallStackTop, &mCoreSp, gUserPageTable); + return ArmCallRing3 ( + Data, + UserStackTop, + gRing3EntryPoint, + SysCallStackTop, + &mCoreSp, + gUserPageTable + ); } diff --git a/MdeModulePkg/Core/Dxe/SysCall/BootServices.c b/MdeModulePkg/Core/Dxe/SysCall/BootServices.c index bcad4bc769..c0a84d94b1 100644 --- a/MdeModulePkg/Core/Dxe/SysCall/BootServices.c +++ b/MdeModulePkg/Core/Dxe/SysCall/BootServices.c @@ -8,9 +8,6 @@ #include "DxeMain.h" #include "SupportedProtocols.h" -extern UINTN mRing3CallStackTop; -extern UINTN mCoreSysCallStackTop; - LIST_ENTRY mProtocolsHead = INITIALIZE_LIST_HEAD_VARIABLE (mProtocolsHead); typedef struct { @@ -311,7 +308,9 @@ EFI_STATUS EFIAPI CallBootService ( IN UINT8 Type, - IN UINTN *UserArguments + IN UINTN *UserArguments, + IN UINTN UserStackTop, + IN UINTN SysCallStackTop ) { EFI_STATUS Status; @@ -504,8 +503,8 @@ CallBootService ( UserDriver->CoreWrapper = CoreArgList[Index + 1]; UserDriver->UserSpaceDriver = UserArgList[Index + 1]; UserDriver->UserPageTable = gUserPageTable; - UserDriver->SysCallStackTop = mCoreSysCallStackTop; - UserDriver->UserStackTop = mRing3CallStackTop; + UserDriver->UserStackTop = UserStackTop; + UserDriver->SysCallStackTop = SysCallStackTop; InsertTailList (&mUserSpaceDriversHead, &UserDriver->Link); diff --git a/MdeModulePkg/Core/Dxe/SysCall/IA32/CoreBootServices.nasm b/MdeModulePkg/Core/Dxe/SysCall/IA32/CoreBootServices.nasm index bf70807f32..3f79aa05e1 100644 --- a/MdeModulePkg/Core/Dxe/SysCall/IA32/CoreBootServices.nasm +++ b/MdeModulePkg/Core/Dxe/SysCall/IA32/CoreBootServices.nasm @@ -133,6 +133,8 @@ ASM_PFX(CoreBootServices): ; Prepare CallBootService arguments. mov ebp, esp + push dword [ASM_PFX(SysCallStackTop)] + push dword [ASM_PFX(UserStackTop)] add edx, 4 ; User Arguments[] push edx push ecx ; Type @@ -150,7 +152,7 @@ ASM_PFX(CoreBootServices): pop eax ; Step over CallBootService input. - add esp, 4*2 + mov esp, ebp ; Prepare SYSEXIT arguments. pop edx ; User return address. @@ -169,7 +171,7 @@ ASM_PFX(CoreBootServices): ; IN UINTN SysCallStackTop ; ); ; -; (On User Stack) Data +; (On User Stack) Data, UserStackTop, SysCallStackTop ;------------------------------------------------------------------------------ global ASM_PFX(CallRing3) ASM_PFX(CallRing3): @@ -183,23 +185,20 @@ ASM_PFX(CallRing3): ; Save Core Stack pointer. mov [ASM_PFX(CoreEsp)], esp - mov ebx, [esp + 4 * 6] ; UserStackTop - mov [ASM_PFX(mRing3CallStackTop)], ebx - mov ebx, [esp + 4 * 7] ; SysCallStackTop - mov [ASM_PFX(mCoreSysCallStackTop)], ebx + mov ebx, [esp + 4 * 6] + mov [ASM_PFX(UserStackTop)], ebx + mov ebx, [esp + 4 * 7] + mov [ASM_PFX(SysCallStackTop)], ebx mov edx, 0 mov eax, ebx mov ecx, MSR_IA32_SYSENTER_ESP wrmsr - push dword [ASM_PFX(gRing3EntryPoint)] - push dword [ASM_PFX(mRing3CallStackTop)] - SetRing3DataSegmentSelectors ; Prepare SYSEXIT arguments. - pop ecx - pop edx + mov ecx, [ASM_PFX(UserStackTop)] + mov edx, [ASM_PFX(gRing3EntryPoint)] mov eax, [esp + 4 * 5] ; Data ; Switch to User Stack. @@ -251,10 +250,8 @@ ALIGN 4096 ASM_PFX(CoreEsp): resd 1 -global ASM_PFX(mRing3CallStackTop) -ASM_PFX(mRing3CallStackTop): +ASM_PFX(UserStackTop): resd 1 -global ASM_PFX(mCoreSysCallStackTop) -ASM_PFX(mCoreSysCallStackTop): +ASM_PFX(SysCallStackTop): resd 1 diff --git a/MdeModulePkg/Core/Dxe/SysCall/X64/CoreBootServices.nasm b/MdeModulePkg/Core/Dxe/SysCall/X64/CoreBootServices.nasm index b3888c37c5..72b20f7289 100644 --- a/MdeModulePkg/Core/Dxe/SysCall/X64/CoreBootServices.nasm +++ b/MdeModulePkg/Core/Dxe/SysCall/X64/CoreBootServices.nasm @@ -138,7 +138,7 @@ ASM_PFX(CoreBootServices): mov gs, ax ; Save User Stack pointers and switch to Core SysCall Stack. - mov rax, [ASM_PFX(mCoreSysCallStackTop)] + mov rax, [ASM_PFX(SysCallStackTop)] sub rax, 8 mov [rax], rsp mov rsp, rax @@ -162,6 +162,8 @@ ASM_PFX(CoreBootServices): mov rcx, r10 ; Type mov rdx, [rbp + 8*3] add rdx, 8 ; User Arguments[] + mov r8, [ASM_PFX(UserStackTop)] + mov r9, [ASM_PFX(SysCallStackTop)] sti call ASM_PFX(CallBootService) @@ -221,20 +223,18 @@ ASM_PFX(CallRing3): mov [ASM_PFX(CoreRsp)], rsp ; Save input Arguments. - mov [ASM_PFX(mRing3CallStackTop)], rdx - mov [ASM_PFX(mCoreSysCallStackTop)], r8 - mov r8, [ASM_PFX(mRing3CallStackTop)] - mov r9, [ASM_PFX(gRing3EntryPoint)] + mov [ASM_PFX(UserStackTop)], rdx + mov [ASM_PFX(SysCallStackTop)], r8 mov r10, rcx SetRing3DataSegmentSelectors ; Prepare SYSRET arguments. mov rdx, r10 - mov rcx, r9 + mov rcx, [ASM_PFX(gRing3EntryPoint)] ; Switch to User Stack. - mov rsp, r8 + mov rsp, [ASM_PFX(UserStackTop)] mov rbp, rsp mov r8, [ASM_PFX(gUserPageTable)] @@ -284,10 +284,8 @@ ALIGN 4096 ASM_PFX(CoreRsp): resq 1 -global ASM_PFX(mRing3CallStackTop) -ASM_PFX(mRing3CallStackTop): +ASM_PFX(UserStackTop): resq 1 -global ASM_PFX(mCoreSysCallStackTop) -ASM_PFX(mCoreSysCallStackTop): +ASM_PFX(SysCallStackTop): resq 1