mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-31 01:57:23 +00:00
ntdll: Fix stack layout for ARM syscalls.
This commit is contained in:
parent
6b853a9354
commit
b41566fb31
2 changed files with 9 additions and 23 deletions
|
@ -1052,7 +1052,10 @@ NTSTATUS call_user_apc_dispatcher( CONTEXT *context, ULONG_PTR arg1, ULONG_PTR a
|
||||||
*/
|
*/
|
||||||
void call_raise_user_exception_dispatcher(void)
|
void call_raise_user_exception_dispatcher(void)
|
||||||
{
|
{
|
||||||
arm_thread_data()->syscall_frame->pc = (DWORD)pKiRaiseUserExceptionDispatcher;
|
struct syscall_frame *frame = arm_thread_data()->syscall_frame;
|
||||||
|
|
||||||
|
frame->sp += 16;
|
||||||
|
frame->pc = (DWORD)pKiRaiseUserExceptionDispatcher;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1608,8 +1611,7 @@ __ASM_GLOBAL_FUNC( __wine_syscall_dispatcher,
|
||||||
"ldr r1, [r2, #0x1d8]\n\t" /* arm_thread_data()->syscall_frame */
|
"ldr r1, [r2, #0x1d8]\n\t" /* arm_thread_data()->syscall_frame */
|
||||||
"add r0, r1, #0x10\n\t"
|
"add r0, r1, #0x10\n\t"
|
||||||
"stm r0, {r4-r12,lr}\n\t"
|
"stm r0, {r4-r12,lr}\n\t"
|
||||||
"add r0, sp, #0x10\n\t"
|
"str sp, [r1, #0x38]\n\t"
|
||||||
"str r0, [r1, #0x38]\n\t"
|
|
||||||
"str r3, [r1, #0x3c]\n\t"
|
"str r3, [r1, #0x3c]\n\t"
|
||||||
"mrs r0, CPSR\n\t"
|
"mrs r0, CPSR\n\t"
|
||||||
"bfi r0, lr, #5, #1\n\t" /* set thumb bit */
|
"bfi r0, lr, #5, #1\n\t" /* set thumb bit */
|
||||||
|
@ -1682,7 +1684,6 @@ __ASM_GLOBAL_FUNC( __wine_syscall_dispatcher,
|
||||||
|
|
||||||
"5:\tmovw r0, #0x000d\n\t" /* STATUS_INVALID_PARAMETER */
|
"5:\tmovw r0, #0x000d\n\t" /* STATUS_INVALID_PARAMETER */
|
||||||
"movt r0, #0xc000\n\t"
|
"movt r0, #0xc000\n\t"
|
||||||
"add sp, sp, #0x10\n\t"
|
|
||||||
"b " __ASM_LOCAL_LABEL("__wine_syscall_dispatcher_return") "\n\t"
|
"b " __ASM_LOCAL_LABEL("__wine_syscall_dispatcher_return") "\n\t"
|
||||||
".globl " __ASM_NAME("__wine_syscall_dispatcher_return") "\n"
|
".globl " __ASM_NAME("__wine_syscall_dispatcher_return") "\n"
|
||||||
__ASM_NAME("__wine_syscall_dispatcher_return") ":\n\t"
|
__ASM_NAME("__wine_syscall_dispatcher_return") ":\n\t"
|
||||||
|
|
|
@ -268,34 +268,19 @@
|
||||||
# define __ASM_SYSCALL_FUNC(id,name,args) \
|
# define __ASM_SYSCALL_FUNC(id,name,args) \
|
||||||
__ASM_GLOBAL_FUNC( name, \
|
__ASM_GLOBAL_FUNC( name, \
|
||||||
"push {r0-r3}\n\t" \
|
"push {r0-r3}\n\t" \
|
||||||
|
".seh_save_regs {r0-r3}\n\t" \
|
||||||
|
".seh_endprologue\n\t" \
|
||||||
"movw ip, #(" #id ")\n\t" \
|
"movw ip, #(" #id ")\n\t" \
|
||||||
"mov r3, lr\n\t" \
|
"mov r3, lr\n\t" \
|
||||||
"bl " __ASM_NAME("__wine_syscall") "\n\t" \
|
"bl " __ASM_NAME("__wine_syscall") "\n\t" \
|
||||||
|
"add sp, #16\n\t" \
|
||||||
"bx lr" )
|
"bx lr" )
|
||||||
# ifndef __PIC__
|
# define DEFINE_SYSCALL_HELPER32() \
|
||||||
# define DEFINE_SYSCALL_HELPER32() \
|
|
||||||
__ASM_GLOBAL_FUNC( __wine_syscall, \
|
__ASM_GLOBAL_FUNC( __wine_syscall, \
|
||||||
"movw r0, :lower16:" __ASM_NAME("__wine_syscall_dispatcher") "\n\t" \
|
"movw r0, :lower16:" __ASM_NAME("__wine_syscall_dispatcher") "\n\t" \
|
||||||
"movt r0, :upper16:" __ASM_NAME("__wine_syscall_dispatcher") "\n\t" \
|
"movt r0, :upper16:" __ASM_NAME("__wine_syscall_dispatcher") "\n\t" \
|
||||||
"ldr r0, [r0]\n\t" \
|
"ldr r0, [r0]\n\t" \
|
||||||
"bx r0" )
|
"bx r0" )
|
||||||
# elif defined __thumb__
|
|
||||||
# define DEFINE_SYSCALL_HELPER32() \
|
|
||||||
__ASM_GLOBAL_FUNC( __wine_syscall, \
|
|
||||||
"ldr r0, 2f\n" \
|
|
||||||
"1:\tadd r0, pc\n\t" \
|
|
||||||
"ldr r0, [r0]\n\t" \
|
|
||||||
"bx r0\n" \
|
|
||||||
"2:\t.long " __ASM_NAME("__wine_syscall_dispatcher") "-1b-4" )
|
|
||||||
# else
|
|
||||||
# define DEFINE_SYSCALL_HELPER32() \
|
|
||||||
__ASM_GLOBAL_FUNC( __wine_syscall, \
|
|
||||||
"ldr r0, 2f\n" \
|
|
||||||
"1:\tadd r0, pc\n\t" \
|
|
||||||
"ldr r0, [r0]\n\t" \
|
|
||||||
"bx r0\n" \
|
|
||||||
"2:\t.long " __ASM_NAME("__wine_syscall_dispatcher") "-1b-8" )
|
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* __WINE_WINE_ASM_H */
|
#endif /* __WINE_WINE_ASM_H */
|
||||||
|
|
Loading…
Reference in a new issue