• 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
signal_x86_64.c 138 KB