| #if defined(__x86_64__) && defined(__linux__) |
| |
| #include "sanitizer_common/sanitizer_asm.h" |
| |
| .comm _ZN14__interception10real_vforkE,8,8 |
| .globl ASM_WRAPPER_NAME(vfork) |
| ASM_TYPE_FUNCTION(ASM_WRAPPER_NAME(vfork)) |
| ASM_WRAPPER_NAME(vfork): |
| // Store return address in the spill area and tear down the stack frame. |
| push %rcx |
| call COMMON_INTERCEPTOR_SPILL_AREA |
| pop %rcx |
| pop %rdi |
| mov %rdi, (%rax) |
| |
| call *_ZN14__interception10real_vforkE(%rip) |
| |
| // Restore return address from the spill area. |
| push %rcx |
| push %rax |
| call COMMON_INTERCEPTOR_SPILL_AREA |
| mov (%rax), %rdx |
| mov %rdx, 8(%rsp) |
| mov (%rsp), %rax |
| |
| // Call handle_vfork in the parent process (%rax != 0). |
| test %rax, %rax |
| je .L_exit |
| |
| lea 16(%rsp), %rdi |
| call COMMON_INTERCEPTOR_HANDLE_VFORK@PLT |
| |
| .L_exit: |
| pop %rax |
| ret |
| ASM_SIZE(vfork) |
| |
| .weak vfork |
| .set vfork, ASM_WRAPPER_NAME(vfork) |
| |
| #endif |