From 66971be81100ed599e4acb31fd7d9edd86b680b6 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Mon, 6 Mar 1995 00:22:30 +0000 Subject: [PATCH] Initial checkin. --- sysdeps/unix/bsd/hp/m68k/vfork.S | 55 +++++++++++++++++++++++++++++ sysdeps/unix/bsd/sun/m68k/vfork.S | 55 +++++++++++++++++++++++++++++ sysdeps/unix/bsd/vax/vfork.S | 57 +++++++++++++++++++++++++++++++ 3 files changed, 167 insertions(+) create mode 100644 sysdeps/unix/bsd/hp/m68k/vfork.S create mode 100644 sysdeps/unix/bsd/sun/m68k/vfork.S create mode 100644 sysdeps/unix/bsd/vax/vfork.S diff --git a/sysdeps/unix/bsd/hp/m68k/vfork.S b/sysdeps/unix/bsd/hp/m68k/vfork.S new file mode 100644 index 00000000000..b70c1228383 --- /dev/null +++ b/sysdeps/unix/bsd/hp/m68k/vfork.S @@ -0,0 +1,55 @@ +/* Copyright (C) 1991, 1994, 1995 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include + +#ifndef SYS_vfork +#define SYS_vfork 66 +#endif + +/* Clone the calling process, but without copying the whole address space. + The the calling process is suspended until the the new process exits or is + replaced by a call to `execve'. Return -1 for errors, 0 to the new process, + and the process ID of the new process to the old process. */ +.globl ___vfork +___vfork: + /* Pop the return PC value into A0. */ + moveal sp@+, a0 + + /* Stuff the syscall number in D0 and trap into the kernel. */ + movel #SYS_vfork, d0 + trap #0 + bcs error /* Branch forward if it failed. */ + + /* It succeeded. See which fork we're in. D1 is now 0 for the + parent and 1 for the child. Decrement it to make it -1 (all + bits set) for the parent, and 0 (no bits set) for the child. + Then AND it with D0, so the parent gets D0&-1==R0, and the child + gets D0&0==0. */ + subl #1, d1 + andl d1, d0 + + /* Jump to the return PC. */ + jmp a0@ + +error: + movel d0, _errno + moveq #-1, d0 + jmp a0@ + +weak_alias (__vfork, vfork) diff --git a/sysdeps/unix/bsd/sun/m68k/vfork.S b/sysdeps/unix/bsd/sun/m68k/vfork.S new file mode 100644 index 00000000000..cb7dae8d2b8 --- /dev/null +++ b/sysdeps/unix/bsd/sun/m68k/vfork.S @@ -0,0 +1,55 @@ +/* Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include + +#ifndef SYS_vfork +#define SYS_vfork 66 +#endif + +/* Clone the calling process, but without copying the whole address space. + The the calling process is suspended until the the new process exits or is + replaced by a call to `execve'. Return -1 for errors, 0 to the new process, + and the process ID of the new process to the old process. */ +.globl ___vfork +___vfork: + /* Pop the return PC value into A0. */ + movel sp@+, a0 + + /* Push the syscall number and trap into the kernel. */ + movel #SYS_vfork, sp@- + trap #0 + bcs error /* Branch forward if it failed. */ + + /* It succeeded. See which fork we're in. D1 is now 0 for the + parent and 1 for the child. Decrement it to make it -1 (all + bits set) for the parent, and 0 (no bits set) for the child. + Then AND it with D0, so the parent gets D0&-1==R0, and the child + gets D0&0==0. */ + decl d1 + andl d1, d0 + + /* Jump to the return PC. */ + jmp a0@ + +error: + movel d0, _errno + moveq #-1, d0 + jmp a0@ + +weak_alias (__vfork, vfork) diff --git a/sysdeps/unix/bsd/vax/vfork.S b/sysdeps/unix/bsd/vax/vfork.S new file mode 100644 index 00000000000..daf8f0f20d7 --- /dev/null +++ b/sysdeps/unix/bsd/vax/vfork.S @@ -0,0 +1,57 @@ +/* Copyright (C) 1991, 1992, 1995 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include + +#ifndef SYS_vfork +#define SYS_vfork 66 +#endif + +/* Clone the calling process, but without copying the whole address space. + The the calling process is suspended until the the new process exits or is + replaced by a call to `execve'. Return -1 for errors, 0 to the new process, + and the process ID of the new process to the old process. */ +.globl ___vfork +error: jmp syscall_error +___vfork: + .word 0 + /* Save our return address in R2, and return to code below. */ + movl 16(fp), r2 + movab unwind, 16(fp) + ret +unwind: + /* Do the system call. */ + chmk $SYS_vfork + bcs error + + tstl r1 + beq parent + + /* We are the child. Return zero. */ + clrl r0 + + /* Return to the saved address. */ +parent: jmp (r2) + +.globl _errno +error: + movl r0, _errno + mnegl $1, r0 + jmp (r2) + +weak_alias (__vfork, vfork) -- 2.47.3