Mercurial > hg > CbC > CbC_gcc
view libsanitizer/sanitizer_common/sanitizer_common_interceptors_vfork_aarch64.inc.S @ 158:494b0b89df80 default tip
...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 25 May 2020 18:13:55 +0900 |
parents | 1830386684a0 |
children |
line wrap: on
line source
#if defined(__aarch64__) && defined(__linux__) #include "sanitizer_common/sanitizer_asm.h" ASM_HIDDEN(COMMON_INTERCEPTOR_SPILL_AREA) .comm _ZN14__interception10real_vforkE,8,8 .globl ASM_WRAPPER_NAME(vfork) ASM_TYPE_FUNCTION(ASM_WRAPPER_NAME(vfork)) ASM_WRAPPER_NAME(vfork): // Save x30 in the off-stack spill area. stp xzr, x30, [sp, #-16]! bl COMMON_INTERCEPTOR_SPILL_AREA ldp xzr, x30, [sp], 16 str x30, [x0] // Call real vfork. This may return twice. User code that runs between the first and the second return // may clobber the stack frame of the interceptor; that's why it does not have a frame. adrp x0, _ZN14__interception10real_vforkE ldr x0, [x0, :lo12:_ZN14__interception10real_vforkE] blr x0 stp x0, xzr, [sp, #-16]! cmp x0, #0 b.eq .L_exit // x0 != 0 => parent process. Clear stack shadow. add x0, sp, #16 bl COMMON_INTERCEPTOR_HANDLE_VFORK .L_exit: // Restore x30. bl COMMON_INTERCEPTOR_SPILL_AREA ldr x30, [x0] ldp x0, xzr, [sp], 16 ret ASM_SIZE(vfork) .weak vfork .set vfork, ASM_WRAPPER_NAME(vfork) #endif