From: Jacek Caban <jacek@codeweavers.com> --- dlls/ntdll/signal_arm64ec.c | 11 ++++++++++- dlls/ntdll/unix/signal_arm64.c | 3 ++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/dlls/ntdll/signal_arm64ec.c b/dlls/ntdll/signal_arm64ec.c index 5e626672019..c0bfab1157e 100644 --- a/dlls/ntdll/signal_arm64ec.c +++ b/dlls/ntdll/signal_arm64ec.c @@ -83,7 +83,16 @@ static inline BOOL enter_syscall_callback(void) static inline void leave_syscall_callback(void) { - get_arm64ec_cpu_area()->InSyscallCallback = 0; + CHPE_V2_CPU_AREA_INFO *cpu_area = get_arm64ec_cpu_area(); + CONTEXT ctx; + + cpu_area->InSyscallCallback = 0; + + if (cpu_area->SuspendDoorbell && *cpu_area->SuspendDoorbell) + { + RtlCaptureContext( &ctx ); + if (*cpu_area->SuspendDoorbell) NtContinue( &ctx, FALSE ); + } } /********************************************************************** diff --git a/dlls/ntdll/unix/signal_arm64.c b/dlls/ntdll/unix/signal_arm64.c index 661111537a4..f6d2e017f22 100644 --- a/dlls/ntdll/unix/signal_arm64.c +++ b/dlls/ntdll/unix/signal_arm64.c @@ -1373,7 +1373,8 @@ static void usr1_handler( int signal, siginfo_t *siginfo, void *_sigcontext ) { server_select( NULL, 0, SELECT_INTERRUPTIBLE, 0, NULL, NULL ); } - else if ((chpe = data->teb->ChpeV2CpuAreaInfo) && chpe->InSimulation && chpe->SuspendDoorbell) + else if ((chpe = data->teb->ChpeV2CpuAreaInfo) && chpe->SuspendDoorbell && + (chpe->InSimulation || chpe->InSyscallCallback)) { NTSTATUS status = server_select( NULL, 0, SELECT_INTERRUPTIBLE | SELECT_COOPERATIVE_SUSPEND, 0, NULL, NULL ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10944