mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-24 06:04:52 +02:00
SysCall: Refactored out mRing3CallStackTop and mCoreSysCallStackTop.
This commit is contained in:
parent
8587830d67
commit
ae0465017f
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user