From 5d2472cf83a9ceb2b002dee59100ca3fbe7b9311 Mon Sep 17 00:00:00 2001 From: David McCullough Date: Mon, 25 Jun 2001 04:11:28 +0000 Subject: Fixed vfork so the child doesn't trash the parents return address. --- libc/sysdeps/linux/m68k/Makefile | 4 ++-- libc/sysdeps/linux/m68k/vfork.S | 33 +++++++++++++++++++++++++++++++++ libc/sysdeps/linux/m68k/vfork.c | 25 ------------------------- 3 files changed, 35 insertions(+), 27 deletions(-) create mode 100644 libc/sysdeps/linux/m68k/vfork.S delete mode 100644 libc/sysdeps/linux/m68k/vfork.c (limited to 'libc/sysdeps/linux') diff --git a/libc/sysdeps/linux/m68k/Makefile b/libc/sysdeps/linux/m68k/Makefile index 3ca165344..9c929ec11 100644 --- a/libc/sysdeps/linux/m68k/Makefile +++ b/libc/sysdeps/linux/m68k/Makefile @@ -29,10 +29,10 @@ ASFLAGS=$(CFLAGS) CRT0=crt0.S CRT0_OBJ=$(patsubst %.S,%.o, $(CRT0)) -SSRC=setjmp.S # longjmp.S _start.S clone.S +SSRC=setjmp.S vfork.S # longjmp.S _start.S clone.S SOBJS=$(patsubst %.S,%.o, $(SSRC)) -CSRC=ptrace.c vfork.c +CSRC=ptrace.c COBJS=$(patsubst %.c,%.o, $(CSRC)) OBJS=$(SOBJS) $(MOBJ) $(COBJS) 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 + +#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 */ + diff --git a/libc/sysdeps/linux/m68k/vfork.c b/libc/sysdeps/linux/m68k/vfork.c deleted file mode 100644 index 9edcb650d..000000000 --- a/libc/sysdeps/linux/m68k/vfork.c +++ /dev/null @@ -1,25 +0,0 @@ -/* orginally from include/unistd.h, written by ndf@linux.mit.edu> */ -#include -#include -#include - -#ifndef __NR_vfork -#define __NR_vfork __NR_fork /* uClinux-2.0 only has fork which is vfork */ -#endif - -pid_t vfork(void) -{ - pid_t __res; - __asm__ __volatile__ ("movel %1,%%d0;" - "trap #0;" - "movel %%d0,%0" - : "=d" (__res) - : "0" (__NR_vfork) - : "%d0"); - if (__res >= (unsigned long)-4096) { - errno = -__res; - __res = (pid_t)-1; - } - return(__res); -} - -- cgit v1.2.3