summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/m68k/vfork.S
diff options
context:
space:
mode:
authorDavid McCullough <davidm@snapgear.com>2001-06-25 04:11:28 +0000
committerDavid McCullough <davidm@snapgear.com>2001-06-25 04:11:28 +0000
commit5d2472cf83a9ceb2b002dee59100ca3fbe7b9311 (patch)
tree1471b5a8b8e4eca189c06585c8e83d15ab6835aa /libc/sysdeps/linux/m68k/vfork.S
parentc5207a5547426030930716fbd0de0de064c2f27b (diff)
Fixed vfork so the child doesn't trash the parents return address.
Diffstat (limited to 'libc/sysdeps/linux/m68k/vfork.S')
-rw-r--r--libc/sysdeps/linux/m68k/vfork.S33
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 */
+