Merged wine_call_to_16_long and wine_call_to_16_short into a single
function.
This commit is contained in:
parent
9534d4f0fe
commit
7aee90762a
|
@ -1026,8 +1026,7 @@ init MAIN_KernelInit
|
|||
@ varargs __wine_call_from_16_word() __wine_call_from_16_word
|
||||
@ varargs __wine_call_from_16_long() __wine_call_from_16_long
|
||||
@ varargs __wine_call_from_16_regs() __wine_call_from_16_regs
|
||||
@ stdcall wine_call_to_16_word(ptr long) wine_call_to_16_word
|
||||
@ stdcall wine_call_to_16_long(ptr long) wine_call_to_16_long
|
||||
@ stdcall wine_call_to_16(ptr long) wine_call_to_16
|
||||
@ stdcall wine_call_to_16_regs_short(ptr long) wine_call_to_16_regs_short
|
||||
@ stdcall wine_call_to_16_regs_long (ptr long) wine_call_to_16_regs_long
|
||||
|
||||
|
|
|
@ -285,7 +285,7 @@ BOOL WINAPI K32WOWCallback16Ex( DWORD vpfn16, DWORD dwFlags,
|
|||
* stack pointer is always reset to the position it had before.
|
||||
*/
|
||||
|
||||
ret = wine_call_to_16_long( (FARPROC16)vpfn16, cbArgs );
|
||||
ret = wine_call_to_16( (FARPROC16)vpfn16, cbArgs );
|
||||
|
||||
if ( pdwRetCode )
|
||||
*pdwRetCode = ret;
|
||||
|
|
|
@ -80,17 +80,9 @@ BOOL RELAY_Init(void)
|
|||
*/
|
||||
#ifndef __i386__
|
||||
/***********************************************************************
|
||||
* wine_call_to_16_word (KERNEL32.@)
|
||||
* wine_call_to_16 (KERNEL32.@)
|
||||
*/
|
||||
WORD WINAPI wine_call_to_16_word( FARPROC16 target, INT nArgs )
|
||||
{
|
||||
assert( FALSE );
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* wine_call_to_16_long (KERNEL32.@)
|
||||
*/
|
||||
LONG WINAPI wine_call_to_16_long( FARPROC16 target, INT nArgs )
|
||||
LONG WINAPI wine_call_to_16( FARPROC16 target, INT nArgs )
|
||||
{
|
||||
assert( FALSE );
|
||||
}
|
||||
|
|
|
@ -380,8 +380,7 @@ BOOL16 WINAPI WritePrivateProfileStruct16(LPCSTR,LPCSTR,LPVOID,UINT16,LPCST
|
|||
BOOL16 WINAPI WriteProfileSection16(LPCSTR,LPCSTR);
|
||||
|
||||
/* Wine-specific functions */
|
||||
WORD WINAPI wine_call_to_16_word( FARPROC16 target, INT nArgs );
|
||||
LONG WINAPI wine_call_to_16_long( FARPROC16 target, INT nArgs );
|
||||
LONG WINAPI wine_call_to_16( FARPROC16 target, INT nArgs );
|
||||
void WINAPI wine_call_to_16_regs_short( CONTEXT86 *context, INT nArgs );
|
||||
void WINAPI wine_call_to_16_regs_long ( CONTEXT86 *context, INT nArgs );
|
||||
|
||||
|
|
|
@ -337,7 +337,7 @@ static DWORD CALLBACK THREAD_StartThread16( LPVOID threadArgs )
|
|||
HeapFree( GetProcessHeap(), 0, threadArgs );
|
||||
|
||||
((LPDWORD)CURRENT_STACK16)[-1] = param;
|
||||
return wine_call_to_16_long( start, sizeof(DWORD) );
|
||||
return wine_call_to_16( start, sizeof(DWORD) );
|
||||
}
|
||||
HANDLE WINAPI CreateThread16( SECURITY_ATTRIBUTES *sa, DWORD stack,
|
||||
FARPROC16 start, SEGPTR param,
|
||||
|
|
|
@ -447,8 +447,7 @@ static void BuildCallFrom16Core( FILE *outfile, int reg_func, int thunk, int sho
|
|||
*
|
||||
* This routine builds the core routines used in 32->16 thunks:
|
||||
*
|
||||
* extern void WINAPI wine_call_to_16_word( SEGPTR target, int nb_args );
|
||||
* extern void WINAPI wine_call_to_16_long( SEGPTR target, int nb_args );
|
||||
* extern LONG WINAPI wine_call_to_16( SEGPTR target, int nb_args );
|
||||
* extern void WINAPI wine_call_to_16_regs_short( const CONTEXT86 *context, int nb_args );
|
||||
* extern void WINAPI wine_call_to_16_regs_long ( const CONTEXT86 *context, int nb_args );
|
||||
*
|
||||
|
@ -469,17 +468,14 @@ static void BuildCallFrom16Core( FILE *outfile, int reg_func, int thunk, int sho
|
|||
* core routine.
|
||||
*
|
||||
*/
|
||||
static void BuildCallTo16Core( FILE *outfile, int short_ret, int reg_func )
|
||||
static void BuildCallTo16Core( FILE *outfile, int reg_func )
|
||||
{
|
||||
char *name = reg_func == 2 ? "regs_long" :
|
||||
reg_func == 1 ? "regs_short" :
|
||||
short_ret? "word" : "long";
|
||||
const char *name = reg_func == 2 ? "wine_call_to_16_regs_long" :
|
||||
reg_func == 1 ? "wine_call_to_16_regs_short" :
|
||||
"wine_call_to_16";
|
||||
|
||||
/* Function header */
|
||||
if (reg_func == 2) function_header( outfile, "wine_call_to_16_regs_long" );
|
||||
else if (reg_func == 1) function_header( outfile, "wine_call_to_16_regs_short" );
|
||||
else if (short_ret) function_header( outfile, "wine_call_to_16_word" );
|
||||
else function_header( outfile, "wine_call_to_16_long" );
|
||||
function_header( outfile, name );
|
||||
|
||||
/* Function entry sequence */
|
||||
fprintf( outfile, "\tpushl %%ebp\n" );
|
||||
|
@ -495,10 +491,10 @@ static void BuildCallTo16Core( FILE *outfile, int short_ret, int reg_func )
|
|||
if ( UsePIC )
|
||||
{
|
||||
/* Get Global Offset Table into %ebx */
|
||||
fprintf( outfile, "\tcall .Lwine_call_to_16_%s.getgot1\n", name );
|
||||
fprintf( outfile, ".Lwine_call_to_16_%s.getgot1:\n", name );
|
||||
fprintf( outfile, "\tcall .L%s.getgot1\n", name );
|
||||
fprintf( outfile, ".L%s.getgot1:\n", name );
|
||||
fprintf( outfile, "\tpopl %%ebx\n" );
|
||||
fprintf( outfile, "\taddl $_GLOBAL_OFFSET_TABLE_+[.-.Lwine_call_to_16_%s.getgot1], %%ebx\n", name );
|
||||
fprintf( outfile, "\taddl $_GLOBAL_OFFSET_TABLE_+[.-.L%s.getgot1], %%ebx\n", name );
|
||||
}
|
||||
|
||||
/* Print debugging info */
|
||||
|
@ -543,7 +539,7 @@ static void BuildCallTo16Core( FILE *outfile, int short_ret, int reg_func )
|
|||
|
||||
/* Call the actual CallTo16 routine (simulate a lcall) */
|
||||
fprintf( outfile, "\tpushl %%cs\n" );
|
||||
fprintf( outfile, "\tcall .Lwine_call_to_16_%s\n", reg_func ? name : "long" );
|
||||
fprintf( outfile, "\tcall .L%s\n", name );
|
||||
|
||||
/* Remove exception frame */
|
||||
fprintf( outfile, "\t.byte 0x64\n\tpopl (%d)\n", STRUCTOFFSET(TEB,except) );
|
||||
|
@ -553,17 +549,9 @@ static void BuildCallTo16Core( FILE *outfile, int short_ret, int reg_func )
|
|||
if ( !reg_func )
|
||||
{
|
||||
/* Convert and push return value */
|
||||
if ( short_ret )
|
||||
{
|
||||
fprintf( outfile, "\tmovzwl %%ax, %%eax\n" );
|
||||
fprintf( outfile, "\tpushl %%eax\n" );
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf( outfile, "\tshll $16,%%edx\n" );
|
||||
fprintf( outfile, "\tmovw %%ax,%%dx\n" );
|
||||
fprintf( outfile, "\tpushl %%edx\n" );
|
||||
}
|
||||
fprintf( outfile, "\tshll $16,%%edx\n" );
|
||||
fprintf( outfile, "\tmovw %%ax,%%dx\n" );
|
||||
fprintf( outfile, "\tpushl %%edx\n" );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -594,10 +582,10 @@ static void BuildCallTo16Core( FILE *outfile, int short_ret, int reg_func )
|
|||
if ( UsePIC )
|
||||
{
|
||||
/* Get Global Offset Table into %ebx (might have been overwritten) */
|
||||
fprintf( outfile, "\tcall .Lwine_call_to_16_%s.getgot2\n", name );
|
||||
fprintf( outfile, ".Lwine_call_to_16_%s.getgot2:\n", name );
|
||||
fprintf( outfile, "\tcall .L%s.getgot2\n", name );
|
||||
fprintf( outfile, ".L%s.getgot2:\n", name );
|
||||
fprintf( outfile, "\tpopl %%ebx\n" );
|
||||
fprintf( outfile, "\taddl $_GLOBAL_OFFSET_TABLE_+[.-.Lwine_call_to_16_%s.getgot2], %%ebx\n", name );
|
||||
fprintf( outfile, "\taddl $_GLOBAL_OFFSET_TABLE_+[.-.L%s.getgot2], %%ebx\n", name );
|
||||
}
|
||||
|
||||
/* Leave Win16 Mutex */
|
||||
|
@ -636,9 +624,7 @@ static void BuildCallTo16Core( FILE *outfile, int short_ret, int reg_func )
|
|||
|
||||
/* Start of the actual CallTo16 routine */
|
||||
|
||||
if (!reg_func && short_ret) return; /* call_to_16_word uses call_to_16_long backend routine */
|
||||
|
||||
fprintf( outfile, ".Lwine_call_to_16_%s:\n", name );
|
||||
fprintf( outfile, ".L%s:\n", name );
|
||||
|
||||
/* Switch to the 16-bit stack */
|
||||
fprintf( outfile, "\tmovl %%esp,%%edx\n" );
|
||||
|
@ -1200,17 +1186,14 @@ void BuildRelays16( FILE *outfile )
|
|||
/* C16ThkSL CallFrom16 routine */
|
||||
BuildCallFrom16Core( outfile, FALSE, TRUE, FALSE );
|
||||
|
||||
/* Standard CallTo16 routine (WORD return) */
|
||||
BuildCallTo16Core( outfile, TRUE, FALSE );
|
||||
|
||||
/* Standard CallTo16 routine (DWORD return) */
|
||||
BuildCallTo16Core( outfile, FALSE, FALSE );
|
||||
/* Standard CallTo16 routine */
|
||||
BuildCallTo16Core( outfile, 0 );
|
||||
|
||||
/* Register CallTo16 routine (16:16 retf) */
|
||||
BuildCallTo16Core( outfile, FALSE, 1 );
|
||||
BuildCallTo16Core( outfile, 1 );
|
||||
|
||||
/* Register CallTo16 routine (16:32 retf) */
|
||||
BuildCallTo16Core( outfile, FALSE, 2 );
|
||||
BuildCallTo16Core( outfile, 2 );
|
||||
|
||||
/* CBClientThunkSL routine */
|
||||
BuildCallTo32CBClient( outfile, FALSE );
|
||||
|
|
|
@ -505,8 +505,7 @@ static void BuildCallTo16Func( FILE *outfile, const char *profile, const char *p
|
|||
fprintf( outfile, " *)args = arg%d;\n", i+1 );
|
||||
}
|
||||
|
||||
fprintf( outfile, " return wine_call_to_16_%s( proc, %d );\n}\n\n",
|
||||
short_ret? "word" : "long", argsize );
|
||||
fprintf( outfile, " return wine_call_to_16( proc, %d );\n}\n\n", argsize );
|
||||
#else /* __i386__ */
|
||||
fprintf( outfile, " assert(0);\n}\n\n" );
|
||||
#endif /* __i386__ */
|
||||
|
@ -914,8 +913,7 @@ void BuildGlue( FILE *outfile, const char *srcdir, char **argv )
|
|||
output_file_header( outfile );
|
||||
|
||||
#ifdef __i386__
|
||||
fprintf( outfile, "extern unsigned short __stdcall wine_call_to_16_word( void (*target)(), int args );\n" );
|
||||
fprintf( outfile, "extern unsigned int __stdcall wine_call_to_16_long( void (*target)(), int args );\n\n" );
|
||||
fprintf( outfile, "extern unsigned int __stdcall wine_call_to_16( void (*target)(), int args );\n\n" );
|
||||
#else
|
||||
fprintf( outfile, "#include <assert.h>\n\n" );
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue