]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/uclibc/lib/contrib/uclibc/libc/sysdeps/linux/frv/clone.S
Inital import
[l4.git] / l4 / pkg / uclibc / lib / contrib / uclibc / libc / sysdeps / linux / frv / clone.S
1 /* 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) */
32 clone:
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