SysCall: Refactored out mRing3CallStackTop and mCoreSysCallStackTop.

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

View File

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

View File

@ -92,7 +92,7 @@ ASM_FUNC(ArmCallRing3)
// Disable interrupts. // Disable interrupts.
msr daifset, #0xf msr daifset, #0xf
isb isb
// Save Core SP and switch to CoreSysCall Stack. // Save Core SP and switch to SysCallStackTop.
mov x6, sp mov x6, sp
str x6, [x4] str x6, [x4]
mov sp, x3 mov sp, x3

View File

@ -13,17 +13,17 @@
#include "DxeMain.h" #include "DxeMain.h"
STATIC UINTN mCoreSp; STATIC UINTN mCoreSp;
STATIC UINTN mUserStackTop;
STATIC UINTN mSysCallStackTop;
UINTN gUserPageTable; UINTN gUserPageTable;
UINTN mRing3CallStackTop;
UINTN mCoreSysCallStackTop;
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
ArmCallRing3 ( ArmCallRing3 (
IN RING3_CALL_DATA *Data, IN RING3_CALL_DATA *Data,
IN UINTN StackPointer, IN UINTN UserStackTop,
IN VOID *EntryPoint, IN VOID *EntryPoint,
IN UINTN SysCallStack, IN UINTN SysCallStackTop,
IN VOID *CoreStack, IN VOID *CoreStack,
IN UINTN UserPageTable IN UINTN UserPageTable
); );
@ -74,7 +74,9 @@ SysCallBootService (
Status = CallBootService ( Status = CallBootService (
Type, Type,
(UINTN *)((UINTN)Physical + sizeof (UINTN)) (UINTN *)((UINTN)Physical + sizeof (UINTN)),
mUserStackTop,
mSysCallStackTop
); );
CoreFreePages (Physical, EFI_SIZE_TO_PAGES (9 * sizeof (UINTN))); CoreFreePages (Physical, EFI_SIZE_TO_PAGES (9 * sizeof (UINTN)));
@ -173,8 +175,15 @@ CallRing3 (
IN UINTN SysCallStackTop IN UINTN SysCallStackTop
) )
{ {
mRing3CallStackTop = UserStackTop; mUserStackTop = UserStackTop;
mCoreSysCallStackTop = SysCallStackTop; 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. // Set SPSR M[3:0] bits to User mode.
and R4, R4, #0xFFFFFFF0 and R4, R4, #0xFFFFFFF0
// Save Core SP and switch to CoreSysCall Stack. // Save Core SP and switch to SysCallStackTop.
mov R5, SP mov R5, SP
str R5, [R6] str R5, [R6]
mov SP, R3 mov SP, R3

View File

@ -12,17 +12,17 @@
#include "DxeMain.h" #include "DxeMain.h"
STATIC UINTN mCoreSp; STATIC UINTN mCoreSp;
STATIC UINTN mUserStackTop;
STATIC UINTN mSysCallStackTop;
UINTN gUserPageTable; UINTN gUserPageTable;
UINTN mRing3CallStackTop;
UINTN mCoreSysCallStackTop;
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
ArmCallRing3 ( ArmCallRing3 (
IN RING3_CALL_DATA *Data, IN RING3_CALL_DATA *Data,
IN UINTN StackPointer, IN UINTN UserStackTop,
IN VOID *EntryPoint, IN VOID *EntryPoint,
IN UINTN SysCallStack, IN UINTN SysCallStackTop,
IN VOID *CoreStack, IN VOID *CoreStack,
IN UINTN UserPageTable IN UINTN UserPageTable
); );
@ -80,7 +80,9 @@ SysCallBootService (
Status = CallBootService ( Status = CallBootService (
Type, Type,
(UINTN *)((UINTN)Physical + sizeof (UINTN)) (UINTN *)((UINTN)Physical + sizeof (UINTN)),
mUserStackTop,
mSysCallStackTop
); );
// //
// TODO: Fix memory leak for ReturnToCore(). // TODO: Fix memory leak for ReturnToCore().
@ -168,8 +170,15 @@ CallRing3 (
IN UINTN SysCallStackTop IN UINTN SysCallStackTop
) )
{ {
mRing3CallStackTop = UserStackTop; mUserStackTop = UserStackTop;
mCoreSysCallStackTop = SysCallStackTop; 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 "DxeMain.h"
#include "SupportedProtocols.h" #include "SupportedProtocols.h"
extern UINTN mRing3CallStackTop;
extern UINTN mCoreSysCallStackTop;
LIST_ENTRY mProtocolsHead = INITIALIZE_LIST_HEAD_VARIABLE (mProtocolsHead); LIST_ENTRY mProtocolsHead = INITIALIZE_LIST_HEAD_VARIABLE (mProtocolsHead);
typedef struct { typedef struct {
@ -311,7 +308,9 @@ EFI_STATUS
EFIAPI EFIAPI
CallBootService ( CallBootService (
IN UINT8 Type, IN UINT8 Type,
IN UINTN *UserArguments IN UINTN *UserArguments,
IN UINTN UserStackTop,
IN UINTN SysCallStackTop
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
@ -504,8 +503,8 @@ CallBootService (
UserDriver->CoreWrapper = CoreArgList[Index + 1]; UserDriver->CoreWrapper = CoreArgList[Index + 1];
UserDriver->UserSpaceDriver = UserArgList[Index + 1]; UserDriver->UserSpaceDriver = UserArgList[Index + 1];
UserDriver->UserPageTable = gUserPageTable; UserDriver->UserPageTable = gUserPageTable;
UserDriver->SysCallStackTop = mCoreSysCallStackTop; UserDriver->UserStackTop = UserStackTop;
UserDriver->UserStackTop = mRing3CallStackTop; UserDriver->SysCallStackTop = SysCallStackTop;
InsertTailList (&mUserSpaceDriversHead, &UserDriver->Link); InsertTailList (&mUserSpaceDriversHead, &UserDriver->Link);

View File

@ -133,6 +133,8 @@ ASM_PFX(CoreBootServices):
; Prepare CallBootService arguments. ; Prepare CallBootService arguments.
mov ebp, esp mov ebp, esp
push dword [ASM_PFX(SysCallStackTop)]
push dword [ASM_PFX(UserStackTop)]
add edx, 4 ; User Arguments[] add edx, 4 ; User Arguments[]
push edx push edx
push ecx ; Type push ecx ; Type
@ -150,7 +152,7 @@ ASM_PFX(CoreBootServices):
pop eax pop eax
; Step over CallBootService input. ; Step over CallBootService input.
add esp, 4*2 mov esp, ebp
; Prepare SYSEXIT arguments. ; Prepare SYSEXIT arguments.
pop edx ; User return address. pop edx ; User return address.
@ -169,7 +171,7 @@ ASM_PFX(CoreBootServices):
; IN UINTN SysCallStackTop ; IN UINTN SysCallStackTop
; ); ; );
; ;
; (On User Stack) Data ; (On User Stack) Data, UserStackTop, SysCallStackTop
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
global ASM_PFX(CallRing3) global ASM_PFX(CallRing3)
ASM_PFX(CallRing3): ASM_PFX(CallRing3):
@ -183,23 +185,20 @@ ASM_PFX(CallRing3):
; Save Core Stack pointer. ; Save Core Stack pointer.
mov [ASM_PFX(CoreEsp)], esp mov [ASM_PFX(CoreEsp)], esp
mov ebx, [esp + 4 * 6] ; UserStackTop mov ebx, [esp + 4 * 6]
mov [ASM_PFX(mRing3CallStackTop)], ebx mov [ASM_PFX(UserStackTop)], ebx
mov ebx, [esp + 4 * 7] ; SysCallStackTop mov ebx, [esp + 4 * 7]
mov [ASM_PFX(mCoreSysCallStackTop)], ebx mov [ASM_PFX(SysCallStackTop)], ebx
mov edx, 0 mov edx, 0
mov eax, ebx mov eax, ebx
mov ecx, MSR_IA32_SYSENTER_ESP mov ecx, MSR_IA32_SYSENTER_ESP
wrmsr wrmsr
push dword [ASM_PFX(gRing3EntryPoint)]
push dword [ASM_PFX(mRing3CallStackTop)]
SetRing3DataSegmentSelectors SetRing3DataSegmentSelectors
; Prepare SYSEXIT arguments. ; Prepare SYSEXIT arguments.
pop ecx mov ecx, [ASM_PFX(UserStackTop)]
pop edx mov edx, [ASM_PFX(gRing3EntryPoint)]
mov eax, [esp + 4 * 5] ; Data mov eax, [esp + 4 * 5] ; Data
; Switch to User Stack. ; Switch to User Stack.
@ -251,10 +250,8 @@ ALIGN 4096
ASM_PFX(CoreEsp): ASM_PFX(CoreEsp):
resd 1 resd 1
global ASM_PFX(mRing3CallStackTop) ASM_PFX(UserStackTop):
ASM_PFX(mRing3CallStackTop):
resd 1 resd 1
global ASM_PFX(mCoreSysCallStackTop) ASM_PFX(SysCallStackTop):
ASM_PFX(mCoreSysCallStackTop):
resd 1 resd 1

View File

@ -138,7 +138,7 @@ ASM_PFX(CoreBootServices):
mov gs, ax mov gs, ax
; Save User Stack pointers and switch to Core SysCall Stack. ; Save User Stack pointers and switch to Core SysCall Stack.
mov rax, [ASM_PFX(mCoreSysCallStackTop)] mov rax, [ASM_PFX(SysCallStackTop)]
sub rax, 8 sub rax, 8
mov [rax], rsp mov [rax], rsp
mov rsp, rax mov rsp, rax
@ -162,6 +162,8 @@ ASM_PFX(CoreBootServices):
mov rcx, r10 ; Type mov rcx, r10 ; Type
mov rdx, [rbp + 8*3] mov rdx, [rbp + 8*3]
add rdx, 8 ; User Arguments[] add rdx, 8 ; User Arguments[]
mov r8, [ASM_PFX(UserStackTop)]
mov r9, [ASM_PFX(SysCallStackTop)]
sti sti
call ASM_PFX(CallBootService) call ASM_PFX(CallBootService)
@ -221,20 +223,18 @@ ASM_PFX(CallRing3):
mov [ASM_PFX(CoreRsp)], rsp mov [ASM_PFX(CoreRsp)], rsp
; Save input Arguments. ; Save input Arguments.
mov [ASM_PFX(mRing3CallStackTop)], rdx mov [ASM_PFX(UserStackTop)], rdx
mov [ASM_PFX(mCoreSysCallStackTop)], r8 mov [ASM_PFX(SysCallStackTop)], r8
mov r8, [ASM_PFX(mRing3CallStackTop)]
mov r9, [ASM_PFX(gRing3EntryPoint)]
mov r10, rcx mov r10, rcx
SetRing3DataSegmentSelectors SetRing3DataSegmentSelectors
; Prepare SYSRET arguments. ; Prepare SYSRET arguments.
mov rdx, r10 mov rdx, r10
mov rcx, r9 mov rcx, [ASM_PFX(gRing3EntryPoint)]
; Switch to User Stack. ; Switch to User Stack.
mov rsp, r8 mov rsp, [ASM_PFX(UserStackTop)]
mov rbp, rsp mov rbp, rsp
mov r8, [ASM_PFX(gUserPageTable)] mov r8, [ASM_PFX(gUserPageTable)]
@ -284,10 +284,8 @@ ALIGN 4096
ASM_PFX(CoreRsp): ASM_PFX(CoreRsp):
resq 1 resq 1
global ASM_PFX(mRing3CallStackTop) ASM_PFX(UserStackTop):
ASM_PFX(mRing3CallStackTop):
resq 1 resq 1
global ASM_PFX(mCoreSysCallStackTop) ASM_PFX(SysCallStackTop):
ASM_PFX(mCoreSysCallStackTop):
resq 1 resq 1