From b4e4d6e5c4796d1b112d08db03404c7204768ec8 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 22 Jun 2011 20:15:58 +0000 Subject: [PATCH] [NTOSKRNL] Optimize KiSystemCallTrampoline inline assembly for MSVC. save one register, use eax for the handler address and don't assign to an intermediate variable before returning (hint by Alex) svn path=/trunk/; revision=52430 --- reactos/ntoskrnl/include/internal/i386/ke.h | 35 ++++++++++++--------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/i386/ke.h b/reactos/ntoskrnl/include/internal/i386/ke.h index 595cf46be37..61c2f71d603 100644 --- a/reactos/ntoskrnl/include/internal/i386/ke.h +++ b/reactos/ntoskrnl/include/internal/i386/ke.h @@ -600,13 +600,6 @@ KiDispatchException2Args(IN NTSTATUS Code, // // Performs a system call // -NTSTATUS -FORCEINLINE -KiSystemCallTrampoline(IN PVOID Handler, - IN PVOID Arguments, - IN ULONG StackBytes) -{ - NTSTATUS Result; /* * This sequence does a RtlCopyMemory(Stack - StackBytes, Arguments, StackBytes) @@ -624,6 +617,14 @@ KiSystemCallTrampoline(IN PVOID Handler, * */ #ifdef __GNUC__ +NTSTATUS +FORCEINLINE +KiSystemCallTrampoline(IN PVOID Handler, + IN PVOID Arguments, + IN ULONG StackBytes) +{ + NTSTATUS Result; + __asm__ __volatile__ ( "subl %1, %%esp\n" @@ -639,26 +640,32 @@ KiSystemCallTrampoline(IN PVOID Handler, "r"(Handler) : "%esp", "%esi", "%edi" ); + return Result; +} #elif defined(_MSC_VER) +NTSTATUS +FORCEINLINE +KiSystemCallTrampoline(IN PVOID Handler, + IN PVOID Arguments, + IN ULONG StackBytes) +{ __asm { mov ecx, StackBytes - mov edx, Arguments - mov ebx, Handler + mov esi, Arguments + mov eax, Handler sub esp, ecx mov edi, esp - mov esi, edx shr ecx, 2 rep movsd - call ebx - mov Result, eax + call eax } + /* Return with result in EAX */ +} #else #error Unknown Compiler #endif - return Result; -} // // Checks for pending APCs