Commit 40052019 authored by Paul Gofman's avatar Paul Gofman Committed by Alexandre Julliard

dbghelp: Support UWOP_PUSH_MACHFRAME on x64.

parent 6bcde005
...@@ -474,6 +474,7 @@ static BOOL interpret_function_table_entry(struct cpu_stack_walk* csw, ...@@ -474,6 +474,7 @@ static BOOL interpret_function_table_entry(struct cpu_stack_walk* csw,
DWORD64 newframe, prolog_offset, off, value; DWORD64 newframe, prolog_offset, off, value;
M128A floatvalue; M128A floatvalue;
union handler_data handler_data; union handler_data handler_data;
BOOL mach_frame = FALSE;
/* FIXME: we have some assumptions here */ /* FIXME: we have some assumptions here */
assert(context); assert(context);
...@@ -556,7 +557,23 @@ static BOOL interpret_function_table_entry(struct cpu_stack_walk* csw, ...@@ -556,7 +557,23 @@ static BOOL interpret_function_table_entry(struct cpu_stack_walk* csw,
set_float_reg(context, info->UnwindCode[i].u.OpInfo, floatvalue); set_float_reg(context, info->UnwindCode[i].u.OpInfo, floatvalue);
break; break;
case UWOP_PUSH_MACHFRAME: case UWOP_PUSH_MACHFRAME:
FIXME("PUSH_MACHFRAME %u\n", info->UnwindCode[i].u.OpInfo); if (info->Flags & UNW_FLAG_CHAININFO)
{
FIXME("PUSH_MACHFRAME with chained unwind info.\n");
break;
}
if (i + get_opcode_size(info->UnwindCode[i]) < info->CountOfCodes)
{
FIXME("PUSH_MACHFRAME is not the last opcode.\n");
break;
}
if (info->UnwindCode[i].u.OpInfo)
context->Rsp += 0x8;
if (!sw_read_mem(csw, context->Rsp, &context->Rip, sizeof(DWORD64))) return FALSE;
if (!sw_read_mem(csw, context->Rsp + 24, &context->Rsp, sizeof(DWORD64))) return FALSE;
mach_frame = TRUE;
break; break;
default: default:
FIXME("unknown code %u\n", info->UnwindCode[i].u.UnwindOp); FIXME("unknown code %u\n", info->UnwindCode[i].u.UnwindOp);
...@@ -569,7 +586,7 @@ static BOOL interpret_function_table_entry(struct cpu_stack_walk* csw, ...@@ -569,7 +586,7 @@ static BOOL interpret_function_table_entry(struct cpu_stack_walk* csw,
&handler_data, sizeof(handler_data))) return FALSE; &handler_data, sizeof(handler_data))) return FALSE;
function = &handler_data.chain; /* restart with the chained info */ function = &handler_data.chain; /* restart with the chained info */
} }
return default_unwind(csw, context); return mach_frame ? TRUE : default_unwind(csw, context);
} }
/* fetch_next_frame() /* fetch_next_frame()
......
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