64 lines
1.7 KiB
ArmAsm
64 lines
1.7 KiB
ArmAsm
#if defined(__i386__) && defined(__linux__)
|
|
|
|
#include "sanitizer_common/sanitizer_asm.h"
|
|
|
|
.comm _ZN14__interception10real_vforkE,4,4
|
|
.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.
|
|
sub $12, %esp
|
|
call COMMON_INTERCEPTOR_SPILL_AREA
|
|
mov 12(%esp), %ecx
|
|
mov %ecx, (%eax)
|
|
add $16, %esp
|
|
|
|
call .L0$pb
|
|
.L0$pb:
|
|
pop %eax
|
|
.Ltmp0:
|
|
add $_GLOBAL_OFFSET_TABLE_+(.Ltmp0-.L0$pb), %eax
|
|
call *_ZN14__interception10real_vforkE@GOTOFF(%eax)
|
|
|
|
// Restore the stack frame.
|
|
// 12(%esp) return address
|
|
// 8(%esp) spill %ebx
|
|
// 4(%esp) spill REAL(vfork) return value
|
|
// (%esp) call frame (arg0) for __*_handle_vfork
|
|
sub $16, %esp
|
|
mov %ebx, 8(%esp)
|
|
mov %eax, 4(%esp)
|
|
|
|
// Form GOT address in %ebx.
|
|
call .L1$pb
|
|
.L1$pb:
|
|
pop %ebx
|
|
.Ltmp1:
|
|
add $_GLOBAL_OFFSET_TABLE_+(.Ltmp1-.L1$pb), %ebx
|
|
|
|
// Restore original return address.
|
|
call COMMON_INTERCEPTOR_SPILL_AREA
|
|
mov (%eax), %ecx
|
|
mov %ecx, 12(%esp)
|
|
mov 4(%esp), %eax
|
|
|
|
// Call handle_vfork in the parent process (%rax != 0).
|
|
test %eax, %eax
|
|
je .L_exit
|
|
|
|
lea 16(%esp), %ecx
|
|
mov %ecx, (%esp)
|
|
call COMMON_INTERCEPTOR_HANDLE_VFORK@PLT
|
|
|
|
.L_exit:
|
|
mov 4(%esp), %eax
|
|
mov 8(%esp), %ebx
|
|
add $12, %esp
|
|
ret
|
|
ASM_SIZE(vfork)
|
|
|
|
.weak vfork
|
|
.set vfork, ASM_WRAPPER_NAME(vfork)
|
|
|
|
#endif
|