diff options
Diffstat (limited to 'libc/sysdeps/linux/m68k/vfork.S')
-rw-r--r-- | libc/sysdeps/linux/m68k/vfork.S | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/m68k/vfork.S b/libc/sysdeps/linux/m68k/vfork.S new file mode 100644 index 000000000..ba3a67203 --- /dev/null +++ b/libc/sysdeps/linux/m68k/vfork.S @@ -0,0 +1,33 @@ + +#include <asm/unistd.h> + +#ifndef __NR_vfork +#define __NR_vfork __NR_fork /* uClinux-2.0 only has fork which is vfork */ +#endif + +#define IMM # + + .text + .align 2 + .globl errno + .globl vfork + .type vfork,@function +vfork: + movl %sp@+, %a1 /* save the return address for later */ + movl IMM __NR_vfork,%d0 + trap #0 + movl IMM -4097, %d1 + cmpl %d0, %d1 + bcs fix_errno + jmp %a1@ /* don't return, just jmp directly */ +fix_errno: + negl %d0 +#ifndef __PIC__ + movl errno, %a0 +#else + movl errno@GOT(%a5), %a0 +#endif + movl %d0, %a0@ + movl IMM -1, %d0 + jmp %a1@ /* don't return, just jmp directly */ + |