ENTRY_WEAK_FOR_NATIVE_BRIDGE(vfork)
// AAPCS64 defines SME ZA interface as private for vfork(), which means that ZA state on entry
// can be "dormant" or "off", while on return it can be unchanged or "off".
// https://github.com/ARM-software/abi-aa/blob/main/aapcs64/aapcs64.rst#za-interfaces
// Handling the dormant state would make the code unnecessary complex, so for simplicity turn
// ZA state off on entry which ensures that the state on return will be "off" as well.
str lr, [sp, #-16]!
.cfi_adjust_cfa_offset 16
.cfi_rel_offset lr, 0
bl __arm_za_disable
ldr lr, [sp], #16
.cfi_adjust_cfa_offset -16
.cfi_restore lr
// Set cached_pid_ to 0, vforked_ to 1, and stash the previous value.
mov w0, #0x80000000
ldr w10, [x9, #20]
str w0, [x9, #20]
mov x0, #SIGCHLD
// If either HWASan or stack MTE is enabled, set up the clone() flags to
// make vfork() act like fork(). We don't call the atfork handlers, so we
// may deadlock if the child allocates, but we have seen badly written
// atfork handlers themselves cause deadlocks [1]. ndk_translation already
// implements vfork() as fork() without calling handlers, so we have some
// evidence that it isn't necessary to call them.
//
// POSIX.1 defines vfork() to have the same effect as fork() except that
// most behavior, including heap allocation, becomes undefined in the child,
// so we aren't violating POSIX by doing this.
//
// [1] https://cs.android.com/android/platform/superproject/+/master:system/extras/simpleperf/app_api/cpp/simpleperf.cpp;drc=788fa4183441f4977ddbd5a055e42a7fe7691d21;l=308
#if !__has_feature(hwaddress_sanitizer)
// if (!__libc_globals->memtag_stack) x0 |= CLONE_VM | CLONE_VFORK;
adrp x1, __libc_memtag_stack
ldrb w1, [x1, :lo12:__libc_memtag_stack]
cbnz w1, 1f
orr x0, x0, #CLONE_VM
orr x0, x0, #CLONE_VFORK 1:
#endif
mov x1, xzr
mov x2, xzr
mov x3, xzr
mov x4, xzr
mov x8, __NR_clone
svc #0
// Are we the child? Return if so.
cbnz x0, L(not_child)
ret
// Not the child: restore the previous cached_pid_/vforked_ values
// and then report syscall success/failure as normal.
L(not_child):
str w10, [x9, #20]
DO_SYSCALL_RETURN
END(vfork)
NOTE_GNU_PROPERTY()
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-06-28)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.