diff options
Diffstat (limited to 'libc/sysdeps/linux/xtensa/vfork.S')
-rw-r--r-- | libc/sysdeps/linux/xtensa/vfork.S | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/xtensa/vfork.S b/libc/sysdeps/linux/xtensa/vfork.S index 6aced0a50..b8db5c1a1 100644 --- a/libc/sysdeps/linux/xtensa/vfork.S +++ b/libc/sysdeps/linux/xtensa/vfork.S @@ -51,6 +51,8 @@ HIDDEN_ENTRY (__vfork) + +#if defined(__XTENSA_WINDOWED_ABI__) .literal .Ljumptable, 0, .L4, .L8, .L12 mov a3, a0 # move return address out of the way @@ -163,6 +165,27 @@ HIDDEN_ENTRY (__vfork) PSEUDO_END (__vfork) .Lpseudo_end: retw +#elif defined(__XTENSA_CALL0_ABI__) + SAVE_PID(a5, a8, a3, a4) + + /* Use syscall 'clone'. Set new stack pointer to the same address. */ + movi a2, SYS_ify (clone) + movi a3, 0 + movi a6, CLONE_VM | CLONE_VFORK | SIGCHLD + syscall + + RESTORE_PID(a5, a8, a2) + + movi a3, -4096 + bgeu a2, a3, 1f + ret +1: + PSEUDO_END (__vfork) +.Lpseudo_end: + ret +#else +#error Unsupported Xtensa ABI +#endif weak_alias (__vfork, vfork) libc_hidden_def(vfork) |