From 4872747b271ffb8f985c6b55c66c49ebc73072a6 Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Wed, 15 May 2019 14:19:41 +0200 Subject: [PATCH] ntdll: Fix breakpoint exception address on 64-bit Linux. Signed-off-by: Hans Leidekker Signed-off-by: Alexandre Julliard --- dlls/kernel32/tests/debugger.c | 10 +++++++++- dlls/ntdll/signal_x86_64.c | 5 ++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/dlls/kernel32/tests/debugger.c b/dlls/kernel32/tests/debugger.c index f62a614a97c..bd9d61bc4f0 100644 --- a/dlls/kernel32/tests/debugger.c +++ b/dlls/kernel32/tests/debugger.c @@ -638,7 +638,15 @@ static void test_debug_loop(int argc, char **argv) if (!ret) break; if (ev.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT) break; - +#if defined(__i386__) || defined(__x86_64__) + if (ev.dwDebugEventCode == EXCEPTION_DEBUG_EVENT && + ev.u.Exception.ExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT) + { + BYTE byte = 0; + NtReadVirtualMemory(pi.hProcess, ev.u.Exception.ExceptionRecord.ExceptionAddress, &byte, 1, NULL); + ok(byte == 0xcc, "got %02x\n", byte); + } +#endif ret = ContinueDebugEvent(ev.dwProcessId, ev.dwThreadId, DBG_CONTINUE); ok(ret, "ContinueDebugEvent failed, last error %#x.\n", GetLastError()); if (!ret) break; diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index 21e70988760..c2151f78c63 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -3134,7 +3134,10 @@ static void trap_handler( int signal, siginfo_t *siginfo, void *sigcontext ) rec->ExceptionCode = EXCEPTION_SINGLE_STEP; break; case TRAP_BRKPT: /* Breakpoint exception */ - /* Check if this is actuallly icebp instruction */ +#ifdef SI_KERNEL + case SI_KERNEL: +#endif + /* Check if this is actually icebp instruction */ if (((unsigned char *)rec->ExceptionAddress)[-1] == 0xF1) { rec->ExceptionCode = EXCEPTION_SINGLE_STEP;