From 90c130a21b2c880a934888cf75b9911ba3c2011c Mon Sep 17 00:00:00 2001
From: Zebediah Figura <zfigura@codeweavers.com>
Date: Mon, 12 Dec 2022 13:16:21 -0600
Subject: [PATCH] krnl386: Reimplement SSCall() in assembly.

---
 dlls/krnl386.exe16/thunk.c | 33 ++++++++++++++++++---------------
 1 file changed, 18 insertions(+), 15 deletions(-)

diff --git a/dlls/krnl386.exe16/thunk.c b/dlls/krnl386.exe16/thunk.c
index 6b289eac65e..ee19ec559a7 100644
--- a/dlls/krnl386.exe16/thunk.c
+++ b/dlls/krnl386.exe16/thunk.c
@@ -983,22 +983,25 @@ void WINAPI SSConfirmSmallStack( CONTEXT *context )
  * RETURNS
  *  Thunked function result.
  */
-DWORD WINAPIV SSCall(
-	DWORD nr,	/* [in] number of argument bytes */
-	DWORD flags,	/* [in] FIXME: flags ? */
-	FARPROC fun,	/* [in] function to call */
-	...		/* [in/out] arguments */
-) {
-    DWORD i,ret;
-    DWORD *args = ((DWORD *)&fun) + 1;
+DWORD WINAPIV SSCall(DWORD count, DWORD flags, FARPROC func, ...);
 
-    TRACE("(%ld,0x%08lx,%p,[",nr,flags,fun);
-    for (i = 0; i < nr/4; i++) TRACE("0x%08lx,",args[i]);
-    TRACE("])\n");
-    ret = call_entry_point( fun, nr / sizeof(DWORD), args );
-    TRACE(" returning %ld ...\n",ret);
-    return ret;
-}
+/* FIXME: flags */
+__ASM_GLOBAL_FUNC( SSCall,
+                   "pushl %ebp\n\t"
+                   __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t")
+                   __ASM_CFI(".cfi_rel_offset %ebp,0\n\t")
+                   "movl %esp,%ebp\n\t"
+                    __ASM_CFI(".cfi_def_cfa_register %ebp\n\t")
+                   "leal 20(%ebp),%eax\n\t"
+                   "pushl %eax\n\t"
+                   "movl 8(%ebp),%edx\n\t"
+                   "shrl $2,%edx\n\t"
+                   "pushl 16(%ebp)\n\t"
+                   "call " __ASM_NAME("call_entry_point") "\n\t"
+                   "leave\n\t"
+                    __ASM_CFI(".cfi_def_cfa %esp,4\n\t")
+                    __ASM_CFI(".cfi_same_value %ebp\n\t")
+                   "ret" )
 
 /**********************************************************************
  *           W32S_BackTo32                      (KERNEL32.51)
-- 
2.38.1

