Commit 08f4705e authored by Alexandre Julliard's avatar Alexandre Julliard

ntdll: Use a .seh handler for DbgUiRemoteBreakin().

parent d0e02b67
......@@ -1688,6 +1688,21 @@ void WINAPI process_breakpoint(void)
/***********************************************************************
* DbgUiRemoteBreakin (NTDLL.@)
*/
#ifdef __WINE_PE_BUILD
__ASM_GLOBAL_FUNC( DbgUiRemoteBreakin,
".seh_endprologue\n\t"
".seh_handler DbgUiRemoteBreakin_handler, %except\n\t"
"mrc p15, 0, r0, c13, c0, 2\n\t" /* NtCurrentTeb() */
"ldr r0, [r0, #0x30]\n\t" /* NtCurrentTeb()->Peb */
"ldrb r0, [r0, 0x02]\n\t" /* peb->BeingDebugged */
"cbz r0, 1f\n\t"
"bl " __ASM_NAME("DbgBreakPoint") "\n"
"1:\tmov r0, #0\n\t"
"bl " __ASM_NAME("RtlExitUserThread") "\n"
"DbgUiRemoteBreakin_handler:\n\t"
"mov sp, r1\n\t" /* frame */
"b 1b" )
#else
void WINAPI DbgUiRemoteBreakin( void *arg )
{
if (NtCurrentTeb()->Peb->BeingDebugged)
......@@ -1704,6 +1719,7 @@ void WINAPI DbgUiRemoteBreakin( void *arg )
}
RtlExitUserThread( STATUS_SUCCESS );
}
#endif
/**********************************************************************
* DbgBreakPoint (NTDLL.@)
......
......@@ -1585,22 +1585,20 @@ __ASM_GLOBAL_FUNC( process_breakpoint,
/***********************************************************************
* DbgUiRemoteBreakin (NTDLL.@)
*/
void WINAPI DbgUiRemoteBreakin( void *arg )
{
if (NtCurrentTeb()->Peb->BeingDebugged)
{
__TRY
{
DbgBreakPoint();
}
__EXCEPT_ALL
{
/* do nothing */
}
__ENDTRY
}
RtlExitUserThread( STATUS_SUCCESS );
}
__ASM_GLOBAL_FUNC( DbgUiRemoteBreakin,
"stp x29, x30, [sp, #-16]!\n\t"
".seh_save_fplr_x 16\n\t"
".seh_endprologue\n\t"
".seh_handler DbgUiRemoteBreakin_handler, @except\n\t"
"ldr x0, [x18, #0x60]\n\t" /* NtCurrentTeb()->Peb */
"ldrb w0, [x0, 0x02]\n\t" /* peb->BeingDebugged */
"cbz w0, 1f\n\t"
"bl " __ASM_NAME("DbgBreakPoint") "\n"
"1:\tmov w0, #0\n\t"
"bl " __ASM_NAME("RtlExitUserThread") "\n"
"DbgUiRemoteBreakin_handler:\n\t"
"mov sp, x1\n\t" /* frame */
"b 1b" )
/**********************************************************************
* DbgBreakPoint (NTDLL.@)
......
......@@ -1748,6 +1748,23 @@ void WINAPI process_breakpoint(void)
/***********************************************************************
* DbgUiRemoteBreakin (NTDLL.@)
*/
#ifdef __WINE_PE_BUILD
__ASM_GLOBAL_FUNC( DbgUiRemoteBreakin,
"subq $0x28,%rsp\n\t"
".seh_stackalloc 0x28\n\t"
".seh_endprologue\n\t"
".seh_handler DbgUiRemoteBreakin_handler, @except\n\t"
"mov %gs:0x30,%rax\n\t"
"mov 0x60(%rax),%rax\n\t"
"cmpb $0,2(%rax)\n\t"
"je 1f\n\t"
"call " __ASM_NAME("DbgBreakPoint") "\n"
"1:\txorl %ecx,%ecx\n\t"
"call " __ASM_NAME("RtlExitUserThread") "\n"
"DbgUiRemoteBreakin_handler:\n\t"
"movq %rdx,%rsp\n\t" /* frame */
"jmp 1b" )
#else
void WINAPI DbgUiRemoteBreakin( void *arg )
{
if (NtCurrentTeb()->Peb->BeingDebugged)
......@@ -1764,7 +1781,7 @@ void WINAPI DbgUiRemoteBreakin( void *arg )
}
RtlExitUserThread( STATUS_SUCCESS );
}
#endif
/**********************************************************************
* DbgBreakPoint (NTDLL.@)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment