Commit 6f88a7b7 authored by Peter Beutner's avatar Peter Beutner Committed by Alexandre Julliard

ntdll: Fix single stepping over popf instruction.

parent 696eddca
......@@ -1019,11 +1019,15 @@ static void WINAPI raise_trap_exception( EXCEPTION_RECORD *rec, CONTEXT *context
{
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 */
}
}
......
......@@ -265,8 +265,8 @@ static DWORD single_step_handler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTRATION_
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;
......
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