Module: wine
Branch: master
Commit: 6f88a7b7d432f3d80f74d392fbabceba196f4b0c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6f88a7b7d432f3d80f74d392f…
Author: Peter Beutner <p.beutner(a)gmx.net>
Date: Sun Dec 3 20:30:06 2006 +0100
ntdll: Fix single stepping over popf instruction.
---
dlls/ntdll/signal_i386.c | 12 ++++++++----
dlls/ntdll/tests/exception.c | 4 ++--
2 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index 8166124..28824fc 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -1019,11 +1019,15 @@ static void WINAPI raise_trap_exception(
{
context->ContextFlags = CONTEXT_DEBUG_REGISTERS;
NtGetContextThread(GetCurrentThread(), context);
- /* do we really have a bp from a debug register ?
- * if not, then someone did a kill(SIGTRAP) on us, and we
- * shall return a breakpoint, not a single step exception
+ /* we have either:
+ * - a bp from a debug register
+ * - a single step interrupt at popf instruction, which just has
+ * removed the TF.
+ * - someone did a kill(SIGTRAP) on us, and we shall return
+ * a breakpoint, not a single step exception
*/
- if (!(context->Dr6 & 0xf)) rec->ExceptionCode = EXCEPTION_BREAKPOINT;
+ if ( !(context->Dr6 & 0xf) && !(context->Dr6 & 0x4000) )
+ rec->ExceptionCode = EXCEPTION_BREAKPOINT;
context->ContextFlags |= CONTEXT_FULL; /* restore flags */
}
}
diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c
index ec86579..9e729a4 100644
--- a/dlls/ntdll/tests/exception.c
+++ b/dlls/ntdll/tests/exception.c
@@ -265,8 +265,8 @@ static DWORD single_step_handler( EXCEPT
else {
/* show that the last single step exception on the popf instruction
* (which removed the TF bit), still is a EXCEPTION_SINGLE_STEP exception */
- todo_wine { ok( rec->ExceptionCode == EXCEPTION_SINGLE_STEP,
- "exception is not EXCEPTION_SINGLE_STEP: %x\n", rec->ExceptionCode); };
+ ok( rec->ExceptionCode == EXCEPTION_SINGLE_STEP,
+ "exception is not EXCEPTION_SINGLE_STEP: %x\n", rec->ExceptionCode);
}
return ExceptionContinueExecution;