1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-01 10:06:57 +03:00
* sysdeps/unix/sysv/linux/i386/vfork.S: If SAVE_PID and
	RESTORE_PID are defined, use it.
	* sysdeps/unix/sysv/linux/x86_64/vfork.S: Likewise.
This commit is contained in:
Ulrich Drepper
2004-03-09 06:32:58 +00:00
parent c072ef6d22
commit 6fadea9f1d
8 changed files with 67 additions and 64 deletions

View File

@ -1,5 +1,10 @@
2004-03-08 Ulrich Drepper <drepper@redhat.com> 2004-03-08 Ulrich Drepper <drepper@redhat.com>
* sysdeps/unix/sysv/linux/i386/vfork.S: If SAVE_PID and
RESTORE_PID are defined, use it.
* sysdeps/unix/sysv/linux/x86_64/vfork.S: Likewise.
* sysdeps/posix/gai_strerror.c: Add error string for EAI_IDN_ENCODE. * sysdeps/posix/gai_strerror.c: Add error string for EAI_IDN_ENCODE.
* Makerules: Use extra-modules.mk if modules-names is defined. * Makerules: Use extra-modules.mk if modules-names is defined.

View File

@ -1,7 +1,9 @@
2004-03-08 Ulrich Drepper <drepper@redhat.com> 2004-03-08 Ulrich Drepper <drepper@redhat.com>
* sysdeps/i386/tcb-offsets.sym: Add PID. * sysdeps/i386/tcb-offsets.sym: Add PID.
* sysdeps/x86_64/tcb-offsets.sym: Likewise.
* sysdeps/unix/sysv/linux/i386/vfork.S: New file. * sysdeps/unix/sysv/linux/i386/vfork.S: New file.
* sysdeps/unix/sysv/linux/x86_64/vfork.S: New file.
2004-03-08 Steven Munroe <sjmunroe@us.ibm.com> 2004-03-08 Steven Munroe <sjmunroe@us.ibm.com>

View File

@ -3,6 +3,7 @@
RESULT offsetof (struct pthread, result) RESULT offsetof (struct pthread, result)
TID offsetof (struct pthread, tid) TID offsetof (struct pthread, tid)
PID offsetof (struct pthread, pid)
CANCELHANDLING offsetof (struct pthread, cancelhandling) CANCELHANDLING offsetof (struct pthread, cancelhandling)
CLEANUP_JMP_BUF offsetof (struct pthread, cleanup_jmp_buf) CLEANUP_JMP_BUF offsetof (struct pthread, cleanup_jmp_buf)
MULTIPLE_THREADS_OFFSET offsetof (tcbhead_t, multiple_threads) MULTIPLE_THREADS_OFFSET offsetof (tcbhead_t, multiple_threads)

View File

@ -1,6 +1,5 @@
/* Copyright (C) 1999, 2002, 2004 Free Software Foundation, Inc. /* Copyright (C) 1999, 2002, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Andreas Schwab <schwab@gnu.org>.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public modify it under the terms of the GNU Lesser General Public
@ -17,71 +16,19 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */ 02111-1307 USA. */
#include <sysdep.h>
#define _ERRNO_H 1
#include <bits/errno.h>
#include <kernel-features.h>
#include <tcb-offsets.h> #include <tcb-offsets.h>
/* Clone the calling process, but without copying the whole address space. /* Save the PID value. */
The calling process is suspended until the new process exits or is #define SAVE_PID \
replaced by a call to `execve'. Return -1 for errors, 0 to the new process, movl %gs:PID, %edx; \
and the process ID of the new process to the old process. */
ENTRY (__vfork)
#ifdef __NR_vfork
/* Pop the return PC value into ECX. */
popl %ecx
/* Save the PID value. */
movl %gs:PID, %edx
movl $-1, %gs:PID movl $-1, %gs:PID
/* Stuff the syscall number in EAX and enter into the kernel. */ /* Restore the old PID value in the parent. In the child store 0. */
movl $SYS_ify (vfork), %eax #define RESTORE_PID \
int $0x80 testl %eax, %eax; \
je 1f; \
movl %edx, %gs:PID; \
1:
/* Jump to the return PC. Don't jump directly since this
disturbs the branch target cache. Instead push the return
address back on the stack. */
pushl %ecx
/* Restore the old PID value in the parent. In the child store 0. */ #include <sysdeps/unix/sysv/linux/i386/vfork.S>
testl %eax, %eax
je 1f
movl %edx, %gs:PID
1: cmpl $-4095, %eax
/* Branch forward if it failed. */
# ifdef __ASSUME_VFORK_SYSCALL
jae SYSCALL_ERROR_LABEL
.Lpseudo_end:
# else
jae .Lerror
# endif
ret
# ifndef __ASSUME_VFORK_SYSCALL
.Lerror:
/* Check if vfork syscall is known at all. */
cmpl $-ENOSYS, %eax
jne SYSCALL_ERROR_LABEL
# endif
#endif
#ifndef __ASSUME_VFORK_SYSCALL
/* If we don't have vfork, fork is close enough. */
movl $SYS_ify (fork), %eax
int $0x80
cmpl $-4095, %eax
jae SYSCALL_ERROR_LABEL
.Lpseudo_end:
ret
#endif
PSEUDO_END (__vfork)
libc_hidden_def (__vfork)
weak_alias (__vfork, vfork)

View File

@ -0,0 +1,31 @@
/* Copyright (C) 2004 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <tcb-offsets.h>
#define SAVE_PID \
movl %fs:PID, %esi; \
movl $-1, %fs:PID
#define RESTORE_PID \
testq %rax, %rax; \
je 1f; \
movl %esi, %fs:PID; \
1:
#include <sysdeps/unix/sysv/linux/x86_64/vfork.S>

View File

@ -3,6 +3,7 @@
RESULT offsetof (struct pthread, result) RESULT offsetof (struct pthread, result)
TID offsetof (struct pthread, tid) TID offsetof (struct pthread, tid)
PID offsetof (struct pthread, pid)
CANCELHANDLING offsetof (struct pthread, cancelhandling) CANCELHANDLING offsetof (struct pthread, cancelhandling)
CLEANUP_JMP_BUF offsetof (struct pthread, cleanup_jmp_buf) CLEANUP_JMP_BUF offsetof (struct pthread, cleanup_jmp_buf)
CLEANUP offsetof (struct pthread, cleanup) CLEANUP offsetof (struct pthread, cleanup)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1999, 2002 Free Software Foundation, Inc. /* Copyright (C) 1999, 2002, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Andreas Schwab <schwab@gnu.org>. Contributed by Andreas Schwab <schwab@gnu.org>.
@ -34,6 +34,10 @@ ENTRY (__vfork)
/* Pop the return PC value into ECX. */ /* Pop the return PC value into ECX. */
popl %ecx popl %ecx
#ifdef SAVE_PID
SAVE_PID
#endif
/* Stuff the syscall number in EAX and enter into the kernel. */ /* Stuff the syscall number in EAX and enter into the kernel. */
movl $SYS_ify (vfork), %eax movl $SYS_ify (vfork), %eax
int $0x80 int $0x80
@ -43,6 +47,10 @@ ENTRY (__vfork)
address back on the stack. */ address back on the stack. */
pushl %ecx pushl %ecx
#ifdef RESTORE_PID
RESTORE_PID
#endif
cmpl $-4095, %eax cmpl $-4095, %eax
/* Branch forward if it failed. */ /* Branch forward if it failed. */
# ifdef __ASSUME_VFORK_SYSCALL # ifdef __ASSUME_VFORK_SYSCALL

View File

@ -32,6 +32,10 @@ ENTRY (__vfork)
popq %rdi popq %rdi
cfi_adjust_cfa_offset(-8) cfi_adjust_cfa_offset(-8)
#ifdef SAVE_PID
SAVE_PID
#endif
/* Stuff the syscall number in RAX and enter into the kernel. */ /* Stuff the syscall number in RAX and enter into the kernel. */
movl $SYS_ify (vfork), %eax movl $SYS_ify (vfork), %eax
syscall syscall
@ -40,6 +44,10 @@ ENTRY (__vfork)
pushq %rdi pushq %rdi
cfi_adjust_cfa_offset(8) cfi_adjust_cfa_offset(8)
#ifdef RESTORE_PID
RESTORE_PID
#endif
cmpl $-4095, %eax cmpl $-4095, %eax
jae SYSCALL_ERROR_LABEL /* Branch forward if it failed. */ jae SYSCALL_ERROR_LABEL /* Branch forward if it failed. */