1/* clone() implementation for Nios II.
2 Copyright (C) 2008-2022 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
18
19/* clone() is even more special than fork() as it mucks with stacks
20 and invokes a function in the right context after its all over. */
21
22#include <sysdep.h>
23#define _ERRNO_H 1
24#include <bits/errno.h>
25#include <tcb-offsets.h>
26
27/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg,
28 void *parent_tidptr, void *tls, void *child_tidptr) */
29
30 .text
31ENTRY(__clone)
32 /* Sanity check arguments. */
33 movi r2, EINVAL
34 /* No NULL function pointers. */
35 beq r4, zero, SYSCALL_ERROR_LABEL
36 /* No NULL stack pointers. */
37 beq r5, zero, SYSCALL_ERROR_LABEL
38
39 subi r5, r5, 8 /* Reserve argument save space. */
40 stw r4, 4(r5) /* Save function pointer. */
41 stw r7, 0(r5) /* Save argument pointer. */
42
43 /* Load arguments. */
44 mov r4, r6
45 ldw r6, 0(sp)
46 ldw r7, 8(sp)
47 ldw r8, 4(sp)
48
49 /* Do the system call. */
50 movi r2, SYS_ify (clone)
51
52 /* End FDE now, because in the child the unwind info will be
53 wrong. */
54 cfi_endproc
55 trap
56
57 /* Check for errors. */
58 bne r7, zero, SYSCALL_ERROR_LABEL
59 /* See if we're on the newly created thread. */
60 beq r2, zero, thread_start
61 /* Successful return from the parent */
62 ret
63
64thread_start:
65 cfi_startproc
66 cfi_undefined (ra)
67
68 ldw r5, 4(sp) /* Function pointer. */
69 ldw r4, 0(sp) /* Argument pointer. */
70 addi sp, sp, 8
71
72 /* Call the user's function. */
73 callr r5
74
75 /* exit with the result. */
76 movi r2, SYS_ify (exit)
77 trap
78 cfi_endproc
79
80 cfi_startproc
81PSEUDO_END (__clone)
82libc_hidden_def (__clone)
83weak_alias (__clone, clone)
84

source code of glibc/sysdeps/unix/sysv/linux/nios2/clone.S