[PATCH 0/2] MR4088: Fix WineDbg backtrace on macOS.
Fix winedbg's backtrace command on macos for a 64 bit debugger on a 32 bit debuggee. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/4088
From: Eric Pouech <epouech(a)codeweavers.com> Signed-off-by: Eric Pouech <epouech(a)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: -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/4088
From: Eric Pouech <epouech(a)codeweavers.com> This mostly matters for Mac as segment CS is handled as a real LDT entry. Signed-off-by: Eric Pouech <epouech(a)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 = -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/4088
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 d2d1: https://bugs.winehq.org/show_bug.cgi?id=55765 -- https://gitlab.winehq.org/wine/wine/-/merge_requests/4088#note_48626
participants (2)
-
Eric Pouech -
eric pouech (@epo)