OSDN Git Service

cleanup
[uclinux-h8/uClibc.git] / libc / sysdeps / linux / h8300 / vfork.S
1 /* Copyright 2002, 2015 Yoshinori Sato <ysato@users.sourceforge.jp> */
2
3 #include <sys/syscall.h>
4
5 #ifndef __NR_vfork
6 #define __NR_vfork __NR_fork /* uClinux-2.0 only has fork which is vfork */
7 #endif
8
9 #ifdef __H8300S__
10         .h8300s
11 #else
12         .h8300h
13 #endif
14         .text
15         .align 2
16         .globl  __vfork
17         .hidden __vfork
18         .type   __vfork,@function
19 __vfork:
20 #ifdef __NR_vfork
21         mov.l   @sp+, er1
22         sub.l   er0,er0
23         mov.b   #__NR_vfork,r0l
24         trapa   #0
25
26         mov.l   #-4096, er2
27         cmp.l   er0,er2
28         bcs     fix_errno
29         jmp     @er1                     /* don't return,  just jmp directly */
30 fix_errno:
31         neg.l   er0
32 #if !defined(__PIC__)
33         mov.l   er0,@errno
34 #else
35         mov.l   @(errno@GOTOFF,er5),er2
36         mov.l   er0,@er2
37 #endif
38         sub.l   er0,er0
39         dec.l   #1,er0
40         jmp     @er1                     /* don't return,  just jmp directly */
41 #else
42         mov.l   @sp+,er2                /* er2 = return address */
43         mov.l   #vfork_args,er1
44         sub.l   er0,er0
45         mov.b   #__NR_clone,r0l
46         trapa   #0
47         mov.l   #-4096,er1
48         cmp.l   er0,er1
49         bcc     done
50         neg.l   er0
51 #if !defined(__PIC__)
52         mov.l   er0,@errno
53 #else
54         mov.l   @(errno@GOTOFF,er5),er2
55         mov.l   er0,@er2
56 #endif
57         sub.l   er0,er0
58         dec.l   #1,er0
59 done:
60         jmp     @er1
61
62 vfork_args:
63         .long   CLONE_VFORK | CLONE_VM | SIGCHLD
64         .long   0
65         .long   0
66         .long   0
67         .long   0
68 #endif
69
70 weak_alias(__vfork,vfork)
71 libc_hidden_def(vfork)
72         .end