blob: 1456157342a37106c72e6e5065cd43c5dd814131 [file] [log] [blame]
yuezonghe824eb0c2024-06-27 02:32:26 -07001/* Copyright (C) 2003, 2004 Free Software Foudnation, Inc.
2 This file is part of the GNU C Library.
3 Contributed by Alexandre Oliva <aoliva@redhat.com>, 2003.
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, write to the Free
17 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18 02111-1307 USA. */
19
20/* clone() is even more special than fork() as it mucks with stacks
21 and invokes a function in the right context after its all over. */
22
23#include <features.h>
24#include <asm/unistd.h>
25#define _ERRNO_H 1
26#include <bits/errno.h>
27
28 .text
29 .globl clone
30 .type clone,@function
31/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg) */
32clone:
33 /* Sanity check arguments. */
34 cmp.p gr8, gr0, icc0
35 cmp gr9, gr0, icc1
36 mov.p gr8, gr4
37 beq icc0, #0, .Lerror
38 mov.p gr11, gr5
39 beq icc1, #0, .Lerror
40
41 mov.p gr10, gr8
42 setlos #__NR_clone, gr7
43 tra gr0,gr0
44
45 cmp.p gr8, gr0, icc0
46 setlos #-4096, gr6
47 cmp.p gr8, gr6, icc1
48 beq icc0, #0, .Lthread_start
49 blslr icc1, #2
50
51.Lsys_error:
52 sethi.p #gotofffuncdeschi(__syscall_error), gr14
53 setlo #gotofffuncdesclo(__syscall_error), gr14
54 ldd @(gr14, gr15), gr14
55 jmpl @(gr14, gr0)
56
57.Lerror:
58 setlos.p #-EINVAL, gr8
59 bra .Lsys_error
60
61###############################################################################
62#
63# come here as the new thread [GR4 is fn, GR5 is arg]
64#
65###############################################################################
66.Lthread_start:
67 /* Save the PIC register. */
68 mov gr15, gr17
69
70 /* Call the user's function. */
71 ldd.p @(gr4, gr0), gr14
72 mov gr5, gr8
73 calll @(gr14, gr0)
74
75 /* Call _exit, rather simply inlining the syscall, such that
76 breakpoints work.*/
77
78 mov.p gr17, gr15
79 call HIDDEN_JUMPTARGET(_exit)
80
81 /* Should never get here. */
82 jmpl @(gr0, gr0)
83 .size clone,.-clone