SysCall: Refactored out mRing3CallStackTop and mCoreSysCallStackTop.

This commit is contained in:
Mikhail Krichanov 2025-01-14 12:02:38 +03:00
parent 08df5ddf53
commit 708ea60bc3
8 changed files with 65 additions and 51 deletions

View File

@ -2727,7 +2727,9 @@ EFI_STATUS
EFIAPI
CallBootService (
IN UINT8 Type,
IN UINTN *UserArguments
IN UINTN *UserArguments,
IN UINTN UserStackTop,
IN UINTN SysCallStackTop
);
VOID

View File

@ -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

View File

@ -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
);
}

View File

@ -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

View File

@ -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
);
}

View File

@ -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);

View File

@ -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

View File

@ -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