42 lines
1.0 KiB
ArmAsm
42 lines
1.0 KiB
ArmAsm
#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
|