Define F_DUPFD_CLOEXEC.
[glibc-ports.git] / sysdeps / unix / sysv / linux / m68k / clone.S
bloba179f8e0fab1cbcb884f5c5eb8ff077618970ede
1 /* Copyright (C) 1996,97,98,2002 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Andreas Schwab (schwab@issan.informatik.uni-dortmund.de)
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.
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.
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.  */
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.  */
23 #include <sysdep.h>
24 #define _ERRNO_H        1
25 #include <bits/errno.h>
27 /* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */
29         .text
30 ENTRY (__clone)
32         /* Sanity check arguments.  */
33         movel   #-EINVAL, %d0
34         movel   4(%sp), %a0             /* no NULL function pointers */
35         tstl    %a0
36         jeq     SYSCALL_ERROR_LABEL
37         movel   8(%sp), %a1             /* no NULL stack pointers */
38         tstl    %a1
39         jeq     SYSCALL_ERROR_LABEL
41         /* Allocate space and copy the argument onto the new stack.  */
42         movel   16(%sp), -(%a1)
44         /* Do the system call */
45         movel   12(%sp), %d1            /* get flags */
46 #ifdef __mcoldfire__
47         movel   %d2, -(%a1)
48         movel   %d2, -(%sp)
49         movel   %a1, %d2
50 #else
51         exg     %d2, %a1                /* save %d2 and get stack pointer */
52 #endif
53         movel   #SYS_ify (clone), %d0
54         trap    #0
55 #ifdef __mcoldfire__
56         movel   (%sp)+, %d2
57 #else
58         exg     %d2, %a1                /* restore %d2 */
59 #endif
61         tstl    %d0
62         jmi     SYSCALL_ERROR_LABEL
63         jeq     thread_start
65         rts
67 thread_start:
68         subl    %fp, %fp        /* terminate the stack frame */
69         jsr     (%a0)
70         movel   %d0, %d1
71         movel   #SYS_ify (exit), %d0
72         trap    #0
74 PSEUDO_END (__clone)
76 weak_alias (__clone, clone)