https://git.reactos.org/?p=reactos.git;a=commitdiff;h=3d18831c197d3d03109d4…
commit 3d18831c197d3d03109d4719dacd325517028cac
Author: Timo Kreuzer <timo.kreuzer(a)reactos.org>
AuthorDate: Thu Mar 8 12:23:45 2018 +0100
Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org>
CommitDate: Fri May 28 11:52:42 2021 +0200
[NTOS:KE] Improve KiSystemCallEntry64
---
ntoskrnl/ke/amd64/stubs.c | 15 +++------------
ntoskrnl/ke/amd64/trap.S | 49 ++++++++++++++++++++---------------------------
2 files changed, 24 insertions(+), 40 deletions(-)
diff --git a/ntoskrnl/ke/amd64/stubs.c b/ntoskrnl/ke/amd64/stubs.c
index 1afc1f54dea..56f13192620 100644
--- a/ntoskrnl/ke/amd64/stubs.c
+++ b/ntoskrnl/ke/amd64/stubs.c
@@ -260,10 +260,7 @@ NtSyscallFailure(void)
PVOID
KiSystemCallHandler(
- _In_ ULONG64 ReturnAddress,
- _In_ ULONG64 P2,
- _In_ ULONG64 P3,
- _In_ ULONG64 P4)
+ VOID)
{
PKTRAP_FRAME TrapFrame;
PKSERVICE_TABLE_DESCRIPTOR DescriptorTable;
@@ -275,12 +272,6 @@ KiSystemCallHandler(
/* Get a pointer to the trap frame */
TrapFrame = (PKTRAP_FRAME)((PULONG64)_AddressOfReturnAddress() + 1 +
MAX_SYSCALL_PARAMS);
- /* Save some values in the trap frame */
- TrapFrame->Rip = ReturnAddress;
- TrapFrame->Rdx = P2;
- TrapFrame->R8 = P3;
- TrapFrame->R9 = P4;
-
/* Increase system call count */
__addgsdword(FIELD_OFFSET(KIPCR, Prcb.KeSystemCalls), 1);
@@ -388,11 +379,11 @@ KiSystemCallHandler(
break;
default:
- __debugbreak();
+ ASSERT(FALSE);
break;
}
}
- _SEH2_EXCEPT(1)
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
TrapFrame->Rax = _SEH2_GetExceptionCode();
return (PVOID)NtSyscallFailure;
diff --git a/ntoskrnl/ke/amd64/trap.S b/ntoskrnl/ke/amd64/trap.S
index d0d1ab16edf..fffcc5d1b31 100644
--- a/ntoskrnl/ke/amd64/trap.S
+++ b/ntoskrnl/ke/amd64/trap.S
@@ -747,10 +747,10 @@ EXTERN KiSystemCallHandler:PROC
*--*/
PUBLIC KiSystemCallEntry64
.PROC KiSystemCallEntry64
-
- /* Old stack pointer is in rcx, lie and say we saved it in rbp */
- .setframe rbp, 0
- .endprolog
+ /* The unwind info pretends we have a machine frame */
+ .PUSHFRAME
+ .ALLOCSTACK (KTRAP_FRAME_LENGTH + MAX_SYSCALL_PARAM_SIZE - MachineFrameLength)
+ .ENDPROLOG
/* Swap gs to kernel, so we can access the PCR */
swapgs
@@ -763,29 +763,26 @@ PUBLIC KiSystemCallEntry64
/* Allocate a TRAP_FRAME and space for parameters */
sub rsp, (KTRAP_FRAME_LENGTH + MAX_SYSCALL_PARAM_SIZE)
-#if DBG
- /* Save rbp and load it with the old stack pointer */
- mov [rsp + MAX_SYSCALL_PARAM_SIZE + KTRAP_FRAME_Rbp], rbp
- mov rbp, gs:[PcUserRsp]
-#endif
- /* Save important registers in the trap frame */
+ /* Save volatile registers in the trap frame */
mov [rsp + MAX_SYSCALL_PARAM_SIZE + KTRAP_FRAME_Rax], rax
+ mov [rsp + MAX_SYSCALL_PARAM_SIZE + KTRAP_FRAME_Rip], rcx
+ mov [rsp + MAX_SYSCALL_PARAM_SIZE + KTRAP_FRAME_Rdx], rdx
+ mov [rsp + MAX_SYSCALL_PARAM_SIZE + KTRAP_FRAME_R8], r8
+ mov [rsp + MAX_SYSCALL_PARAM_SIZE + KTRAP_FRAME_R9], r9
mov [rsp + MAX_SYSCALL_PARAM_SIZE + KTRAP_FRAME_Rcx], r10
mov [rsp + MAX_SYSCALL_PARAM_SIZE + KTRAP_FRAME_EFlags], r11
+ /* Store user stack pointer in the trap frame */
+ mov rax, gs:[PcUserRsp]
+ mov [rsp + MAX_SYSCALL_PARAM_SIZE + KTRAP_FRAME_Rsp], rax
+
/* Set sane segments */
mov ax, (KGDT64_R3_DATA or RPL_MASK)
mov ds, ax
mov es, ax
-.ENDP
-
-.PROC KiSystemCall64Again
-
- /* Old stack pointer is in rcx, lie and say we saved it in rbp */
- .setframe rbp, 0
- .endprolog
+GLOBAL_LABEL KiSystemCall64Again
/* Call the C-handler (will enable interrupts) */
call KiSystemCallHandler
@@ -797,19 +794,9 @@ PUBLIC KiSystemCallEntry64
mov r9, [rsp + MAX_SYSCALL_PARAM_SIZE + KTRAP_FRAME_R9]
call rax
-.ENDP
-
-PUBLIC KiSystemServiceExit
-.PROC KiSystemServiceExit
-
- /* Old stack pointer is in rcx, lie and say we saved it in rbp */
- .setframe rbp, 0
- .endprolog
+GLOBAL_LABEL KiSystemServiceExit
#if DBG
- /* Restore rbp */
- mov rbp, [rsp + MAX_SYSCALL_PARAM_SIZE + KTRAP_FRAME_Rbp]
-
test dword ptr [rsp + MAX_SYSCALL_PARAM_SIZE + KTRAP_FRAME_EFlags], HEX(200)
jnz IntsEnabled
int 3
@@ -838,6 +825,12 @@ no_user_apc_pending:
/* Load user mode stack (It was copied to the trap frame) */
mov rsp, [rsp + MAX_SYSCALL_PARAM_SIZE + KTRAP_FRAME_Rsp]
+ /* r8 points to the user stack */
+ mov r8, rsp
+
+ /* r9 matches rbp */
+ mov r9, rbp
+
/* Swap gs back to user */
swapgs