• Florian Kübler's avatar
    ntdll: Add CFI unwind info to __wine_syscall_dispatcher (x86_64). · d573c8d4
    Florian Kübler authored
    This change is adding DWARF (CFI) unwind information to the
    hand-written assembly of the `__wine_syscall_dispatcher` function.
    This enables unwinding through the dispatcher from the Linux stack
    into (and through) the Windows stack.
    
    The general idea is that the `syscall_frame` struct contains the
    content of the callee-save registers before the function call
    (in particular the stack pointer and the return address). At any
    point of the execution, we have a pointer into the `syscall_frame`
    in $rcx, $rbp or $rsp.
    
    For the CFI codes the general idea is that we are defining the
    computations of the callee-save registers based on the
    `syscall_frame` using DWARF’s `breg` instruction, rather than
    relative to CFA.
    
    This change adds a bunch of convenience macros, to (hopefully)
    improve readability of the CFI instructions.
    
    Note: Those change was used with great success for unwinding through
    the dispatcher using a modified LLDB shown in the
    “how-wine-works-101” (https://werat.dev/blog/how-wine-works-101/)
    blog post as well as for in the Orbit profiler
    (https://github.com/google/orbit), that has mixed-callstack
    unwinding support.
    
    Test: Inspect callstacks reported by the Orbit profiler while
    running some Windows targets using the modified wine, as well as
    verify debugging reports correct callstacks when stepping with our
    modified LLDB through the dispatcher itself (so that we are able
    to unwind through the dispatcher at any instruction).
    d573c8d4
Name
Last commit
Last update
dlls Loading commit data...
documentation Loading commit data...
fonts Loading commit data...
include Loading commit data...
libs Loading commit data...
loader Loading commit data...
nls Loading commit data...
po Loading commit data...
programs Loading commit data...
server Loading commit data...
tools Loading commit data...
.editorconfig Loading commit data...
.gitlab-ci.yml Loading commit data...
.mailmap Loading commit data...
ANNOUNCE Loading commit data...
AUTHORS Loading commit data...
COPYING.LIB Loading commit data...
LICENSE Loading commit data...
LICENSE.OLD Loading commit data...
MAINTAINERS Loading commit data...
README Loading commit data...
VERSION Loading commit data...
aclocal.m4 Loading commit data...
configure Loading commit data...
configure.ac Loading commit data...