Implemented SYSDEPS_CallOnStack for sparcs.
This commit is contained in:
parent
04fd4a2756
commit
1cae4793da
|
@ -235,7 +235,7 @@ int SYSDEPS_SpawnThread( TEB *teb )
|
||||||
*/
|
*/
|
||||||
void DECLSPEC_NORETURN SYSDEPS_CallOnStack( void (*func)(LPVOID), LPVOID arg );
|
void DECLSPEC_NORETURN SYSDEPS_CallOnStack( void (*func)(LPVOID), LPVOID arg );
|
||||||
#ifdef __i386__
|
#ifdef __i386__
|
||||||
#ifdef __GNUC__
|
# ifdef __GNUC__
|
||||||
__ASM_GLOBAL_FUNC( SYSDEPS_CallOnStack,
|
__ASM_GLOBAL_FUNC( SYSDEPS_CallOnStack,
|
||||||
"movl 4(%esp),%ecx\n\t" /* func */
|
"movl 4(%esp),%ecx\n\t" /* func */
|
||||||
"movl 8(%esp),%edx\n\t" /* arg */
|
"movl 8(%esp),%edx\n\t" /* arg */
|
||||||
|
@ -244,7 +244,7 @@ __ASM_GLOBAL_FUNC( SYSDEPS_CallOnStack,
|
||||||
"xorl %ebp,%ebp\n\t"
|
"xorl %ebp,%ebp\n\t"
|
||||||
"call *%ecx\n\t"
|
"call *%ecx\n\t"
|
||||||
"int $3" /* we never return here */ );
|
"int $3" /* we never return here */ );
|
||||||
#elif defined(_MSC_VER)
|
# elif defined(_MSC_VER)
|
||||||
__declspec(naked) void SYSDEPS_CallOnStack( void (*func)(LPVOID), LPVOID arg )
|
__declspec(naked) void SYSDEPS_CallOnStack( void (*func)(LPVOID), LPVOID arg )
|
||||||
{
|
{
|
||||||
__asm mov ecx, 4[esp];
|
__asm mov ecx, 4[esp];
|
||||||
|
@ -255,13 +255,24 @@ __declspec(naked) void SYSDEPS_CallOnStack( void (*func)(LPVOID), LPVOID arg )
|
||||||
__asm call [ecx];
|
__asm call [ecx];
|
||||||
__asm int 3;
|
__asm int 3;
|
||||||
}
|
}
|
||||||
#endif /* defined(__GNUC__) || defined(_MSC_VER) */
|
# endif /* defined(__GNUC__) || defined(_MSC_VER) */
|
||||||
#else /* !defined(__i386__) */
|
#elif __sparc__
|
||||||
|
# ifdef __GNUC__
|
||||||
|
__ASM_GLOBAL_FUNC( SYSDEPS_CallOnStack,
|
||||||
|
"mov %o0, %l0\n\t" /* store first argument */
|
||||||
|
"call " __ASM_NAME("NtCurrentTeb") ", 0\n\t"
|
||||||
|
"mov %o1, %l1\n\t" /* delay slot: store second argument */
|
||||||
|
"ld [%o0+4], %sp\n\t" /* teb->stack_top */
|
||||||
|
"call %l0, 0\n\t" /* call func */
|
||||||
|
"mov %l1, %o0\n\t" /* delay slot: arg for func */
|
||||||
|
"ta 0x01\n\t"); /* breakpoint - we never get here */
|
||||||
|
# else /* !defined(__GNUC__) */
|
||||||
void SYSDEPS_CallOnStack( void (*func)(LPVOID), LPVOID arg )
|
void SYSDEPS_CallOnStack( void (*func)(LPVOID), LPVOID arg )
|
||||||
{
|
{
|
||||||
func( arg );
|
func( arg );
|
||||||
while(1); /* avoid warning */
|
while(1); /* avoid warning */
|
||||||
}
|
}
|
||||||
|
# endif /* !defined(__GNUC__) */
|
||||||
#endif /* !defined(__i386__) */
|
#endif /* !defined(__i386__) */
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue