From c46d4a9b60ba79c321ab9075f71751389808a15a Mon Sep 17 00:00:00 2001 From: joseph Date: Fri, 1 Apr 2011 19:43:08 +0000 Subject: Merge changes between r13227 and r13354 from /fsf/trunk. git-svn-id: svn://svn.eglibc.org/trunk@13355 7b3dc134-2b1b-0410-93df-9e9f96275f8d --- .../unix/sysv/linux/alpha/____longjmp_chk.S | 21 ++-- ports/sysdeps/unix/sysv/linux/arm/bits/fcntl.h | 49 +++++++- .../unix/sysv/linux/arm/eabi/____longjmp_chk.S | 13 ++- .../linux/arm/eabi/linuxthreads/sysdep-cancel.h | 116 ------------------ .../unix/sysv/linux/arm/eabi/nptl/sysdep-cancel.h | 104 ++++++++--------- ports/sysdeps/unix/sysv/linux/arm/eabi/sysdep.h | 91 ++++++++++++++- .../unix/sysv/linux/arm/linuxthreads/fork.c | 1 - .../sysv/linux/arm/linuxthreads/sysdep-cancel.h | 129 --------------------- .../unix/sysv/linux/arm/linuxthreads/vfork.S | 78 ------------- ports/sysdeps/unix/sysv/linux/arm/vfork.S | 23 +++- ports/sysdeps/unix/sysv/linux/mips/bits/fcntl.h | 49 +++++++- .../unix/sysv/linux/mips/mips32/sync_file_range.c | 25 +++- .../unix/sysv/linux/mips/mips64/n32/fallocate.c | 16 ++- .../unix/sysv/linux/mips/mips64/n32/fallocate64.c | 16 ++- .../unix/sysv/linux/mips/mips64/n32/syscalls.list | 2 +- .../unix/sysv/linux/mips/mips64/n64/syscalls.list | 2 + 16 files changed, 320 insertions(+), 415 deletions(-) delete mode 100644 ports/sysdeps/unix/sysv/linux/arm/eabi/linuxthreads/sysdep-cancel.h delete mode 100644 ports/sysdeps/unix/sysv/linux/arm/linuxthreads/fork.c delete mode 100644 ports/sysdeps/unix/sysv/linux/arm/linuxthreads/sysdep-cancel.h delete mode 100644 ports/sysdeps/unix/sysv/linux/arm/linuxthreads/vfork.S (limited to 'ports/sysdeps/unix/sysv/linux') diff --git a/ports/sysdeps/unix/sysv/linux/alpha/____longjmp_chk.S b/ports/sysdeps/unix/sysv/linux/alpha/____longjmp_chk.S index 5194ed818..53eb0f2c5 100644 --- a/ports/sysdeps/unix/sysv/linux/alpha/____longjmp_chk.S +++ b/ports/sysdeps/unix/sysv/linux/alpha/____longjmp_chk.S @@ -1,4 +1,5 @@ -/* Copyright (C) 1992, 1994, 1997, 2006, 2010 Free Software Foundation, Inc. +/* Copyright (C) 1992, 1994, 1997, 2006, 2010, 2011 + 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 @@ -58,11 +59,17 @@ ____longjmp_chk: PTR_DEMANGLE2(s3, t1) PTR_DEMANGLE2(fp, t1) #endif - cmpule t0, sp, t1 - bne t1, .Lfail + /* ??? While this is a proper test for detecting a longjmp to an + invalid frame within any given stack, the main thread stack is + located *below* almost everything in the address space. Which + means that the test at Lfail vs the signal stack will almost + certainly never pass. We ought bounds check top and bottom of + the current thread's stack. */ + cmpule s3, sp, t1 + bne t1, $Lfail .align 4 -.Lok: +$Lok: mov s0, a0 mov s1, v0 mov s3, t0 @@ -103,7 +110,7 @@ ____longjmp_chk: ret .align 4 -.Lfail: +$Lfail: cfi_restore_state lda v0, __NR_sigaltstack lda a0, 0 @@ -118,13 +125,13 @@ ____longjmp_chk: cfi_adjust_cfa_offset(-32) /* Without working sigaltstack we cannot perform the test. */ - bne a3, .Lok + bne a3, $Lok addq t0, t2, t0 /* t0 = ss_sp + ss_size */ subq t0, s3, t0 /* t0 = (ss_sp + ss_size) - new_sp */ cmpule t2, t0, t0 /* t0 = (t0 >= ss_size) */ and t0, t1, t0 /* t0 = (t0 >= ss_size) & (ss_flags & SS_ONSTACK) */ - bne t0, .Lok + bne t0, $Lok ldah a0, longjmp_msg(gp) !gprelhigh lda a0, longjmp_msg(a0) !gprellow diff --git a/ports/sysdeps/unix/sysv/linux/arm/bits/fcntl.h b/ports/sysdeps/unix/sysv/linux/arm/bits/fcntl.h index 952ae05b3..cf8e32a4f 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/bits/fcntl.h +++ b/ports/sysdeps/unix/sysv/linux/arm/bits/fcntl.h @@ -1,5 +1,5 @@ /* O_*, F_*, FD_* bit values for Linux. - Copyright (C) 1995-1998, 2000, 2004, 2006, 2007, 2009, 2010 + Copyright (C) 1995-1998, 2000, 2004, 2006, 2007, 2009, 2010, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -53,6 +53,7 @@ #ifdef __USE_GNU # define O_DIRECT 0200000 /* Direct disk access. */ # define O_NOATIME 01000000 /* Do not set atime. */ +# define O_PATH 010000000 /* Resolve pathname but do not open file. */ #endif /* For now Linux has synchronisity options for data and read operations. @@ -232,6 +233,19 @@ struct f_owner_ex we splice from/to). */ # define SPLICE_F_MORE 4 /* Expect more data. */ # define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */ + + +/* File handle structure. */ +struct file_handle +{ + unsigned int handle_bytes; + int handle_type; + /* File identifier. */ + unsigned char f_handle[0]; +}; + +/* Maximum handle size (for now). */ +# define MAX_HANDLE_SZ 128 #endif __BEGIN_DECLS @@ -248,20 +262,32 @@ extern int sync_file_range (int __fd, __off64_t __offset, __off64_t __count, unsigned int __flags); -/* Splice address range into a pipe. */ +/* Splice address range into a pipe. + + This function is a possible cancellation point and therefore not + marked with __THROW. */ extern ssize_t vmsplice (int __fdout, const struct iovec *__iov, size_t __count, unsigned int __flags); -/* Splice two files together. */ +/* Splice two files together. + + This function is a possible cancellation point and therefore not + marked with __THROW. */ extern ssize_t splice (int __fdin, __off64_t *__offin, int __fdout, __off64_t *__offout, size_t __len, unsigned int __flags); -/* In-kernel implementation of tee for pipe buffers. */ +/* In-kernel implementation of tee for pipe buffers. + + This function is a possible cancellation point and therefore not + marked with __THROW. */ extern ssize_t tee (int __fdin, int __fdout, size_t __len, unsigned int __flags); -/* Reserve storage for the data of the file associated with FD. */ +/* Reserve storage for the data of the file associated with FD. + + This function is a possible cancellation point and therefore not + marked with __THROW. */ # ifndef __USE_FILE_OFFSET64 extern int fallocate (int __fd, int __mode, __off_t __offset, __off_t __len); # else @@ -278,6 +304,19 @@ extern int fallocate64 (int __fd, int __mode, __off64_t __offset, __off64_t __len); # endif + +/* Map file name to file handle. */ +extern int name_to_handle_at (int __dfd, const char *__name, + struct file_handle *__handle, int *__mnt_id, + int __flags) __THROW; + +/* Open file using the file handle. + + This function is a possible cancellation point and therefore not + marked with __THROW. */ +extern int open_by_handle_at (int __mountdirfd, struct file_handle *__handle, + int __flags); + #endif __END_DECLS diff --git a/ports/sysdeps/unix/sysv/linux/arm/eabi/____longjmp_chk.S b/ports/sysdeps/unix/sysv/linux/arm/eabi/____longjmp_chk.S index 508b4babd..9d8e46458 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/eabi/____longjmp_chk.S +++ b/ports/sysdeps/unix/sysv/linux/arm/eabi/____longjmp_chk.S @@ -52,13 +52,15 @@ longjmp_msg: cfi_remember_state; \ cmp sp, reg; \ bls .Lok; \ + str r7, [sp, #-4]!; \ + cfi_adjust_cfa_offset (4); \ + cfi_rel_offset (r7, 0); \ mov r5, r0; \ cfi_undefined (r5); \ mov r7, #SYS_ify(sigaltstack); \ - cfi_undefined (r7); \ mov r0, #0; \ - sub sp, sp, #16; /* >= sizeof (stack_t) */ \ - cfi_adjust_cfa_offset (16); \ + sub sp, sp, #12; /* == sizeof (stack_t) */ \ + cfi_adjust_cfa_offset (12); \ cfi_remember_state; \ mov r1, sp; \ swi #0; \ @@ -74,6 +76,11 @@ longjmp_msg: cmp r2, r3; \ bhi .Lok2; \ .Lfail: \ + add sp, sp, #12; \ + cfi_adjust_cfa_offset (-12); \ + ldr r7, [sp], #4; \ + cfi_adjust_cfa_offset (-4); \ + cfi_restore (r7); \ CALL_FAIL \ cfi_restore_state; \ .Lok2: \ diff --git a/ports/sysdeps/unix/sysv/linux/arm/eabi/linuxthreads/sysdep-cancel.h b/ports/sysdeps/unix/sysv/linux/arm/eabi/linuxthreads/sysdep-cancel.h deleted file mode 100644 index bc520426e..000000000 --- a/ports/sysdeps/unix/sysv/linux/arm/eabi/linuxthreads/sysdep-cancel.h +++ /dev/null @@ -1,116 +0,0 @@ -/* Copyright (C) 2003, 2005 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 -#ifndef __ASSEMBLER__ -# include -#endif - -#if !defined NOT_IN_libc || defined IS_IN_libpthread - -# undef PSEUDO -# define PSEUDO(name, syscall_name, args) \ - .section ".text"; \ - PSEUDO_PROLOGUE; \ - ENTRY (name); \ - SINGLE_THREAD_P; \ - DOARGS_##args; \ - bne .Lpseudo_cancel; \ - mov ip, r7; \ - ldr r7, =SYS_ify (syscall_name); \ - swi 0x0; \ - mov r7, ip; \ - UNDOARGS_##args; \ - cmn r0, $4096; \ - PSEUDO_RET; \ - .Lpseudo_cancel: \ - DOCARGS_##args; /* save syscall args etc. around CENABLE. */ \ - CENABLE; \ - mov ip, r0; /* put mask in safe place. */ \ - UNDOCARGS_##args; /* restore syscall args. */ \ - ldr r7, =SYS_ify (syscall_name); \ - swi 0x0; /* do the call. */ \ - mov r7, r0; /* save syscall return value. */ \ - mov r0, ip; /* get mask back. */ \ - CDISABLE; \ - mov r0, r7; /* retrieve return value. */ \ - RESTORE_LR_##args; \ - UNDOARGS_##args; \ - cmn r0, $4096; - -/* DOARGS pushes four bytes on the stack for five arguments, eight bytes for - six arguments, and nothing for fewer. In order to preserve doubleword - alignment, sometimes we must save an extra register. */ - -# define DOCARGS_0 stmfd sp!, {r7, lr} -# define UNDOCARGS_0 -# define RESTORE_LR_0 ldmfd sp!, {r7, lr} - -# define DOCARGS_1 stmfd sp!, {r0, r1, r7, lr} -# define UNDOCARGS_1 ldr r0, [sp], #8 -# define RESTORE_LR_1 RESTORE_LR_0 - -# define DOCARGS_2 stmfd sp!, {r0, r1, r7, lr} -# define UNDOCARGS_2 ldmfd sp!, {r0, r1} -# define RESTORE_LR_2 RESTORE_LR_0 - -# define DOCARGS_3 stmfd sp!, {r0, r1, r2, r3, r7, lr} -# define UNDOCARGS_3 ldmfd sp!, {r0, r1, r2, r3} -# define RESTORE_LR_3 RESTORE_LR_0 - -# define DOCARGS_4 stmfd sp!, {r0, r1, r2, r3, r7, lr} -# define UNDOCARGS_4 ldmfd sp!, {r0, r1, r2, r3} -# define RESTORE_LR_4 RESTORE_LR_0 - -# define DOCARGS_5 stmfd sp!, {r0, r1, r2, r3, r4, r7, lr} -# define UNDOCARGS_5 ldmfd sp!, {r0, r1, r2, r3} -# define RESTORE_LR_5 ldmfd sp!, {r4, r7, lr} - -# define DOCARGS_6 stmfd sp!, {r0, r1, r2, r3, r7, lr} -# define UNDOCARGS_6 ldmfd sp!, {r0, r1, r2, r3} -# define RESTORE_LR_6 RESTORE_LR_0 - -# ifdef IS_IN_libpthread -# define CENABLE bl PLTJMP(__pthread_enable_asynccancel) -# define CDISABLE bl PLTJMP(__pthread_disable_asynccancel) -# define __local_multiple_threads __pthread_multiple_threads -# else -# define CENABLE bl PLTJMP(__libc_enable_asynccancel) -# define CDISABLE bl PLTJMP(__libc_disable_asynccancel) -# define __local_multiple_threads __libc_multiple_threads -# endif - -# ifndef __ASSEMBLER__ -extern int __local_multiple_threads attribute_hidden; -# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1) -# else -# define SINGLE_THREAD_P \ - ldr ip, 1b; \ -2: \ - ldr ip, [pc, ip]; \ - teq ip, #0; -# define PSEUDO_PROLOGUE \ - 1: .word __local_multiple_threads - 2f - 8; -# endif - -#else - -/* For rtld, et cetera. */ -# define SINGLE_THREAD_P 1 - -#endif diff --git a/ports/sysdeps/unix/sysv/linux/arm/eabi/nptl/sysdep-cancel.h b/ports/sysdeps/unix/sysv/linux/arm/eabi/nptl/sysdep-cancel.h index 458558b9c..3fadebde7 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/eabi/nptl/sysdep-cancel.h +++ b/ports/sysdeps/unix/sysv/linux/arm/eabi/nptl/sysdep-cancel.h @@ -39,6 +39,7 @@ .cfi_sections .debug_frame; \ cfi_startproc; \ DO_CALL (syscall_name, args); \ + cmn r0, $4096; \ PSEUDO_RET; \ cfi_endproc; \ .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \ @@ -47,20 +48,20 @@ DOARGS_##args; \ bne .Lpseudo_cancel; \ cfi_remember_state; \ - DO_CALL (syscall_name, 0); \ + ldr r7, =SYS_ify (syscall_name); \ + swi 0x0; \ UNDOARGS_##args; \ cmn r0, $4096; \ PSEUDO_RET; \ cfi_restore_state; \ .Lpseudo_cancel: \ - .fnstart; \ + .fnstart; /* matched by the .fnend in UNDOARGS below. */ \ DOCARGS_##args; /* save syscall args etc. around CENABLE. */ \ CENABLE; \ mov ip, r0; /* put mask in safe place. */ \ UNDOCARGS_##args; /* restore syscall args. */ \ ldr r7, =SYS_ify (syscall_name); \ swi 0x0; /* do the call. */ \ - .fnend; /* Past here we can't easily unwind. */ \ mov r7, r0; /* save syscall return value. */ \ mov r0, ip; /* get mask back. */ \ CDISABLE; \ @@ -69,34 +70,34 @@ UNDOARGS_##args; \ cmn r0, $4096 -/* DOARGS pushes four bytes on the stack for five arguments, eight bytes for - six arguments, and nothing for fewer. In order to preserve doubleword +/* DOARGS pushes eight bytes on the stack for five arguments, twelve bytes for + six arguments, and four bytes for fewer. In order to preserve doubleword alignment, sometimes we must save an extra register. */ # define RESTART_UNWIND \ .fnend; \ .fnstart; \ - .save {r7, lr} + .save {r7}; \ + .save {lr} # define DOCARGS_0 \ - stmfd sp!, {r7, lr}; \ - cfi_adjust_cfa_offset (8); \ - cfi_rel_offset (r7, 0); \ - cfi_rel_offset (lr, 4); \ - .save {r7, lr} + .save {r7}; \ + str lr, [sp, #-4]!; \ + cfi_adjust_cfa_offset (4); \ + cfi_rel_offset (lr, 0); \ + .save {lr} # define UNDOCARGS_0 # define RESTORE_LR_0 \ - ldmfd sp!, {r7, lr}; \ - cfi_adjust_cfa_offset (-8); \ - cfi_restore (r7); \ + ldr lr, [sp], #4; \ + cfi_adjust_cfa_offset (-4); \ cfi_restore (lr) # define DOCARGS_1 \ - stmfd sp!, {r0, r1, r7, lr}; \ - cfi_adjust_cfa_offset (16); \ - cfi_rel_offset (r7, 8); \ - cfi_rel_offset (lr, 12); \ - .save {r7, lr}; \ + .save {r7}; \ + stmfd sp!, {r0, r1, lr}; \ + cfi_adjust_cfa_offset (12); \ + cfi_rel_offset (lr, 8); \ + .save {lr}; \ .pad #8 # define UNDOCARGS_1 \ ldr r0, [sp], #8; \ @@ -106,11 +107,11 @@ RESTORE_LR_0 # define DOCARGS_2 \ - stmfd sp!, {r0, r1, r7, lr}; \ - cfi_adjust_cfa_offset (16); \ - cfi_rel_offset (r7, 8); \ - cfi_rel_offset (lr, 12); \ - .save {r7, lr}; \ + .save {r7}; \ + stmfd sp!, {r0, r1, lr}; \ + cfi_adjust_cfa_offset (12); \ + cfi_rel_offset (lr, 8); \ + .save {lr}; \ .pad #8 # define UNDOCARGS_2 \ ldmfd sp!, {r0, r1}; \ @@ -120,11 +121,11 @@ RESTORE_LR_0 # define DOCARGS_3 \ - stmfd sp!, {r0, r1, r2, r3, r7, lr}; \ - cfi_adjust_cfa_offset (24); \ - cfi_rel_offset (r7, 16); \ - cfi_rel_offset (lr, 20); \ - .save {r7, lr}; \ + .save {r7}; \ + stmfd sp!, {r0, r1, r2, r3, lr}; \ + cfi_adjust_cfa_offset (20); \ + cfi_rel_offset (lr, 16); \ + .save {lr}; \ .pad #16 # define UNDOCARGS_3 \ ldmfd sp!, {r0, r1, r2, r3}; \ @@ -134,11 +135,11 @@ RESTORE_LR_0 # define DOCARGS_4 \ - stmfd sp!, {r0, r1, r2, r3, r7, lr}; \ - cfi_adjust_cfa_offset (24); \ - cfi_rel_offset (r7, 16); \ - cfi_rel_offset (lr, 20); \ - .save {r7, lr}; \ + .save {r7}; \ + stmfd sp!, {r0, r1, r2, r3, lr}; \ + cfi_adjust_cfa_offset (20); \ + cfi_rel_offset (lr, 16); \ + .save {lr}; \ .pad #16 # define UNDOCARGS_4 \ ldmfd sp!, {r0, r1, r2, r3}; \ @@ -149,43 +150,40 @@ /* r4 is only stmfd'ed for correct stack alignment. */ # define DOCARGS_5 \ - .save {r4}; \ - stmfd sp!, {r0, r1, r2, r3, r4, r7, lr}; \ - cfi_adjust_cfa_offset (28); \ - cfi_rel_offset (r7, 20); \ - cfi_rel_offset (lr, 24); \ - .save {r7, lr}; \ + .save {r4, r7}; \ + stmfd sp!, {r0, r1, r2, r3, r4, lr}; \ + cfi_adjust_cfa_offset (24); \ + cfi_rel_offset (lr, 20); \ + .save {lr}; \ .pad #20 # define UNDOCARGS_5 \ ldmfd sp!, {r0, r1, r2, r3}; \ cfi_adjust_cfa_offset (-16); \ .fnend; \ .fnstart; \ - .save {r4}; \ - .save {r7, lr}; \ + .save {r4, r7}; \ + .save {lr}; \ .pad #4 # define RESTORE_LR_5 \ - ldmfd sp!, {r4, r7, lr}; \ - cfi_adjust_cfa_offset (-12); \ + ldmfd sp!, {r4, lr}; \ + cfi_adjust_cfa_offset (-8); \ /* r4 will be marked as restored later. */ \ - cfi_restore (r7); \ cfi_restore (lr) # define DOCARGS_6 \ - .save {r4, r5}; \ - stmfd sp!, {r0, r1, r2, r3, r7, lr}; \ - cfi_adjust_cfa_offset (24); \ - cfi_rel_offset (r7, 16); \ - cfi_rel_offset (lr, 20); \ - .save {r7, lr}; \ + .save {r4, r5, r7}; \ + stmfd sp!, {r0, r1, r2, r3, lr}; \ + cfi_adjust_cfa_offset (20); \ + cfi_rel_offset (lr, 16); \ + .save {lr}; \ .pad #16 # define UNDOCARGS_6 \ ldmfd sp!, {r0, r1, r2, r3}; \ cfi_adjust_cfa_offset (-16); \ .fnend; \ .fnstart; \ - .save {r4, r5}; \ - .save {r7, lr} + .save {r4, r5, r7}; \ + .save {lr}; # define RESTORE_LR_6 \ RESTORE_LR_0 diff --git a/ports/sysdeps/unix/sysv/linux/arm/eabi/sysdep.h b/ports/sysdeps/unix/sysv/linux/arm/eabi/sysdep.h index b7815babf..a80621e14 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/eabi/sysdep.h +++ b/ports/sysdeps/unix/sysv/linux/arm/eabi/sysdep.h @@ -106,12 +106,95 @@ #undef DO_CALL #define DO_CALL(syscall_name, args) \ DOARGS_##args; \ - mov ip, r7; \ - cfi_register (r7, ip); \ ldr r7, =SYS_ify (syscall_name); \ swi 0x0; \ - mov r7, ip; \ - cfi_restore (r7); \ UNDOARGS_##args +#undef DOARGS_0 +#define DOARGS_0 \ + .fnstart; \ + str r7, [sp, #-4]!; \ + cfi_adjust_cfa_offset (4); \ + cfi_rel_offset (r7, 0); \ + .save { r7 } +#undef DOARGS_1 +#define DOARGS_1 DOARGS_0 +#undef DOARGS_2 +#define DOARGS_2 DOARGS_0 +#undef DOARGS_3 +#define DOARGS_3 DOARGS_0 +#undef DOARGS_4 +#define DOARGS_4 DOARGS_0 +#undef DOARGS_5 +#define DOARGS_5 \ + .fnstart; \ + stmfd sp!, {r4, r7}; \ + cfi_adjust_cfa_offset (8); \ + cfi_rel_offset (r4, 0); \ + cfi_rel_offset (r7, 4); \ + .save { r4, r7 }; \ + ldr r4, [sp, #8] +#undef DOARGS_6 +#define DOARGS_6 \ + .fnstart; \ + mov ip, sp; \ + stmfd sp!, {r4, r5, r7}; \ + cfi_adjust_cfa_offset (12); \ + cfi_rel_offset (r4, 0); \ + cfi_rel_offset (r5, 4); \ + cfi_rel_offset (r7, 8); \ + .save { r4, r5, r7 }; \ + ldmia ip, {r4, r5} +#undef DOARGS_7 +#define DOARGS_7 \ + .fnstart; \ + mov ip, sp; \ + stmfd sp!, {r4, r5, r6, r7}; \ + cfi_adjust_cfa_offset (16); \ + cfi_rel_offset (r4, 0); \ + cfi_rel_offset (r5, 4); \ + cfi_rel_offset (r6, 8); \ + cfi_rel_offset (r7, 12); \ + .save { r4, r5, r6, r7 }; \ + ldmia ip, {r4, r5, r6} + +#undef UNDOARGS_0 +#define UNDOARGS_0 \ + ldr r7, [sp], #4; \ + cfi_adjust_cfa_offset (-4); \ + cfi_restore (r7); \ + .fnend +#undef UNDOARGS_1 +#define UNDOARGS_1 UNDOARGS_0 +#undef UNDOARGS_2 +#define UNDOARGS_2 UNDOARGS_0 +#undef UNDOARGS_3 +#define UNDOARGS_3 UNDOARGS_0 +#undef UNDOARGS_4 +#define UNDOARGS_4 UNDOARGS_0 +#undef UNDOARGS_5 +#define UNDOARGS_5 \ + ldmfd sp!, {r4, r7}; \ + cfi_adjust_cfa_offset (-8); \ + cfi_restore (r4); \ + cfi_restore (r7); \ + .fnend +#undef UNDOARGS_6 +#define UNDOARGS_6 \ + ldmfd sp!, {r4, r5, r7}; \ + cfi_adjust_cfa_offset (-12); \ + cfi_restore (r4); \ + cfi_restore (r5); \ + cfi_restore (r7); \ + .fnend +#undef UNDOARGS_7 +#define UNDOARGS_7 \ + ldmfd sp!, {r4, r5, r6, r7}; \ + cfi_adjust_cfa_offset (-16); \ + cfi_restore (r4); \ + cfi_restore (r5); \ + cfi_restore (r6); \ + cfi_restore (r7); \ + .fnend + #endif /* _LINUX_ARM_EABI_SYSDEP_H */ diff --git a/ports/sysdeps/unix/sysv/linux/arm/linuxthreads/fork.c b/ports/sysdeps/unix/sysv/linux/arm/linuxthreads/fork.c deleted file mode 100644 index 4fb0db2be..000000000 --- a/ports/sysdeps/unix/sysv/linux/arm/linuxthreads/fork.c +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/ports/sysdeps/unix/sysv/linux/arm/linuxthreads/sysdep-cancel.h b/ports/sysdeps/unix/sysv/linux/arm/linuxthreads/sysdep-cancel.h deleted file mode 100644 index b35d34728..000000000 --- a/ports/sysdeps/unix/sysv/linux/arm/linuxthreads/sysdep-cancel.h +++ /dev/null @@ -1,129 +0,0 @@ -/* Copyright (C) 2003, 2005 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Phil Blundell , 2003. - - 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 -#ifndef __ASSEMBLER__ -# include -#endif - -#if !defined NOT_IN_libc || defined IS_IN_libpthread - -/* We push lr onto the stack, so we have to use ldmib instead of ldmia - to find the saved arguments. */ -# ifdef PIC -# undef DOARGS_5 -# undef DOARGS_6 -# undef DOARGS_7 -# define DOARGS_5 str r4, [sp, $-4]!; ldr r4, [sp, $8]; -# define DOARGS_6 mov ip, sp; stmfd sp!, {r4, r5}; ldmib ip, {r4, r5}; -# define DOARGS_7 mov ip, sp; stmfd sp!, {r4, r5, r6}; ldmib ip, {r4, r5, r6}; -# endif - -# undef PSEUDO_RET -# define PSEUDO_RET \ - ldrcc pc, [sp], $4; \ - ldr lr, [sp], $4; \ - b PLTJMP(SYSCALL_ERROR) - -# undef PSEUDO -# define PSEUDO(name, syscall_name, args) \ - .section ".text"; \ - PSEUDO_PROLOGUE; \ - ENTRY (name); \ - SINGLE_THREAD_P; \ - bne .Lpseudo_cancel; \ - DO_CALL (syscall_name, args); \ - cmn r0, $4096; \ - RETINSTR(cc, lr); \ - b PLTJMP(SYSCALL_ERROR); \ - .Lpseudo_cancel: \ - str lr, [sp, $-4]!; \ - DOCARGS_##args; /* save syscall args around CENABLE. */ \ - CENABLE; \ - mov ip, r0; /* put mask in safe place. */ \ - UNDOCARGS_##args; /* restore syscall args. */ \ - swi SYS_ify (syscall_name); /* do the call. */ \ - str r0, [sp, $-4]!; /* save syscall return value. */ \ - mov r0, ip; /* get mask back. */ \ - CDISABLE; \ - ldr r0, [sp], $4; /* retrieve return value. */ \ - UNDOC2ARGS_##args; /* fix register damage. */ \ - cmn r0, $4096; - -# define DOCARGS_0 -# define UNDOCARGS_0 -# define UNDOC2ARGS_0 - -# define DOCARGS_1 str r0, [sp, #-4]!; -# define UNDOCARGS_1 ldr r0, [sp], #4; -# define UNDOC2ARGS_1 - -# define DOCARGS_2 str r1, [sp, #-4]!; str r0, [sp, #-4]!; -# define UNDOCARGS_2 ldr r0, [sp], #4; ldr r1, [sp], #4; -# define UNDOC2ARGS_2 - -# define DOCARGS_3 str r2, [sp, #-4]!; str r1, [sp, #-4]!; str r0, [sp, #-4]!; -# define UNDOCARGS_3 ldr r0, [sp], #4; ldr r1, [sp], #4; ldr r2, [sp], #4 -# define UNDOC2ARGS_3 - -# define DOCARGS_4 stmfd sp!, {r0-r3} -# define UNDOCARGS_4 ldmfd sp!, {r0-r3} -# define UNDOC2ARGS_4 - -# define DOCARGS_5 stmfd sp!, {r0-r3} -# define UNDOCARGS_5 ldmfd sp, {r0-r3}; str r4, [sp, #-4]!; ldr r4, [sp, #24] -# define UNDOC2ARGS_5 ldr r4, [sp], #20 - -# ifdef IS_IN_libpthread -# define CENABLE bl PLTJMP(__pthread_enable_asynccancel) -# define CDISABLE bl PLTJMP(__pthread_disable_asynccancel) -# define __local_multiple_threads __pthread_multiple_threads -# else -# define CENABLE bl PLTJMP(__libc_enable_asynccancel) -# define CDISABLE bl PLTJMP(__libc_disable_asynccancel) -# define __local_multiple_threads __libc_multiple_threads -# endif - -# ifndef __ASSEMBLER__ -extern int __local_multiple_threads attribute_hidden; -# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1) -# else -# if !defined PIC -# define SINGLE_THREAD_P \ - ldr ip, =__local_multiple_threads; \ - ldr ip, [ip]; \ - teq ip, #0; -# define PSEUDO_PROLOGUE -# else -# define SINGLE_THREAD_P \ - ldr ip, 1b; \ -2: \ - ldr ip, [pc, ip]; \ - teq ip, #0; -# define PSEUDO_PROLOGUE \ - 1: .word __local_multiple_threads - 2f - 8; -# endif -# endif - -#elif !defined __ASSEMBLER__ - -/* This code should never be used but we define it anyhow. */ -# define SINGLE_THREAD_P (1) - -#endif diff --git a/ports/sysdeps/unix/sysv/linux/arm/linuxthreads/vfork.S b/ports/sysdeps/unix/sysv/linux/arm/linuxthreads/vfork.S deleted file mode 100644 index b826a99ad..000000000 --- a/ports/sysdeps/unix/sysv/linux/arm/linuxthreads/vfork.S +++ /dev/null @@ -1,78 +0,0 @@ -/* Copyright (C) 1999, 2002, 2003, 2005 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Philip Blundell . - - 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 -#define _ERRNO_H 1 -#include -#include - -/* Clone the calling process, but without copying the whole address space. - The calling process is suspended until 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. */ - -ENTRY (__vfork) - -#ifdef __NR_vfork - -#ifdef SHARED - ldr ip, 1f - ldr r0, 2f -3: add ip, pc, ip - ldr r0, [ip, r0] -#else - ldr r0, 1f -#endif - movs r0, r0 - bne HIDDEN_JUMPTARGET (__fork) - - DO_CALL (vfork, 0) - cmn a1, #4096 - RETINSTR(cc, lr) - -#ifndef __ASSUME_VFORK_SYSCALL - /* Check if vfork syscall is known at all. */ - cmn a1, #ENOSYS - bne PLTJMP(C_SYMBOL_NAME(__syscall_error)) -#endif - -#endif - -#ifndef __ASSUME_VFORK_SYSCALL - /* If we don't have vfork, fork is close enough. */ - DO_CALL (fork, 0) - cmn a1, #4096 - RETINSTR(cc, lr) -#elif !defined __NR_vfork -# error "__NR_vfork not available and __ASSUME_VFORK_SYSCALL defined" -#endif - b PLTJMP(C_SYMBOL_NAME(__syscall_error)) - -#ifdef SHARED -1: .word _GLOBAL_OFFSET_TABLE_ - 3b - 8 -2: .word __libc_pthread_functions(GOTOFF) -#else - .weak pthread_create -1: .word pthread_create -#endif - -PSEUDO_END (__vfork) -libc_hidden_def (__vfork) - -weak_alias (__vfork, vfork) diff --git a/ports/sysdeps/unix/sysv/linux/arm/vfork.S b/ports/sysdeps/unix/sysv/linux/arm/vfork.S index a02065898..e63690eec 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/vfork.S +++ b/ports/sysdeps/unix/sysv/linux/arm/vfork.S @@ -33,7 +33,28 @@ ENTRY (__vfork) #ifdef SAVE_PID SAVE_PID #endif - DO_CALL (vfork, 0) +#ifdef __ARM_EABI__ + /* The DO_CALL macro saves r7 on the stack, to enable generation + of ARM unwind info. Since the stack is initially shared between + parent and child of vfork, that saved value could be corrupted. + To avoid this problem, we save r7 into ip as well, and restore + from there. */ + mov ip, r7 + cfi_register (r7, ip) + .fnstart + str r7, [sp, #-4]! + cfi_adjust_cfa_offset (4) + .save { r7 } + ldr r7, =SYS_ify (vfork) + swi 0x0 + .fnend + add sp, sp, #4 + cfi_adjust_cfa_offset (-4) + mov r7, ip + cfi_restore (r7); +#else + swi SYS_ify(vfork) +#endif #ifdef RESTORE_PID RESTORE_PID #endif diff --git a/ports/sysdeps/unix/sysv/linux/mips/bits/fcntl.h b/ports/sysdeps/unix/sysv/linux/mips/bits/fcntl.h index 31cb86112..1da157617 100644 --- a/ports/sysdeps/unix/sysv/linux/mips/bits/fcntl.h +++ b/ports/sysdeps/unix/sysv/linux/mips/bits/fcntl.h @@ -1,6 +1,6 @@ /* O_*, F_*, FD_* bit values for Linux. Copyright (C) 1995, 1996, 1997, 1998, 2000, 2002, 2003, 2004, 2006, - 2007, 2009, 2010 Free Software Foundation, Inc. + 2007, 2009, 2010, 2011 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 @@ -54,6 +54,7 @@ #ifdef __USE_GNU # define O_DIRECT 0x8000 /* Direct disk access hint. */ # define O_NOATIME 0x40000 /* Do not set atime. */ +# define O_PATH 010000000 /* Resolve pathname but do not open file. */ #endif /* For now Linux has no synchronisity options for data and read operations. @@ -245,6 +246,19 @@ struct f_owner_ex we splice from/to). */ # define SPLICE_F_MORE 4 /* Expect more data. */ # define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */ + + +/* File handle structure. */ +struct file_handle +{ + unsigned int handle_bytes; + int handle_type; + /* File identifier. */ + unsigned char f_handle[0]; +}; + +/* Maximum handle size (for now). */ +# define MAX_HANDLE_SZ 128 #endif __BEGIN_DECLS @@ -261,20 +275,32 @@ extern int sync_file_range (int __fd, __off64_t __offset, __off64_t __count, unsigned int __flags); -/* Splice address range into a pipe. */ +/* Splice address range into a pipe. + + This function is a possible cancellation point and therefore not + marked with __THROW. */ extern ssize_t vmsplice (int __fdout, const struct iovec *__iov, size_t __count, unsigned int __flags); -/* Splice two files together. */ +/* Splice two files together. + + This function is a possible cancellation point and therefore not + marked with __THROW. */ extern ssize_t splice (int __fdin, __off64_t *__offin, int __fdout, __off64_t *__offout, size_t __len, unsigned int __flags); -/* In-kernel implementation of tee for pipe buffers. */ +/* In-kernel implementation of tee for pipe buffers. + + This function is a possible cancellation point and therefore not + marked with __THROW. */ extern ssize_t tee (int __fdin, int __fdout, size_t __len, unsigned int __flags); -/* Reserve storage for the data of the file associated with FD. */ +/* Reserve storage for the data of the file associated with FD. + + This function is a possible cancellation point and therefore not + marked with __THROW. */ # ifndef __USE_FILE_OFFSET64 extern int fallocate (int __fd, int __mode, __off_t __offset, __off_t __len); # else @@ -291,6 +317,19 @@ extern int fallocate64 (int __fd, int __mode, __off64_t __offset, __off64_t __len); # endif + +/* Map file name to file handle. */ +extern int name_to_handle_at (int __dfd, const char *__name, + struct file_handle *__handle, int *__mnt_id, + int __flags) __THROW; + +/* Open file using the file handle. + + This function is a possible cancellation point and therefore not + marked with __THROW. */ +extern int open_by_handle_at (int __mountdirfd, struct file_handle *__handle, + int __flags); + #endif __END_DECLS diff --git a/ports/sysdeps/unix/sysv/linux/mips/mips32/sync_file_range.c b/ports/sysdeps/unix/sysv/linux/mips/mips32/sync_file_range.c index 13a21b0da..21da50e3e 100644 --- a/ports/sysdeps/unix/sysv/linux/mips/mips32/sync_file_range.c +++ b/ports/sysdeps/unix/sysv/linux/mips/mips32/sync_file_range.c @@ -1,5 +1,5 @@ /* Selective file content synch'ing. - Copyright (C) 2006, 2007 Free Software Foundation, Inc. + Copyright (C) 2006, 2007, 2011 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 @@ -21,7 +21,7 @@ #include #include -#include +#include #include @@ -29,10 +29,23 @@ int sync_file_range (int fd, __off64_t from, __off64_t to, unsigned int flags) { - return INLINE_SYSCALL (sync_file_range, 7, fd, 0, - __LONG_LONG_PAIR ((long) (from >> 32), (long) from), - __LONG_LONG_PAIR ((long) (to >> 32), (long) to), - flags); + if (SINGLE_THREAD_P) + return INLINE_SYSCALL (sync_file_range, 7, fd, 0, + __LONG_LONG_PAIR ((long) (from >> 32), (long) from), + __LONG_LONG_PAIR ((long) (to >> 32), (long) to), + flags); + + int result; + int oldtype = LIBC_CANCEL_ASYNC (); + + result = INLINE_SYSCALL (sync_file_range, 7, fd, 0, + __LONG_LONG_PAIR ((long) (from >> 32), (long) from), + __LONG_LONG_PAIR ((long) (to >> 32), (long) to), + flags); + + LIBC_CANCEL_RESET (oldtype); + + return result; } #else int diff --git a/ports/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c b/ports/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c index f973250de..0aecba10e 100644 --- a/ports/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c +++ b/ports/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2007, 2009 Free Software Foundation, Inc. +/* Copyright (C) 2007, 2009, 2011 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 @@ -18,7 +18,7 @@ #include #include -#include +#include /* Reserve storage for the data of the file associated with FD. */ @@ -26,7 +26,17 @@ int fallocate (int fd, int mode, __off_t offset, __off_t len) { #ifdef __NR_fallocate - return INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len); + if (SINGLE_THREAD_P) + return INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len); + + int result; + int oldtype = LIBC_CANCEL_ASYNC (); + + result = INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len); + + LIBC_CANCEL_RESET (oldtype); + + return result; #else __set_errno (ENOSYS); return -1; diff --git a/ports/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c b/ports/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c index 1f37f9121..670cb0e32 100644 --- a/ports/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c +++ b/ports/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2007, 2009 Free Software Foundation, Inc. +/* Copyright (C) 2007, 2009, 2011 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 @@ -18,7 +18,7 @@ #include #include -#include +#include /* Reserve storage for the data of the file associated with FD. */ @@ -26,7 +26,17 @@ int fallocate64 (int fd, int mode, __off64_t offset, __off64_t len) { #ifdef __NR_fallocate - return INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len); + if (SINGLE_THREAD_P) + return INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len); + + int result; + int oldtype = LIBC_CANCEL_ASYNC (); + + result = INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len); + + LIBC_CANCEL_RESET (oldtype); + + return result; #else __set_errno (ENOSYS); return -1; diff --git a/ports/sysdeps/unix/sysv/linux/mips/mips64/n32/syscalls.list b/ports/sysdeps/unix/sysv/linux/mips/mips64/n32/syscalls.list index 87c194990..0d37a9b48 100644 --- a/ports/sysdeps/unix/sysv/linux/mips/mips64/n32/syscalls.list +++ b/ports/sysdeps/unix/sysv/linux/mips/mips64/n32/syscalls.list @@ -1,7 +1,7 @@ # File name Caller Syscall name # args Strong name Weak names readahead - readahead i:iii __readahead readahead -sync_file_range - sync_file_range i:iiii sync_file_range +sync_file_range - sync_file_range Ci:iiii sync_file_range ftruncate - ftruncate i:ii __ftruncate ftruncate ftruncate64 __ftruncate64 truncate - truncate i:si truncate truncate64 diff --git a/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/syscalls.list b/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/syscalls.list index 2c8c4d484..8d70e457f 100644 --- a/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/syscalls.list +++ b/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/syscalls.list @@ -1,5 +1,7 @@ # File name Caller Syscall name # args Strong name Weak names +sync_file_range - sync_file_range Ci:iiii sync_file_range + prlimit EXTRA prlimit64 i:iipp prlimit prlimit64 fanotify_mark EXTRA fanotify_mark i:iiiis fanotify_mark -- cgit v1.2.1