Alexandre Julliard : kernel: Reimplemented the SMap/SUnmap functions
in assembly.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Jan 13 07:31:27 CST 2006
Module: wine
Branch: refs/heads/master
Commit: 643463b45603a8e2e8886875692e5833ebe46309
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=643463b45603a8e2e8886875692e5833ebe46309
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Jan 13 14:26:24 2006 +0100
kernel: Reimplemented the SMap/SUnmap functions in assembly.
---
dlls/kernel/kernel32.spec | 42 ++++++++++++-------------
dlls/kernel/selector.c | 76 ++++++++++++++++++++-------------------------
2 files changed, 54 insertions(+), 64 deletions(-)
diff --git a/dlls/kernel/kernel32.spec b/dlls/kernel/kernel32.spec
index 5524cd1..4c3a025 100644
--- a/dlls/kernel/kernel32.spec
+++ b/dlls/kernel/kernel32.spec
@@ -922,26 +922,26 @@
@ stdcall RtlMoveMemory(ptr ptr long) ntdll.RtlMoveMemory
@ stdcall RtlUnwind(ptr ptr ptr long) ntdll.RtlUnwind
@ stdcall RtlZeroMemory(ptr long) ntdll.RtlZeroMemory
-@ stdcall -i386 -register SMapLS()
-@ stdcall -i386 -register SMapLS_IP_EBP_12()
-@ stdcall -i386 -register SMapLS_IP_EBP_16()
-@ stdcall -i386 -register SMapLS_IP_EBP_20()
-@ stdcall -i386 -register SMapLS_IP_EBP_24()
-@ stdcall -i386 -register SMapLS_IP_EBP_28()
-@ stdcall -i386 -register SMapLS_IP_EBP_32()
-@ stdcall -i386 -register SMapLS_IP_EBP_36()
-@ stdcall -i386 -register SMapLS_IP_EBP_40()
-@ stdcall -i386 -register SMapLS_IP_EBP_8()
-@ stdcall -i386 -register SUnMapLS()
-@ stdcall -i386 -register SUnMapLS_IP_EBP_12()
-@ stdcall -i386 -register SUnMapLS_IP_EBP_16()
-@ stdcall -i386 -register SUnMapLS_IP_EBP_20()
-@ stdcall -i386 -register SUnMapLS_IP_EBP_24()
-@ stdcall -i386 -register SUnMapLS_IP_EBP_28()
-@ stdcall -i386 -register SUnMapLS_IP_EBP_32()
-@ stdcall -i386 -register SUnMapLS_IP_EBP_36()
-@ stdcall -i386 -register SUnMapLS_IP_EBP_40()
-@ stdcall -i386 -register SUnMapLS_IP_EBP_8()
+@ stdcall -i386 -norelay SMapLS()
+@ stdcall -i386 -norelay SMapLS_IP_EBP_12()
+@ stdcall -i386 -norelay SMapLS_IP_EBP_16()
+@ stdcall -i386 -norelay SMapLS_IP_EBP_20()
+@ stdcall -i386 -norelay SMapLS_IP_EBP_24()
+@ stdcall -i386 -norelay SMapLS_IP_EBP_28()
+@ stdcall -i386 -norelay SMapLS_IP_EBP_32()
+@ stdcall -i386 -norelay SMapLS_IP_EBP_36()
+@ stdcall -i386 -norelay SMapLS_IP_EBP_40()
+@ stdcall -i386 -norelay SMapLS_IP_EBP_8()
+@ stdcall -i386 -norelay SUnMapLS()
+@ stdcall -i386 -norelay SUnMapLS_IP_EBP_12()
+@ stdcall -i386 -norelay SUnMapLS_IP_EBP_16()
+@ stdcall -i386 -norelay SUnMapLS_IP_EBP_20()
+@ stdcall -i386 -norelay SUnMapLS_IP_EBP_24()
+@ stdcall -i386 -norelay SUnMapLS_IP_EBP_28()
+@ stdcall -i386 -norelay SUnMapLS_IP_EBP_32()
+@ stdcall -i386 -norelay SUnMapLS_IP_EBP_36()
+@ stdcall -i386 -norelay SUnMapLS_IP_EBP_40()
+@ stdcall -i386 -norelay SUnMapLS_IP_EBP_8()
@ stdcall ScrollConsoleScreenBufferA(long ptr ptr ptr ptr)
@ stdcall ScrollConsoleScreenBufferW(long ptr ptr ptr ptr)
@ stdcall SearchPathA(str str str long ptr ptr)
@@ -1092,7 +1092,7 @@
@ stdcall UTRegister(long str str str ptr ptr ptr)
@ stdcall UTUnRegister(long)
@ stdcall UnMapLS(long)
-@ stdcall -i386 -register UnMapSLFixArray(long long)
+@ stdcall -i386 -norelay UnMapSLFixArray(long long)
@ stdcall UnhandledExceptionFilter(ptr)
@ stdcall UninitializeCriticalSection(ptr)
@ stdcall UnlockFile(long long long long long)
diff --git a/dlls/kernel/selector.c b/dlls/kernel/selector.c
index 2bd9180..e157ca9 100644
--- a/dlls/kernel/selector.c
+++ b/dlls/kernel/selector.c
@@ -562,15 +562,14 @@ LPVOID WINAPI MapSLFix( SEGPTR sptr )
/***********************************************************************
* UnMapSLFixArray (KERNEL32.@)
+ *
+ * Must not change EAX, hence defined as asm function.
*/
-void WINAPI __regs_UnMapSLFixArray( SEGPTR sptr[], INT length, CONTEXT86 *context )
-{
- /* Must not change EAX, hence defined as 'register' function */
-}
-#ifdef DEFINE_REGS_ENTRYPOINT
-DEFINE_REGS_ENTRYPOINT( UnMapSLFixArray, 8, 8 );
+#ifdef __i386__
+__ASM_GLOBAL_FUNC( UnMapSLFixArray, "ret $8" );
#endif
+
/***********************************************************************
* GetThreadSelectorEntry (KERNEL32.@)
*/
@@ -638,32 +637,29 @@ BOOL WINAPI GetThreadSelectorEntry( HAND
}
-#ifdef DEFINE_REGS_ENTRYPOINT
+#ifdef __i386__
/***********************************************************************
* SMapLS (KERNEL32.@)
*/
-void WINAPI __regs_SMapLS( CONTEXT86 *context )
-{
- if (HIWORD(context->Eax))
- {
- context->Eax = MapLS( (LPVOID)context->Eax );
- context->Edx = context->Eax;
- } else {
- context->Edx = 0;
- }
-}
-DEFINE_REGS_ENTRYPOINT( SMapLS, 0, 0 );
+__ASM_GLOBAL_FUNC( SMapLS,
+ "xor %edx,%edx\n\t"
+ "testl $0xffff0000,%eax\n\t"
+ "jz 1f\n\t"
+ "pushl %eax\n\t"
+ "call " __ASM_NAME("MapLS") "\n\t"
+ "movl %eax,%edx\n"
+ "1:\tret" );
/***********************************************************************
* SUnMapLS (KERNEL32.@)
*/
-void WINAPI __regs_SUnMapLS( CONTEXT86 *context )
-{
- if (HIWORD(context->Eax)) UnMapLS( (SEGPTR)context->Eax );
-}
-DEFINE_REGS_ENTRYPOINT( SUnMapLS, 0, 0 );
-
+__ASM_GLOBAL_FUNC( SUnMapLS,
+ "pushl %eax\n\t" /* preserve eax */
+ "pushl %eax\n\t"
+ "call " __ASM_NAME("UnMapLS") "\n\t"
+ "popl %eax\n\t"
+ "ret" );
/***********************************************************************
* SMapLS_IP_EBP_8 (KERNEL32.@)
@@ -682,17 +678,11 @@ DEFINE_REGS_ENTRYPOINT( SUnMapLS, 0, 0 )
* unravel them at SUnMapLS. We just store the segmented pointer there.
*/
#define DEFINE_SMapLS(n) \
-void WINAPI __regs_SMapLS_IP_EBP_ ## n (CONTEXT86 *context) \
-{ \
- SEGPTR *ptr = (SEGPTR *)(context->Ebp + n); \
- if (!HIWORD(*ptr)) \
- { \
- context->Eax = *ptr; \
- *ptr = 0; \
- } \
- else *ptr = context->Eax = MapLS((LPVOID)*ptr); \
-} \
-DEFINE_REGS_ENTRYPOINT( SMapLS_IP_EBP_ ## n, 0, 0 )
+ __ASM_GLOBAL_FUNC( SMapLS_IP_EBP_ ## n, \
+ "movl " #n "(%ebp),%eax\n\t" \
+ "call " __ASM_NAME("SMapLS") "\n\t" \
+ "movl %edx," #n "(%ebp)\n\t" \
+ "ret" );
DEFINE_SMapLS(8);
DEFINE_SMapLS(12);
@@ -718,13 +708,13 @@ DEFINE_SMapLS(40);
*/
#define DEFINE_SUnMapLS(n) \
-void WINAPI __regs_SUnMapLS_IP_EBP_ ## n (CONTEXT86 *context) \
-{ \
- SEGPTR *ptr = (SEGPTR *)(context->Ebp + n); \
- UnMapLS( *ptr ); \
- *ptr = 0; \
-} \
-DEFINE_REGS_ENTRYPOINT( SUnMapLS_IP_EBP_ ## n, 0, 0 )
+ __ASM_GLOBAL_FUNC( SUnMapLS_IP_EBP_ ## n, \
+ "pushl %eax\n\t" /* preserve eax */ \
+ "pushl " #n "(%ebp)\n\t" \
+ "call " __ASM_NAME("UnMapLS") "\n\t" \
+ "movl $0," #n "(%ebp)\n\t" \
+ "popl %eax\n\t" \
+ "ret" )
DEFINE_SUnMapLS(8);
DEFINE_SUnMapLS(12);
@@ -736,4 +726,4 @@ DEFINE_SUnMapLS(32);
DEFINE_SUnMapLS(36);
DEFINE_SUnMapLS(40);
-#endif /* DEFINE_REGS_ENTRYPOINT */
+#endif /* __i386__ */
More information about the wine-cvs
mailing list