Fix winedbg's backtrace command on macos for a 64 bit debugger on a 32 bit debuggee.
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/winedbg/be_i386.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/programs/winedbg/be_i386.c b/programs/winedbg/be_i386.c index 503a182641d..9f22dd5f3d4 100644 --- a/programs/winedbg/be_i386.c +++ b/programs/winedbg/be_i386.c @@ -30,13 +30,15 @@ WINE_DEFAULT_DEBUG_CHANNEL(winedbg);
#define IS_VM86_MODE(ctx) (ctx->EFlags & V86_FLAG)
+static const unsigned first_ldt_entry = 32; + static ADDRESS_MODE get_selector_type(HANDLE hThread, const WOW64_CONTEXT *ctx, WORD sel) { LDT_ENTRY le;
if (IS_VM86_MODE(ctx)) return AddrModeReal; /* null or system selector */ - if (!(sel & 4) || ((sel >> 3) < 17)) return AddrModeFlat; + if (!(sel & 4) || ((sel >> 3) < first_ldt_entry)) return AddrModeFlat; if (dbg_curr_process->process_io->get_selector(hThread, sel, &le)) return le.HighWord.Bits.Default_Big ? AddrMode1632 : AddrMode1616; /* selector doesn't exist */ @@ -52,7 +54,7 @@ static void* be_i386_linearize(HANDLE hThread, const ADDRESS64* addr) case AddrModeReal: return (void*)((DWORD_PTR)(LOWORD(addr->Segment) << 4) + (DWORD_PTR)addr->Offset); case AddrMode1632: - if (!(addr->Segment & 4) || ((addr->Segment >> 3) < 17)) + if (!(addr->Segment & 4) || ((addr->Segment >> 3) < first_ldt_entry)) return (void*)(DWORD_PTR)addr->Offset; /* fall through */ case AddrMode1616:
From: Eric Pouech epouech@codeweavers.com
This mostly matters for Mac as segment CS is handled as a real LDT entry.
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/winedbg/be_i386.c | 7 ++++++- programs/winedbg/tgt_active.c | 10 ++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/programs/winedbg/be_i386.c b/programs/winedbg/be_i386.c index 9f22dd5f3d4..1bac5f382b2 100644 --- a/programs/winedbg/be_i386.c +++ b/programs/winedbg/be_i386.c @@ -40,7 +40,12 @@ static ADDRESS_MODE get_selector_type(HANDLE hThread, const WOW64_CONTEXT *ctx, /* null or system selector */ if (!(sel & 4) || ((sel >> 3) < first_ldt_entry)) return AddrModeFlat; if (dbg_curr_process->process_io->get_selector(hThread, sel, &le)) - return le.HighWord.Bits.Default_Big ? AddrMode1632 : AddrMode1616; + { + ULONG base = (le.HighWord.Bits.BaseHi << 24) + (le.HighWord.Bits.BaseMid << 16) + le.BaseLow; + if (le.HighWord.Bits.Default_Big) + return base == 0 ? AddrModeFlat : AddrMode1632; + return AddrMode1616; + } /* selector doesn't exist */ return -1; } diff --git a/programs/winedbg/tgt_active.c b/programs/winedbg/tgt_active.c index 5ac9a4d1229..17578857133 100644 --- a/programs/winedbg/tgt_active.c +++ b/programs/winedbg/tgt_active.c @@ -1067,7 +1067,17 @@ static BOOL tgt_process_active_write(HANDLE hProcess, void* addr,
static BOOL tgt_process_active_get_selector(HANDLE hThread, DWORD sel, LDT_ENTRY* le) { +#ifdef _WIN64 + THREAD_DESCRIPTOR_INFORMATION desc = { .Selector = sel }; + ULONG retlen; + + if (RtlWow64GetThreadSelectorEntry( hThread, &desc, sizeof(desc), &retlen )) + return FALSE; + *le = desc.Entry; + return TRUE; +#else return GetThreadSelectorEntry( hThread, sel, le ); +#endif }
static struct be_process_io be_process_active_io =
all pipeline failures are present before the MR
domdoc: https://bugs.winehq.org/show_bug.cgi?id=55720
filtergraph: https://bugs.winehq.org/show_bug.cgi?id=55758