Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'x86-x32-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull x32 support for x86-64 from Ingo Molnar:
"This tree introduces the X32 binary format and execution mode for x86:
32-bit data space binaries using 64-bit instructions and 64-bit kernel
syscalls.

This allows applications whose working set fits into a 32 bits address
space to make use of 64-bit instructions while using a 32-bit address
space with shorter pointers, more compressed data structures, etc."

Fix up trivial context conflicts in arch/x86/{Kconfig,vdso/vma.c}

* 'x86-x32-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (71 commits)
x32: Fix alignment fail in struct compat_siginfo
x32: Fix stupid ia32/x32 inversion in the siginfo format
x32: Add ptrace for x32
x32: Switch to a 64-bit clock_t
x32: Provide separate is_ia32_task() and is_x32_task() predicates
x86, mtrr: Use explicit sizing and padding for the 64-bit ioctls
x86/x32: Fix the binutils auto-detect
x32: Warn and disable rather than error if binutils too old
x32: Only clear TIF_X32 flag once
x32: Make sure TS_COMPAT is cleared for x32 tasks
fs: Remove missed ->fds_bits from cessation use of fd_set structs internally
fs: Fix close_on_exec pointer in alloc_fdtable
x32: Drop non-__vdso weak symbols from the x32 VDSO
x32: Fix coding style violations in the x32 VDSO code
x32: Add x32 VDSO support
x32: Allow x32 to be configured
x32: If configured, add x32 system calls to system call tables
x32: Handle process creation
x32: Signal-related system calls
x86: Add #ifdef CONFIG_COMPAT to <asm/sys_ia32.h>
...

+1561 -2180
+2 -2
Documentation/filesystems/files.txt
··· 113 113 if (fd >= 0) { 114 114 /* locate_fd() may have expanded fdtable, load the ptr */ 115 115 fdt = files_fdtable(files); 116 - FD_SET(fd, fdt->open_fds); 117 - FD_CLR(fd, fdt->close_on_exec); 116 + __set_open_fd(fd, fdt); 117 + __clear_close_on_exec(fd, fdt); 118 118 spin_unlock(&files->file_lock); 119 119 ..... 120 120
+5 -108
arch/alpha/include/asm/posix_types.h
··· 8 8 */ 9 9 10 10 typedef unsigned int __kernel_ino_t; 11 - typedef unsigned int __kernel_mode_t; 11 + #define __kernel_ino_t __kernel_ino_t 12 + 12 13 typedef unsigned int __kernel_nlink_t; 13 - typedef long __kernel_off_t; 14 - typedef long long __kernel_loff_t; 15 - typedef int __kernel_pid_t; 16 - typedef int __kernel_ipc_pid_t; 17 - typedef unsigned int __kernel_uid_t; 18 - typedef unsigned int __kernel_gid_t; 19 - typedef unsigned long __kernel_size_t; 20 - typedef long __kernel_ssize_t; 21 - typedef long __kernel_ptrdiff_t; 22 - typedef long __kernel_time_t; 23 - typedef long __kernel_suseconds_t; 24 - typedef long __kernel_clock_t; 25 - typedef int __kernel_daddr_t; 26 - typedef char * __kernel_caddr_t; 14 + #define __kernel_nlink_t __kernel_nlink_t 15 + 27 16 typedef unsigned long __kernel_sigset_t; /* at least 32 bits */ 28 - typedef unsigned short __kernel_uid16_t; 29 - typedef unsigned short __kernel_gid16_t; 30 - typedef int __kernel_clockid_t; 31 - typedef int __kernel_timer_t; 32 17 33 - typedef struct { 34 - int val[2]; 35 - } __kernel_fsid_t; 36 - 37 - typedef __kernel_uid_t __kernel_old_uid_t; 38 - typedef __kernel_gid_t __kernel_old_gid_t; 39 - typedef __kernel_uid_t __kernel_uid32_t; 40 - typedef __kernel_gid_t __kernel_gid32_t; 41 - 42 - typedef unsigned int __kernel_old_dev_t; 43 - 44 - #ifdef __KERNEL__ 45 - 46 - #ifndef __GNUC__ 47 - 48 - #define __FD_SET(d, set) ((set)->fds_bits[__FDELT(d)] |= __FDMASK(d)) 49 - #define __FD_CLR(d, set) ((set)->fds_bits[__FDELT(d)] &= ~__FDMASK(d)) 50 - #define __FD_ISSET(d, set) (((set)->fds_bits[__FDELT(d)] & __FDMASK(d)) != 0) 51 - #define __FD_ZERO(set) \ 52 - ((void) memset ((void *) (set), 0, sizeof (__kernel_fd_set))) 53 - 54 - #else /* __GNUC__ */ 55 - 56 - /* With GNU C, use inline functions instead so args are evaluated only once: */ 57 - 58 - #undef __FD_SET 59 - static __inline__ void __FD_SET(unsigned long fd, __kernel_fd_set *fdsetp) 60 - { 61 - unsigned long _tmp = fd / __NFDBITS; 62 - unsigned long _rem = fd % __NFDBITS; 63 - fdsetp->fds_bits[_tmp] |= (1UL<<_rem); 64 - } 65 - 66 - #undef __FD_CLR 67 - static __inline__ void __FD_CLR(unsigned long fd, __kernel_fd_set *fdsetp) 68 - { 69 - unsigned long _tmp = fd / __NFDBITS; 70 - unsigned long _rem = fd % __NFDBITS; 71 - fdsetp->fds_bits[_tmp] &= ~(1UL<<_rem); 72 - } 73 - 74 - #undef __FD_ISSET 75 - static __inline__ int __FD_ISSET(unsigned long fd, const __kernel_fd_set *p) 76 - { 77 - unsigned long _tmp = fd / __NFDBITS; 78 - unsigned long _rem = fd % __NFDBITS; 79 - return (p->fds_bits[_tmp] & (1UL<<_rem)) != 0; 80 - } 81 - 82 - /* 83 - * This will unroll the loop for the normal constant case (8 ints, 84 - * for a 256-bit fd_set) 85 - */ 86 - #undef __FD_ZERO 87 - static __inline__ void __FD_ZERO(__kernel_fd_set *p) 88 - { 89 - unsigned long *tmp = p->fds_bits; 90 - int i; 91 - 92 - if (__builtin_constant_p(__FDSET_LONGS)) { 93 - switch (__FDSET_LONGS) { 94 - case 16: 95 - tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; 96 - tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; 97 - tmp[ 8] = 0; tmp[ 9] = 0; tmp[10] = 0; tmp[11] = 0; 98 - tmp[12] = 0; tmp[13] = 0; tmp[14] = 0; tmp[15] = 0; 99 - return; 100 - 101 - case 8: 102 - tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; 103 - tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; 104 - return; 105 - 106 - case 4: 107 - tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; 108 - return; 109 - } 110 - } 111 - i = __FDSET_LONGS; 112 - while (i) { 113 - i--; 114 - *tmp = 0; 115 - tmp++; 116 - } 117 - } 118 - 119 - #endif /* __GNUC__ */ 120 - 121 - #endif /* __KERNEL__ */ 18 + #include <asm-generic/posix_types.h> 122 19 123 20 #endif /* _ALPHA_POSIX_TYPES_H */
+9 -46
arch/arm/include/asm/posix_types.h
··· 19 19 * assume GCC is being used. 20 20 */ 21 21 22 - typedef unsigned long __kernel_ino_t; 23 22 typedef unsigned short __kernel_mode_t; 23 + #define __kernel_mode_t __kernel_mode_t 24 + 24 25 typedef unsigned short __kernel_nlink_t; 25 - typedef long __kernel_off_t; 26 - typedef int __kernel_pid_t; 26 + #define __kernel_nlink_t __kernel_nlink_t 27 + 27 28 typedef unsigned short __kernel_ipc_pid_t; 29 + #define __kernel_ipc_pid_t __kernel_ipc_pid_t 30 + 28 31 typedef unsigned short __kernel_uid_t; 29 32 typedef unsigned short __kernel_gid_t; 30 - typedef unsigned int __kernel_size_t; 31 - typedef int __kernel_ssize_t; 32 - typedef int __kernel_ptrdiff_t; 33 - typedef long __kernel_time_t; 34 - typedef long __kernel_suseconds_t; 35 - typedef long __kernel_clock_t; 36 - typedef int __kernel_timer_t; 37 - typedef int __kernel_clockid_t; 38 - typedef int __kernel_daddr_t; 39 - typedef char * __kernel_caddr_t; 40 - typedef unsigned short __kernel_uid16_t; 41 - typedef unsigned short __kernel_gid16_t; 42 - typedef unsigned int __kernel_uid32_t; 43 - typedef unsigned int __kernel_gid32_t; 33 + #define __kernel_uid_t __kernel_uid_t 44 34 45 - typedef unsigned short __kernel_old_uid_t; 46 - typedef unsigned short __kernel_old_gid_t; 47 35 typedef unsigned short __kernel_old_dev_t; 36 + #define __kernel_old_dev_t __kernel_old_dev_t 48 37 49 - #ifdef __GNUC__ 50 - typedef long long __kernel_loff_t; 51 - #endif 52 - 53 - typedef struct { 54 - int val[2]; 55 - } __kernel_fsid_t; 56 - 57 - #if defined(__KERNEL__) 58 - 59 - #undef __FD_SET 60 - #define __FD_SET(fd, fdsetp) \ 61 - (((fd_set *)(fdsetp))->fds_bits[(fd) >> 5] |= (1<<((fd) & 31))) 62 - 63 - #undef __FD_CLR 64 - #define __FD_CLR(fd, fdsetp) \ 65 - (((fd_set *)(fdsetp))->fds_bits[(fd) >> 5] &= ~(1<<((fd) & 31))) 66 - 67 - #undef __FD_ISSET 68 - #define __FD_ISSET(fd, fdsetp) \ 69 - ((((fd_set *)(fdsetp))->fds_bits[(fd) >> 5] & (1<<((fd) & 31))) != 0) 70 - 71 - #undef __FD_ZERO 72 - #define __FD_ZERO(fdsetp) \ 73 - (memset (fdsetp, 0, sizeof (*(fd_set *)(fdsetp)))) 74 - 75 - #endif 38 + #include <asm-generic/posix_types.h> 76 39 77 40 #endif
+11 -96
arch/avr32/include/asm/posix_types.h
··· 14 14 * assume GCC is being used. 15 15 */ 16 16 17 - typedef unsigned long __kernel_ino_t; 18 17 typedef unsigned short __kernel_mode_t; 18 + #define __kernel_mode_t __kernel_mode_t 19 + 19 20 typedef unsigned short __kernel_nlink_t; 20 - typedef long __kernel_off_t; 21 - typedef int __kernel_pid_t; 21 + #define __kernel_nlink_t __kernel_nlink_t 22 + 22 23 typedef unsigned short __kernel_ipc_pid_t; 23 - typedef unsigned int __kernel_uid_t; 24 - typedef unsigned int __kernel_gid_t; 24 + #define __kernel_ipc_pid_t __kernel_ipc_pid_t 25 + 25 26 typedef unsigned long __kernel_size_t; 26 27 typedef long __kernel_ssize_t; 27 28 typedef int __kernel_ptrdiff_t; 28 - typedef long __kernel_time_t; 29 - typedef long __kernel_suseconds_t; 30 - typedef long __kernel_clock_t; 31 - typedef int __kernel_timer_t; 32 - typedef int __kernel_clockid_t; 33 - typedef int __kernel_daddr_t; 34 - typedef char * __kernel_caddr_t; 35 - typedef unsigned short __kernel_uid16_t; 36 - typedef unsigned short __kernel_gid16_t; 37 - typedef unsigned int __kernel_uid32_t; 38 - typedef unsigned int __kernel_gid32_t; 29 + #define __kernel_size_t __kernel_size_t 39 30 40 31 typedef unsigned short __kernel_old_uid_t; 41 32 typedef unsigned short __kernel_old_gid_t; 33 + #define __kernel_old_uid_t __kernel_old_uid_t 34 + 42 35 typedef unsigned short __kernel_old_dev_t; 36 + #define __kernel_old_dev_t __kernel_old_dev_t 43 37 44 - #ifdef __GNUC__ 45 - typedef long long __kernel_loff_t; 46 - #endif 47 - 48 - typedef struct { 49 - int val[2]; 50 - } __kernel_fsid_t; 51 - 52 - #if defined(__KERNEL__) 53 - 54 - #undef __FD_SET 55 - static __inline__ void __FD_SET(unsigned long __fd, __kernel_fd_set *__fdsetp) 56 - { 57 - unsigned long __tmp = __fd / __NFDBITS; 58 - unsigned long __rem = __fd % __NFDBITS; 59 - __fdsetp->fds_bits[__tmp] |= (1UL<<__rem); 60 - } 61 - 62 - #undef __FD_CLR 63 - static __inline__ void __FD_CLR(unsigned long __fd, __kernel_fd_set *__fdsetp) 64 - { 65 - unsigned long __tmp = __fd / __NFDBITS; 66 - unsigned long __rem = __fd % __NFDBITS; 67 - __fdsetp->fds_bits[__tmp] &= ~(1UL<<__rem); 68 - } 69 - 70 - 71 - #undef __FD_ISSET 72 - static __inline__ int __FD_ISSET(unsigned long __fd, const __kernel_fd_set *__p) 73 - { 74 - unsigned long __tmp = __fd / __NFDBITS; 75 - unsigned long __rem = __fd % __NFDBITS; 76 - return (__p->fds_bits[__tmp] & (1UL<<__rem)) != 0; 77 - } 78 - 79 - /* 80 - * This will unroll the loop for the normal constant case (8 ints, 81 - * for a 256-bit fd_set) 82 - */ 83 - #undef __FD_ZERO 84 - static __inline__ void __FD_ZERO(__kernel_fd_set *__p) 85 - { 86 - unsigned long *__tmp = __p->fds_bits; 87 - int __i; 88 - 89 - if (__builtin_constant_p(__FDSET_LONGS)) { 90 - switch (__FDSET_LONGS) { 91 - case 16: 92 - __tmp[ 0] = 0; __tmp[ 1] = 0; 93 - __tmp[ 2] = 0; __tmp[ 3] = 0; 94 - __tmp[ 4] = 0; __tmp[ 5] = 0; 95 - __tmp[ 6] = 0; __tmp[ 7] = 0; 96 - __tmp[ 8] = 0; __tmp[ 9] = 0; 97 - __tmp[10] = 0; __tmp[11] = 0; 98 - __tmp[12] = 0; __tmp[13] = 0; 99 - __tmp[14] = 0; __tmp[15] = 0; 100 - return; 101 - 102 - case 8: 103 - __tmp[ 0] = 0; __tmp[ 1] = 0; 104 - __tmp[ 2] = 0; __tmp[ 3] = 0; 105 - __tmp[ 4] = 0; __tmp[ 5] = 0; 106 - __tmp[ 6] = 0; __tmp[ 7] = 0; 107 - return; 108 - 109 - case 4: 110 - __tmp[ 0] = 0; __tmp[ 1] = 0; 111 - __tmp[ 2] = 0; __tmp[ 3] = 0; 112 - return; 113 - } 114 - } 115 - __i = __FDSET_LONGS; 116 - while (__i) { 117 - __i--; 118 - *__tmp = 0; 119 - __tmp++; 120 - } 121 - } 122 - 123 - #endif /* defined(__KERNEL__) */ 38 + #include <asm-generic/posix_types.h> 124 39 125 40 #endif /* __ASM_AVR32_POSIX_TYPES_H */
+10 -40
arch/cris/include/asm/posix_types.h
··· 12 12 * assume GCC is being used. 13 13 */ 14 14 15 - typedef unsigned long __kernel_ino_t; 16 15 typedef unsigned short __kernel_mode_t; 16 + #define __kernel_mode_t __kernel_mode_t 17 + 17 18 typedef unsigned short __kernel_nlink_t; 18 - typedef long __kernel_off_t; 19 - typedef int __kernel_pid_t; 19 + #define __kernel_nlink_t __kernel_nlink_t 20 + 20 21 typedef unsigned short __kernel_ipc_pid_t; 22 + #define __kernel_ipc_pid_t __kernel_ipc_pid_t 23 + 21 24 typedef unsigned short __kernel_uid_t; 22 25 typedef unsigned short __kernel_gid_t; 26 + #define __kernel_uid_t __kernel_uid_t 27 + 23 28 typedef __SIZE_TYPE__ __kernel_size_t; 24 29 typedef long __kernel_ssize_t; 25 30 typedef int __kernel_ptrdiff_t; 26 - typedef long __kernel_time_t; 27 - typedef long __kernel_suseconds_t; 28 - typedef long __kernel_clock_t; 29 - typedef int __kernel_timer_t; 30 - typedef int __kernel_clockid_t; 31 - typedef int __kernel_daddr_t; 32 - typedef char * __kernel_caddr_t; 33 - typedef unsigned short __kernel_uid16_t; 34 - typedef unsigned short __kernel_gid16_t; 35 - typedef unsigned int __kernel_uid32_t; 36 - typedef unsigned int __kernel_gid32_t; 31 + #define __kernel_size_t __kernel_size_t 37 32 38 - typedef unsigned short __kernel_old_uid_t; 39 - typedef unsigned short __kernel_old_gid_t; 40 33 typedef unsigned short __kernel_old_dev_t; 41 - 42 - #ifdef __GNUC__ 43 - typedef long long __kernel_loff_t; 44 - #endif 45 - 46 - typedef struct { 47 - int val[2]; 48 - } __kernel_fsid_t; 49 - 50 - #ifdef __KERNEL__ 51 - 52 - #undef __FD_SET 53 - #define __FD_SET(fd,fdsetp) set_bit(fd, (void *)(fdsetp)) 54 - 55 - #undef __FD_CLR 56 - #define __FD_CLR(fd,fdsetp) clear_bit(fd, (void *)(fdsetp)) 57 - 58 - #undef __FD_ISSET 59 - #define __FD_ISSET(fd,fdsetp) test_bit(fd, (void *)(fdsetp)) 60 - 61 - #undef __FD_ZERO 62 - #define __FD_ZERO(fdsetp) memset((void *)(fdsetp), 0, __FDSET_LONGS << 2) 63 - 64 - #endif /* __KERNEL__ */ 34 + #define __kernel_old_dev_t __kernel_old_dev_t 65 35 66 36 #endif /* __ARCH_CRIS_POSIX_TYPES_H */
+9 -42
arch/frv/include/asm/posix_types.h
··· 7 7 * assume GCC is being used. 8 8 */ 9 9 10 - typedef unsigned long __kernel_ino_t; 11 10 typedef unsigned short __kernel_mode_t; 11 + #define __kernel_mode_t __kernel_mode_t 12 + 12 13 typedef unsigned short __kernel_nlink_t; 13 - typedef long __kernel_off_t; 14 - typedef int __kernel_pid_t; 14 + #define __kernel_nlink_t __kernel_nlink_t 15 + 15 16 typedef unsigned short __kernel_ipc_pid_t; 17 + #define __kernel_ipc_pid_t __kernel_ipc_pid_t 18 + 16 19 typedef unsigned short __kernel_uid_t; 17 20 typedef unsigned short __kernel_gid_t; 18 - typedef unsigned int __kernel_size_t; 19 - typedef int __kernel_ssize_t; 20 - typedef int __kernel_ptrdiff_t; 21 - typedef long __kernel_time_t; 22 - typedef long __kernel_suseconds_t; 23 - typedef long __kernel_clock_t; 24 - typedef int __kernel_timer_t; 25 - typedef int __kernel_clockid_t; 26 - typedef int __kernel_daddr_t; 27 - typedef char * __kernel_caddr_t; 28 - typedef unsigned short __kernel_uid16_t; 29 - typedef unsigned short __kernel_gid16_t; 30 - typedef unsigned int __kernel_uid32_t; 31 - typedef unsigned int __kernel_gid32_t; 21 + #define __kernel_uid_t __kernel_uid_t 32 22 33 - typedef unsigned short __kernel_old_uid_t; 34 - typedef unsigned short __kernel_old_gid_t; 35 23 typedef unsigned short __kernel_old_dev_t; 24 + #define __kernel_old_dev_t __kernel_old_dev_t 36 25 37 - #ifdef __GNUC__ 38 - typedef long long __kernel_loff_t; 39 - #endif 40 - 41 - typedef struct { 42 - int val[2]; 43 - } __kernel_fsid_t; 44 - 45 - #if defined(__KERNEL__) 46 - 47 - #undef __FD_SET 48 - #define __FD_SET(d, set) ((set)->fds_bits[__FDELT(d)] |= __FDMASK(d)) 49 - 50 - #undef __FD_CLR 51 - #define __FD_CLR(d, set) ((set)->fds_bits[__FDELT(d)] &= ~__FDMASK(d)) 52 - 53 - #undef __FD_ISSET 54 - #define __FD_ISSET(d, set) (!!((set)->fds_bits[__FDELT(d)] & __FDMASK(d))) 55 - 56 - #undef __FD_ZERO 57 - #define __FD_ZERO(fdsetp) (memset (fdsetp, 0, sizeof(*(fd_set *)fdsetp))) 58 - 59 - #endif /* defined(__KERNEL__) */ 26 + #include <asm-generic/posix_types.h> 60 27 61 28 #endif 62 29
+9 -40
arch/h8300/include/asm/posix_types.h
··· 7 7 * assume GCC is being used. 8 8 */ 9 9 10 - typedef unsigned long __kernel_ino_t; 11 10 typedef unsigned short __kernel_mode_t; 11 + #define __kernel_mode_t __kernel_mode_t 12 + 12 13 typedef unsigned short __kernel_nlink_t; 13 - typedef long __kernel_off_t; 14 - typedef int __kernel_pid_t; 14 + #define __kernel_nlink_t __kernel_nlink_t 15 + 15 16 typedef unsigned short __kernel_ipc_pid_t; 17 + #define __kernel_ipc_pid_t __kernel_ipc_pid_t 18 + 16 19 typedef unsigned short __kernel_uid_t; 17 20 typedef unsigned short __kernel_gid_t; 18 - typedef unsigned int __kernel_size_t; 19 - typedef int __kernel_ssize_t; 20 - typedef int __kernel_ptrdiff_t; 21 - typedef long __kernel_time_t; 22 - typedef long __kernel_suseconds_t; 23 - typedef long __kernel_clock_t; 24 - typedef int __kernel_timer_t; 25 - typedef int __kernel_clockid_t; 26 - typedef int __kernel_daddr_t; 27 - typedef char * __kernel_caddr_t; 28 - typedef unsigned short __kernel_uid16_t; 29 - typedef unsigned short __kernel_gid16_t; 30 - typedef unsigned int __kernel_uid32_t; 31 - typedef unsigned int __kernel_gid32_t; 21 + #define __kernel_uid_t __kernel_uid_t 32 22 33 23 typedef unsigned short __kernel_old_uid_t; 34 24 typedef unsigned short __kernel_old_gid_t; 25 + #define __kernel_old_uid_t __kernel_old_uid_t 35 26 36 - #ifdef __GNUC__ 37 - typedef long long __kernel_loff_t; 38 - #endif 39 - 40 - typedef struct { 41 - int val[2]; 42 - } __kernel_fsid_t; 43 - 44 - #if defined(__KERNEL__) 45 - 46 - #undef __FD_SET 47 - #define __FD_SET(d, set) ((set)->fds_bits[__FDELT(d)] |= __FDMASK(d)) 48 - 49 - #undef __FD_CLR 50 - #define __FD_CLR(d, set) ((set)->fds_bits[__FDELT(d)] &= ~__FDMASK(d)) 51 - 52 - #undef __FD_ISSET 53 - #define __FD_ISSET(d, set) (!!((set)->fds_bits[__FDELT(d)] & __FDMASK(d))) 54 - 55 - #undef __FD_ZERO 56 - #define __FD_ZERO(fdsetp) (memset (fdsetp, 0, sizeof(*(fd_set *)fdsetp))) 57 - 58 - #endif /* defined(__KERNEL__) */ 27 + #include <asm-generic/posix_types.h> 59 28 60 29 #endif
+3 -118
arch/ia64/include/asm/posix_types.h
··· 1 1 #ifndef _ASM_IA64_POSIX_TYPES_H 2 2 #define _ASM_IA64_POSIX_TYPES_H 3 3 4 - /* 5 - * This file is generally used by user-level software, so you need to 6 - * be a little careful about namespace pollution etc. Also, we cannot 7 - * assume GCC is being used. 8 - * 9 - * Based on <asm-alpha/posix_types.h>. 10 - * 11 - * Modified 1998-2000, 2003 12 - * David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co 13 - */ 14 - 15 - typedef unsigned long __kernel_ino_t; 16 - typedef unsigned int __kernel_mode_t; 17 4 typedef unsigned int __kernel_nlink_t; 18 - typedef long __kernel_off_t; 19 - typedef long long __kernel_loff_t; 20 - typedef int __kernel_pid_t; 21 - typedef int __kernel_ipc_pid_t; 22 - typedef unsigned int __kernel_uid_t; 23 - typedef unsigned int __kernel_gid_t; 24 - typedef unsigned long __kernel_size_t; 25 - typedef long __kernel_ssize_t; 26 - typedef long __kernel_ptrdiff_t; 27 - typedef long __kernel_time_t; 28 - typedef long __kernel_suseconds_t; 29 - typedef long __kernel_clock_t; 30 - typedef int __kernel_timer_t; 31 - typedef int __kernel_clockid_t; 32 - typedef int __kernel_daddr_t; 33 - typedef char * __kernel_caddr_t; 5 + #define __kernel_nlink_t __kernel_nlink_t 6 + 34 7 typedef unsigned long __kernel_sigset_t; /* at least 32 bits */ 35 - typedef unsigned short __kernel_uid16_t; 36 - typedef unsigned short __kernel_gid16_t; 37 8 38 - typedef struct { 39 - int val[2]; 40 - } __kernel_fsid_t; 9 + #include <asm-generic/posix_types.h> 41 10 42 - typedef __kernel_uid_t __kernel_old_uid_t; 43 - typedef __kernel_gid_t __kernel_old_gid_t; 44 - typedef __kernel_uid_t __kernel_uid32_t; 45 - typedef __kernel_gid_t __kernel_gid32_t; 46 - 47 - typedef unsigned int __kernel_old_dev_t; 48 - 49 - # ifdef __KERNEL__ 50 - 51 - # ifndef __GNUC__ 52 - 53 - #define __FD_SET(d, set) ((set)->fds_bits[__FDELT(d)] |= __FDMASK(d)) 54 - #define __FD_CLR(d, set) ((set)->fds_bits[__FDELT(d)] &= ~__FDMASK(d)) 55 - #define __FD_ISSET(d, set) (((set)->fds_bits[__FDELT(d)] & __FDMASK(d)) != 0) 56 - #define __FD_ZERO(set) \ 57 - ((void) memset ((void *) (set), 0, sizeof (__kernel_fd_set))) 58 - 59 - # else /* !__GNUC__ */ 60 - 61 - /* With GNU C, use inline functions instead so args are evaluated only once: */ 62 - 63 - #undef __FD_SET 64 - static __inline__ void __FD_SET(unsigned long fd, __kernel_fd_set *fdsetp) 65 - { 66 - unsigned long _tmp = fd / __NFDBITS; 67 - unsigned long _rem = fd % __NFDBITS; 68 - fdsetp->fds_bits[_tmp] |= (1UL<<_rem); 69 - } 70 - 71 - #undef __FD_CLR 72 - static __inline__ void __FD_CLR(unsigned long fd, __kernel_fd_set *fdsetp) 73 - { 74 - unsigned long _tmp = fd / __NFDBITS; 75 - unsigned long _rem = fd % __NFDBITS; 76 - fdsetp->fds_bits[_tmp] &= ~(1UL<<_rem); 77 - } 78 - 79 - #undef __FD_ISSET 80 - static __inline__ int __FD_ISSET(unsigned long fd, const __kernel_fd_set *p) 81 - { 82 - unsigned long _tmp = fd / __NFDBITS; 83 - unsigned long _rem = fd % __NFDBITS; 84 - return (p->fds_bits[_tmp] & (1UL<<_rem)) != 0; 85 - } 86 - 87 - /* 88 - * This will unroll the loop for the normal constant case (8 ints, 89 - * for a 256-bit fd_set) 90 - */ 91 - #undef __FD_ZERO 92 - static __inline__ void __FD_ZERO(__kernel_fd_set *p) 93 - { 94 - unsigned long *tmp = p->fds_bits; 95 - int i; 96 - 97 - if (__builtin_constant_p(__FDSET_LONGS)) { 98 - switch (__FDSET_LONGS) { 99 - case 16: 100 - tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; 101 - tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; 102 - tmp[ 8] = 0; tmp[ 9] = 0; tmp[10] = 0; tmp[11] = 0; 103 - tmp[12] = 0; tmp[13] = 0; tmp[14] = 0; tmp[15] = 0; 104 - return; 105 - 106 - case 8: 107 - tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; 108 - tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; 109 - return; 110 - 111 - case 4: 112 - tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; 113 - return; 114 - } 115 - } 116 - i = __FDSET_LONGS; 117 - while (i) { 118 - i--; 119 - *tmp = 0; 120 - tmp++; 121 - } 122 - } 123 - 124 - # endif /* !__GNUC__ */ 125 - # endif /* __KERNEL__ */ 126 11 #endif /* _ASM_IA64_POSIX_TYPES_H */
+9 -99
arch/m32r/include/asm/posix_types.h
··· 7 7 * assume GCC is being used. 8 8 */ 9 9 10 - typedef unsigned long __kernel_ino_t; 11 10 typedef unsigned short __kernel_mode_t; 11 + #define __kernel_mode_t __kernel_mode_t 12 + 12 13 typedef unsigned short __kernel_nlink_t; 13 - typedef long __kernel_off_t; 14 - typedef int __kernel_pid_t; 14 + #define __kernel_nlink_t __kernel_nlink_t 15 + 15 16 typedef unsigned short __kernel_ipc_pid_t; 17 + #define __kernel_ipc_pid_t __kernel_ipc_pid_t 18 + 16 19 typedef unsigned short __kernel_uid_t; 17 20 typedef unsigned short __kernel_gid_t; 18 - typedef unsigned int __kernel_size_t; 19 - typedef int __kernel_ssize_t; 20 - typedef int __kernel_ptrdiff_t; 21 - typedef long __kernel_time_t; 22 - typedef long __kernel_suseconds_t; 23 - typedef long __kernel_clock_t; 24 - typedef int __kernel_timer_t; 25 - typedef int __kernel_clockid_t; 26 - typedef int __kernel_daddr_t; 27 - typedef char * __kernel_caddr_t; 28 - typedef unsigned short __kernel_uid16_t; 29 - typedef unsigned short __kernel_gid16_t; 30 - typedef unsigned int __kernel_uid32_t; 31 - typedef unsigned int __kernel_gid32_t; 21 + #define __kernel_uid_t __kernel_uid_t 32 22 33 - typedef unsigned short __kernel_old_uid_t; 34 - typedef unsigned short __kernel_old_gid_t; 35 23 typedef unsigned short __kernel_old_dev_t; 24 + #define __kernel_old_dev_t __kernel_old_dev_t 36 25 37 - #ifdef __GNUC__ 38 - typedef long long __kernel_loff_t; 39 - #endif 40 - 41 - typedef struct { 42 - int val[2]; 43 - } __kernel_fsid_t; 44 - 45 - #if defined(__KERNEL__) 46 - 47 - #undef __FD_SET 48 - static __inline__ void __FD_SET(unsigned long __fd, __kernel_fd_set *__fdsetp) 49 - { 50 - unsigned long __tmp = __fd / __NFDBITS; 51 - unsigned long __rem = __fd % __NFDBITS; 52 - __fdsetp->fds_bits[__tmp] |= (1UL<<__rem); 53 - } 54 - 55 - #undef __FD_CLR 56 - static __inline__ void __FD_CLR(unsigned long __fd, __kernel_fd_set *__fdsetp) 57 - { 58 - unsigned long __tmp = __fd / __NFDBITS; 59 - unsigned long __rem = __fd % __NFDBITS; 60 - __fdsetp->fds_bits[__tmp] &= ~(1UL<<__rem); 61 - } 62 - 63 - 64 - #undef __FD_ISSET 65 - static __inline__ int __FD_ISSET(unsigned long __fd, const __kernel_fd_set *__p) 66 - { 67 - unsigned long __tmp = __fd / __NFDBITS; 68 - unsigned long __rem = __fd % __NFDBITS; 69 - return (__p->fds_bits[__tmp] & (1UL<<__rem)) != 0; 70 - } 71 - 72 - /* 73 - * This will unroll the loop for the normal constant case (8 ints, 74 - * for a 256-bit fd_set) 75 - */ 76 - #undef __FD_ZERO 77 - static __inline__ void __FD_ZERO(__kernel_fd_set *__p) 78 - { 79 - unsigned long *__tmp = __p->fds_bits; 80 - int __i; 81 - 82 - if (__builtin_constant_p(__FDSET_LONGS)) { 83 - switch (__FDSET_LONGS) { 84 - case 16: 85 - __tmp[ 0] = 0; __tmp[ 1] = 0; 86 - __tmp[ 2] = 0; __tmp[ 3] = 0; 87 - __tmp[ 4] = 0; __tmp[ 5] = 0; 88 - __tmp[ 6] = 0; __tmp[ 7] = 0; 89 - __tmp[ 8] = 0; __tmp[ 9] = 0; 90 - __tmp[10] = 0; __tmp[11] = 0; 91 - __tmp[12] = 0; __tmp[13] = 0; 92 - __tmp[14] = 0; __tmp[15] = 0; 93 - return; 94 - 95 - case 8: 96 - __tmp[ 0] = 0; __tmp[ 1] = 0; 97 - __tmp[ 2] = 0; __tmp[ 3] = 0; 98 - __tmp[ 4] = 0; __tmp[ 5] = 0; 99 - __tmp[ 6] = 0; __tmp[ 7] = 0; 100 - return; 101 - 102 - case 4: 103 - __tmp[ 0] = 0; __tmp[ 1] = 0; 104 - __tmp[ 2] = 0; __tmp[ 3] = 0; 105 - return; 106 - } 107 - } 108 - __i = __FDSET_LONGS; 109 - while (__i) { 110 - __i--; 111 - *__tmp = 0; 112 - __tmp++; 113 - } 114 - } 115 - 116 - #endif /* defined(__KERNEL__) */ 26 + #include <asm-generic/posix_types.h> 117 27 118 28 #endif /* _ASM_M32R_POSIX_TYPES_H */
+9 -42
arch/m68k/include/asm/posix_types.h
··· 7 7 * assume GCC is being used. 8 8 */ 9 9 10 - typedef unsigned long __kernel_ino_t; 11 10 typedef unsigned short __kernel_mode_t; 11 + #define __kernel_mode_t __kernel_mode_t 12 + 12 13 typedef unsigned short __kernel_nlink_t; 13 - typedef long __kernel_off_t; 14 - typedef int __kernel_pid_t; 14 + #define __kernel_nlink_t __kernel_nlink_t 15 + 15 16 typedef unsigned short __kernel_ipc_pid_t; 17 + #define __kernel_ipc_pid_t __kernel_ipc_pid_t 18 + 16 19 typedef unsigned short __kernel_uid_t; 17 20 typedef unsigned short __kernel_gid_t; 18 - typedef unsigned int __kernel_size_t; 19 - typedef int __kernel_ssize_t; 20 - typedef int __kernel_ptrdiff_t; 21 - typedef long __kernel_time_t; 22 - typedef long __kernel_suseconds_t; 23 - typedef long __kernel_clock_t; 24 - typedef int __kernel_timer_t; 25 - typedef int __kernel_clockid_t; 26 - typedef int __kernel_daddr_t; 27 - typedef char * __kernel_caddr_t; 28 - typedef unsigned short __kernel_uid16_t; 29 - typedef unsigned short __kernel_gid16_t; 30 - typedef unsigned int __kernel_uid32_t; 31 - typedef unsigned int __kernel_gid32_t; 21 + #define __kernel_uid_t __kernel_uid_t 32 22 33 - typedef unsigned short __kernel_old_uid_t; 34 - typedef unsigned short __kernel_old_gid_t; 35 23 typedef unsigned short __kernel_old_dev_t; 24 + #define __kernel_old_dev_t __kernel_old_dev_t 36 25 37 - #ifdef __GNUC__ 38 - typedef long long __kernel_loff_t; 39 - #endif 40 - 41 - typedef struct { 42 - int val[2]; 43 - } __kernel_fsid_t; 44 - 45 - #if defined(__KERNEL__) 46 - 47 - #undef __FD_SET 48 - #define __FD_SET(d, set) ((set)->fds_bits[__FDELT(d)] |= __FDMASK(d)) 49 - 50 - #undef __FD_CLR 51 - #define __FD_CLR(d, set) ((set)->fds_bits[__FDELT(d)] &= ~__FDMASK(d)) 52 - 53 - #undef __FD_ISSET 54 - #define __FD_ISSET(d, set) (!!((set)->fds_bits[__FDELT(d)] & __FDMASK(d))) 55 - 56 - #undef __FD_ZERO 57 - #define __FD_ZERO(fdsetp) (memset (fdsetp, 0, sizeof(*(fd_set *)fdsetp))) 58 - 59 - #endif /* defined(__KERNEL__) */ 26 + #include <asm-generic/posix_types.h> 60 27 61 28 #endif
+7 -114
arch/mips/include/asm/posix_types.h
··· 17 17 * assume GCC is being used. 18 18 */ 19 19 20 - typedef unsigned long __kernel_ino_t; 21 - typedef unsigned int __kernel_mode_t; 22 - #if (_MIPS_SZLONG == 32) 23 - typedef unsigned long __kernel_nlink_t; 24 - #endif 25 20 #if (_MIPS_SZLONG == 64) 26 21 typedef unsigned int __kernel_nlink_t; 22 + #define __kernel_nlink_t __kernel_nlink_t 27 23 #endif 28 - typedef long __kernel_off_t; 29 - typedef int __kernel_pid_t; 30 - typedef int __kernel_ipc_pid_t; 31 - typedef unsigned int __kernel_uid_t; 32 - typedef unsigned int __kernel_gid_t; 33 - #if (_MIPS_SZLONG == 32) 34 - typedef unsigned int __kernel_size_t; 35 - typedef int __kernel_ssize_t; 36 - typedef int __kernel_ptrdiff_t; 37 - #endif 38 - #if (_MIPS_SZLONG == 64) 39 - typedef unsigned long __kernel_size_t; 40 - typedef long __kernel_ssize_t; 41 - typedef long __kernel_ptrdiff_t; 42 - #endif 43 - typedef long __kernel_time_t; 44 - typedef long __kernel_suseconds_t; 45 - typedef long __kernel_clock_t; 46 - typedef int __kernel_timer_t; 47 - typedef int __kernel_clockid_t; 24 + 48 25 typedef long __kernel_daddr_t; 49 - typedef char * __kernel_caddr_t; 26 + #define __kernel_daddr_t __kernel_daddr_t 50 27 51 - typedef unsigned short __kernel_uid16_t; 52 - typedef unsigned short __kernel_gid16_t; 53 - typedef unsigned int __kernel_uid32_t; 54 - typedef unsigned int __kernel_gid32_t; 55 - typedef __kernel_uid_t __kernel_old_uid_t; 56 - typedef __kernel_gid_t __kernel_old_gid_t; 57 - typedef unsigned int __kernel_old_dev_t; 58 - 59 - #ifdef __GNUC__ 60 - typedef long long __kernel_loff_t; 61 - #endif 62 - 63 - typedef struct { 64 28 #if (_MIPS_SZLONG == 32) 29 + typedef struct { 65 30 long val[2]; 66 - #endif 67 - #if (_MIPS_SZLONG == 64) 68 - int val[2]; 69 - #endif 70 31 } __kernel_fsid_t; 32 + #define __kernel_fsid_t __kernel_fsid_t 33 + #endif 71 34 72 - #if defined(__KERNEL__) 73 - 74 - #undef __FD_SET 75 - static __inline__ void __FD_SET(unsigned long __fd, __kernel_fd_set *__fdsetp) 76 - { 77 - unsigned long __tmp = __fd / __NFDBITS; 78 - unsigned long __rem = __fd % __NFDBITS; 79 - __fdsetp->fds_bits[__tmp] |= (1UL<<__rem); 80 - } 81 - 82 - #undef __FD_CLR 83 - static __inline__ void __FD_CLR(unsigned long __fd, __kernel_fd_set *__fdsetp) 84 - { 85 - unsigned long __tmp = __fd / __NFDBITS; 86 - unsigned long __rem = __fd % __NFDBITS; 87 - __fdsetp->fds_bits[__tmp] &= ~(1UL<<__rem); 88 - } 89 - 90 - #undef __FD_ISSET 91 - static __inline__ int __FD_ISSET(unsigned long __fd, const __kernel_fd_set *__p) 92 - { 93 - unsigned long __tmp = __fd / __NFDBITS; 94 - unsigned long __rem = __fd % __NFDBITS; 95 - return (__p->fds_bits[__tmp] & (1UL<<__rem)) != 0; 96 - } 97 - 98 - /* 99 - * This will unroll the loop for the normal constant case (8 ints, 100 - * for a 256-bit fd_set) 101 - */ 102 - #undef __FD_ZERO 103 - static __inline__ void __FD_ZERO(__kernel_fd_set *__p) 104 - { 105 - unsigned long *__tmp = __p->fds_bits; 106 - int __i; 107 - 108 - if (__builtin_constant_p(__FDSET_LONGS)) { 109 - switch (__FDSET_LONGS) { 110 - case 16: 111 - __tmp[ 0] = 0; __tmp[ 1] = 0; 112 - __tmp[ 2] = 0; __tmp[ 3] = 0; 113 - __tmp[ 4] = 0; __tmp[ 5] = 0; 114 - __tmp[ 6] = 0; __tmp[ 7] = 0; 115 - __tmp[ 8] = 0; __tmp[ 9] = 0; 116 - __tmp[10] = 0; __tmp[11] = 0; 117 - __tmp[12] = 0; __tmp[13] = 0; 118 - __tmp[14] = 0; __tmp[15] = 0; 119 - return; 120 - 121 - case 8: 122 - __tmp[ 0] = 0; __tmp[ 1] = 0; 123 - __tmp[ 2] = 0; __tmp[ 3] = 0; 124 - __tmp[ 4] = 0; __tmp[ 5] = 0; 125 - __tmp[ 6] = 0; __tmp[ 7] = 0; 126 - return; 127 - 128 - case 4: 129 - __tmp[ 0] = 0; __tmp[ 1] = 0; 130 - __tmp[ 2] = 0; __tmp[ 3] = 0; 131 - return; 132 - } 133 - } 134 - __i = __FDSET_LONGS; 135 - while (__i) { 136 - __i--; 137 - *__tmp = 0; 138 - __tmp++; 139 - } 140 - } 141 - 142 - #endif /* defined(__KERNEL__) */ 35 + #include <asm-generic/posix_types.h> 143 36 144 37 #endif /* _ASM_POSIX_TYPES_H */
+1 -1
arch/mips/kernel/kspd.c
··· 326 326 i = j * __NFDBITS; 327 327 if (i >= fdt->max_fds) 328 328 break; 329 - set = fdt->open_fds->fds_bits[j++]; 329 + set = fdt->open_fds[j++]; 330 330 while (set) { 331 331 if (set & 1) { 332 332 struct file * file = xchg(&fdt->fd[i], NULL);
+11 -100
arch/mn10300/include/asm/posix_types.h
··· 17 17 * assume GCC is being used. 18 18 */ 19 19 20 - typedef unsigned long __kernel_ino_t; 21 20 typedef unsigned short __kernel_mode_t; 21 + #define __kernel_mode_t __kernel_mode_t 22 + 22 23 typedef unsigned short __kernel_nlink_t; 23 - typedef long __kernel_off_t; 24 - typedef int __kernel_pid_t; 24 + #define __kernel_nlink_t __kernel_nlink_t 25 + 25 26 typedef unsigned short __kernel_ipc_pid_t; 27 + #define __kernel_ipc_pid_t __kernel_ipc_pid_t 28 + 26 29 typedef unsigned short __kernel_uid_t; 27 30 typedef unsigned short __kernel_gid_t; 31 + #define __kernel_uid_t __kernel_uid_t 32 + 28 33 #if __GNUC__ == 4 29 34 typedef unsigned int __kernel_size_t; 30 35 typedef signed int __kernel_ssize_t; ··· 38 33 typedef signed long __kernel_ssize_t; 39 34 #endif 40 35 typedef int __kernel_ptrdiff_t; 41 - typedef long __kernel_time_t; 42 - typedef long __kernel_suseconds_t; 43 - typedef long __kernel_clock_t; 44 - typedef int __kernel_timer_t; 45 - typedef int __kernel_clockid_t; 46 - typedef int __kernel_daddr_t; 47 - typedef char * __kernel_caddr_t; 48 - typedef unsigned short __kernel_uid16_t; 49 - typedef unsigned short __kernel_gid16_t; 50 - typedef unsigned int __kernel_uid32_t; 51 - typedef unsigned int __kernel_gid32_t; 36 + #define __kernel_size_t __kernel_size_t 52 37 53 - typedef unsigned short __kernel_old_uid_t; 54 - typedef unsigned short __kernel_old_gid_t; 55 38 typedef unsigned short __kernel_old_dev_t; 39 + #define __kernel_old_dev_t __kernel_old_dev_t 56 40 57 - #ifdef __GNUC__ 58 - typedef long long __kernel_loff_t; 59 - #endif 60 - 61 - typedef struct { 62 - #if defined(__KERNEL__) || defined(__USE_ALL) 63 - int val[2]; 64 - #else /* !defined(__KERNEL__) && !defined(__USE_ALL) */ 65 - int __val[2]; 66 - #endif /* !defined(__KERNEL__) && !defined(__USE_ALL) */ 67 - } __kernel_fsid_t; 68 - 69 - #if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) 70 - 71 - #undef __FD_SET 72 - static inline void __FD_SET(unsigned long __fd, __kernel_fd_set *__fdsetp) 73 - { 74 - unsigned long __tmp = __fd / __NFDBITS; 75 - unsigned long __rem = __fd % __NFDBITS; 76 - __fdsetp->fds_bits[__tmp] |= (1UL<<__rem); 77 - } 78 - 79 - #undef __FD_CLR 80 - static inline void __FD_CLR(unsigned long __fd, __kernel_fd_set *__fdsetp) 81 - { 82 - unsigned long __tmp = __fd / __NFDBITS; 83 - unsigned long __rem = __fd % __NFDBITS; 84 - __fdsetp->fds_bits[__tmp] &= ~(1UL<<__rem); 85 - } 86 - 87 - 88 - #undef __FD_ISSET 89 - static inline int __FD_ISSET(unsigned long __fd, const __kernel_fd_set *__p) 90 - { 91 - unsigned long __tmp = __fd / __NFDBITS; 92 - unsigned long __rem = __fd % __NFDBITS; 93 - return (__p->fds_bits[__tmp] & (1UL<<__rem)) != 0; 94 - } 95 - 96 - /* 97 - * This will unroll the loop for the normal constant case (8 ints, 98 - * for a 256-bit fd_set) 99 - */ 100 - #undef __FD_ZERO 101 - static inline void __FD_ZERO(__kernel_fd_set *__p) 102 - { 103 - unsigned long *__tmp = __p->fds_bits; 104 - int __i; 105 - 106 - if (__builtin_constant_p(__FDSET_LONGS)) { 107 - switch (__FDSET_LONGS) { 108 - case 16: 109 - __tmp[ 0] = 0; __tmp[ 1] = 0; 110 - __tmp[ 2] = 0; __tmp[ 3] = 0; 111 - __tmp[ 4] = 0; __tmp[ 5] = 0; 112 - __tmp[ 6] = 0; __tmp[ 7] = 0; 113 - __tmp[ 8] = 0; __tmp[ 9] = 0; 114 - __tmp[10] = 0; __tmp[11] = 0; 115 - __tmp[12] = 0; __tmp[13] = 0; 116 - __tmp[14] = 0; __tmp[15] = 0; 117 - return; 118 - 119 - case 8: 120 - __tmp[ 0] = 0; __tmp[ 1] = 0; 121 - __tmp[ 2] = 0; __tmp[ 3] = 0; 122 - __tmp[ 4] = 0; __tmp[ 5] = 0; 123 - __tmp[ 6] = 0; __tmp[ 7] = 0; 124 - return; 125 - 126 - case 4: 127 - __tmp[ 0] = 0; __tmp[ 1] = 0; 128 - __tmp[ 2] = 0; __tmp[ 3] = 0; 129 - return; 130 - } 131 - } 132 - __i = __FDSET_LONGS; 133 - while (__i) { 134 - __i--; 135 - *__tmp = 0; 136 - __tmp++; 137 - } 138 - } 139 - 140 - #endif /* defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) */ 41 + #include <asm-generic/posix_types.h> 141 42 142 43 #endif /* _ASM_POSIX_TYPES_H */
+9 -110
arch/parisc/include/asm/posix_types.h
··· 6 6 * be a little careful about namespace pollution etc. Also, we cannot 7 7 * assume GCC is being used. 8 8 */ 9 - typedef unsigned long __kernel_ino_t; 9 + 10 10 typedef unsigned short __kernel_mode_t; 11 + #define __kernel_mode_t __kernel_mode_t 12 + 11 13 typedef unsigned short __kernel_nlink_t; 12 - typedef long __kernel_off_t; 13 - typedef int __kernel_pid_t; 14 + #define __kernel_nlink_t __kernel_nlink_t 15 + 14 16 typedef unsigned short __kernel_ipc_pid_t; 15 - typedef unsigned int __kernel_uid_t; 16 - typedef unsigned int __kernel_gid_t; 17 + #define __kernel_ipc_pid_t __kernel_ipc_pid_t 18 + 17 19 typedef int __kernel_suseconds_t; 18 - typedef long __kernel_clock_t; 19 - typedef int __kernel_timer_t; 20 - typedef int __kernel_clockid_t; 21 - typedef int __kernel_daddr_t; 22 - /* Note these change from narrow to wide kernels */ 23 - #ifdef CONFIG_64BIT 24 - typedef unsigned long __kernel_size_t; 25 - typedef long __kernel_ssize_t; 26 - typedef long __kernel_ptrdiff_t; 27 - #else 28 - typedef unsigned int __kernel_size_t; 29 - typedef int __kernel_ssize_t; 30 - typedef int __kernel_ptrdiff_t; 31 - #endif 32 - typedef long __kernel_time_t; 33 - typedef char * __kernel_caddr_t; 20 + #define __kernel_suseconds_t __kernel_suseconds_t 34 21 35 - typedef unsigned short __kernel_uid16_t; 36 - typedef unsigned short __kernel_gid16_t; 37 - typedef unsigned int __kernel_uid32_t; 38 - typedef unsigned int __kernel_gid32_t; 39 - 40 - #ifdef __GNUC__ 41 - typedef long long __kernel_loff_t; 42 22 typedef long long __kernel_off64_t; 43 23 typedef unsigned long long __kernel_ino64_t; 44 - #endif 45 24 46 - typedef unsigned int __kernel_old_dev_t; 47 - 48 - typedef struct { 49 - int val[2]; 50 - } __kernel_fsid_t; 51 - 52 - /* compatibility stuff */ 53 - typedef __kernel_uid_t __kernel_old_uid_t; 54 - typedef __kernel_gid_t __kernel_old_gid_t; 55 - 56 - #if defined(__KERNEL__) 57 - 58 - #undef __FD_SET 59 - static __inline__ void __FD_SET(unsigned long __fd, __kernel_fd_set *__fdsetp) 60 - { 61 - unsigned long __tmp = __fd / __NFDBITS; 62 - unsigned long __rem = __fd % __NFDBITS; 63 - __fdsetp->fds_bits[__tmp] |= (1UL<<__rem); 64 - } 65 - 66 - #undef __FD_CLR 67 - static __inline__ void __FD_CLR(unsigned long __fd, __kernel_fd_set *__fdsetp) 68 - { 69 - unsigned long __tmp = __fd / __NFDBITS; 70 - unsigned long __rem = __fd % __NFDBITS; 71 - __fdsetp->fds_bits[__tmp] &= ~(1UL<<__rem); 72 - } 73 - 74 - #undef __FD_ISSET 75 - static __inline__ int __FD_ISSET(unsigned long __fd, const __kernel_fd_set *__p) 76 - { 77 - unsigned long __tmp = __fd / __NFDBITS; 78 - unsigned long __rem = __fd % __NFDBITS; 79 - return (__p->fds_bits[__tmp] & (1UL<<__rem)) != 0; 80 - } 81 - 82 - /* 83 - * This will unroll the loop for the normal constant case (8 ints, 84 - * for a 256-bit fd_set) 85 - */ 86 - #undef __FD_ZERO 87 - static __inline__ void __FD_ZERO(__kernel_fd_set *__p) 88 - { 89 - unsigned long *__tmp = __p->fds_bits; 90 - int __i; 91 - 92 - if (__builtin_constant_p(__FDSET_LONGS)) { 93 - switch (__FDSET_LONGS) { 94 - case 16: 95 - __tmp[ 0] = 0; __tmp[ 1] = 0; 96 - __tmp[ 2] = 0; __tmp[ 3] = 0; 97 - __tmp[ 4] = 0; __tmp[ 5] = 0; 98 - __tmp[ 6] = 0; __tmp[ 7] = 0; 99 - __tmp[ 8] = 0; __tmp[ 9] = 0; 100 - __tmp[10] = 0; __tmp[11] = 0; 101 - __tmp[12] = 0; __tmp[13] = 0; 102 - __tmp[14] = 0; __tmp[15] = 0; 103 - return; 104 - 105 - case 8: 106 - __tmp[ 0] = 0; __tmp[ 1] = 0; 107 - __tmp[ 2] = 0; __tmp[ 3] = 0; 108 - __tmp[ 4] = 0; __tmp[ 5] = 0; 109 - __tmp[ 6] = 0; __tmp[ 7] = 0; 110 - return; 111 - 112 - case 4: 113 - __tmp[ 0] = 0; __tmp[ 1] = 0; 114 - __tmp[ 2] = 0; __tmp[ 3] = 0; 115 - return; 116 - } 117 - } 118 - __i = __FDSET_LONGS; 119 - while (__i) { 120 - __i--; 121 - *__tmp = 0; 122 - __tmp++; 123 - } 124 - } 125 - 126 - #endif /* defined(__KERNEL__) */ 25 + #include <asm-generic/posix_types.h> 127 26 128 27 #endif
+10 -110
arch/powerpc/include/asm/posix_types.h
··· 7 7 * assume GCC is being used. 8 8 */ 9 9 10 - typedef unsigned long __kernel_ino_t; 11 - typedef unsigned int __kernel_mode_t; 12 - typedef long __kernel_off_t; 13 - typedef int __kernel_pid_t; 14 - typedef unsigned int __kernel_uid_t; 15 - typedef unsigned int __kernel_gid_t; 16 - typedef long __kernel_ptrdiff_t; 17 - typedef long __kernel_time_t; 18 - typedef long __kernel_clock_t; 19 - typedef int __kernel_timer_t; 20 - typedef int __kernel_clockid_t; 21 - typedef long __kernel_suseconds_t; 22 - typedef int __kernel_daddr_t; 23 - typedef char * __kernel_caddr_t; 24 - typedef unsigned short __kernel_uid16_t; 25 - typedef unsigned short __kernel_gid16_t; 26 - typedef unsigned int __kernel_uid32_t; 27 - typedef unsigned int __kernel_gid32_t; 28 - typedef unsigned int __kernel_old_uid_t; 29 - typedef unsigned int __kernel_old_gid_t; 30 - 31 10 #ifdef __powerpc64__ 32 - typedef unsigned long __kernel_nlink_t; 33 - typedef int __kernel_ipc_pid_t; 34 - typedef unsigned long __kernel_size_t; 35 - typedef long __kernel_ssize_t; 36 11 typedef unsigned long __kernel_old_dev_t; 12 + #define __kernel_old_dev_t __kernel_old_dev_t 37 13 #else 38 - typedef unsigned short __kernel_nlink_t; 39 - typedef short __kernel_ipc_pid_t; 40 14 typedef unsigned int __kernel_size_t; 41 15 typedef int __kernel_ssize_t; 42 - typedef unsigned int __kernel_old_dev_t; 16 + typedef long __kernel_ptrdiff_t; 17 + #define __kernel_size_t __kernel_size_t 18 + 19 + typedef unsigned short __kernel_nlink_t; 20 + #define __kernel_nlink_t __kernel_nlink_t 21 + 22 + typedef short __kernel_ipc_pid_t; 23 + #define __kernel_ipc_pid_t __kernel_ipc_pid_t 43 24 #endif 44 25 45 - #ifdef __powerpc64__ 46 - typedef long long __kernel_loff_t; 47 - #else 48 - #ifdef __GNUC__ 49 - typedef long long __kernel_loff_t; 50 - #endif 51 - #endif 26 + #include <asm-generic/posix_types.h> 52 27 53 - typedef struct { 54 - int val[2]; 55 - } __kernel_fsid_t; 56 - 57 - #ifndef __GNUC__ 58 - 59 - #define __FD_SET(d, set) ((set)->fds_bits[__FDELT(d)] |= __FDMASK(d)) 60 - #define __FD_CLR(d, set) ((set)->fds_bits[__FDELT(d)] &= ~__FDMASK(d)) 61 - #define __FD_ISSET(d, set) (((set)->fds_bits[__FDELT(d)] & __FDMASK(d)) != 0) 62 - #define __FD_ZERO(set) \ 63 - ((void) memset ((void *) (set), 0, sizeof (__kernel_fd_set))) 64 - 65 - #else /* __GNUC__ */ 66 - 67 - #if defined(__KERNEL__) 68 - /* With GNU C, use inline functions instead so args are evaluated only once: */ 69 - 70 - #undef __FD_SET 71 - static __inline__ void __FD_SET(unsigned long fd, __kernel_fd_set *fdsetp) 72 - { 73 - unsigned long _tmp = fd / __NFDBITS; 74 - unsigned long _rem = fd % __NFDBITS; 75 - fdsetp->fds_bits[_tmp] |= (1UL<<_rem); 76 - } 77 - 78 - #undef __FD_CLR 79 - static __inline__ void __FD_CLR(unsigned long fd, __kernel_fd_set *fdsetp) 80 - { 81 - unsigned long _tmp = fd / __NFDBITS; 82 - unsigned long _rem = fd % __NFDBITS; 83 - fdsetp->fds_bits[_tmp] &= ~(1UL<<_rem); 84 - } 85 - 86 - #undef __FD_ISSET 87 - static __inline__ int __FD_ISSET(unsigned long fd, __kernel_fd_set *p) 88 - { 89 - unsigned long _tmp = fd / __NFDBITS; 90 - unsigned long _rem = fd % __NFDBITS; 91 - return (p->fds_bits[_tmp] & (1UL<<_rem)) != 0; 92 - } 93 - 94 - /* 95 - * This will unroll the loop for the normal constant case (8 ints, 96 - * for a 256-bit fd_set) 97 - */ 98 - #undef __FD_ZERO 99 - static __inline__ void __FD_ZERO(__kernel_fd_set *p) 100 - { 101 - unsigned long *tmp = (unsigned long *)p->fds_bits; 102 - int i; 103 - 104 - if (__builtin_constant_p(__FDSET_LONGS)) { 105 - switch (__FDSET_LONGS) { 106 - case 16: 107 - tmp[12] = 0; tmp[13] = 0; tmp[14] = 0; tmp[15] = 0; 108 - tmp[ 8] = 0; tmp[ 9] = 0; tmp[10] = 0; tmp[11] = 0; 109 - 110 - case 8: 111 - tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; 112 - 113 - case 4: 114 - tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; 115 - return; 116 - } 117 - } 118 - i = __FDSET_LONGS; 119 - while (i) { 120 - i--; 121 - *tmp = 0; 122 - tmp++; 123 - } 124 - } 125 - 126 - #endif /* defined(__KERNEL__) */ 127 - #endif /* __GNUC__ */ 128 28 #endif /* _ASM_POWERPC_POSIX_TYPES_H */
+1 -1
arch/powerpc/platforms/cell/spufs/coredump.c
··· 122 122 struct spu_context *ctx = NULL; 123 123 124 124 for (; *fd < fdt->max_fds; (*fd)++) { 125 - if (!FD_ISSET(*fd, fdt->open_fds)) 125 + if (!fd_is_open(*fd, fdt)) 126 126 continue; 127 127 128 128 file = fcheck(*fd);
+10 -60
arch/s390/include/asm/posix_types.h
··· 3 3 * 4 4 * S390 version 5 5 * 6 - * Derived from "include/asm-i386/posix_types.h" 7 6 */ 8 7 9 8 #ifndef __ARCH_S390_POSIX_TYPES_H ··· 14 15 * assume GCC is being used. 15 16 */ 16 17 17 - typedef long __kernel_off_t; 18 - typedef int __kernel_pid_t; 19 18 typedef unsigned long __kernel_size_t; 20 - typedef long __kernel_time_t; 21 - typedef long __kernel_suseconds_t; 22 - typedef long __kernel_clock_t; 23 - typedef int __kernel_timer_t; 24 - typedef int __kernel_clockid_t; 25 - typedef int __kernel_daddr_t; 26 - typedef char * __kernel_caddr_t; 27 - typedef unsigned short __kernel_uid16_t; 28 - typedef unsigned short __kernel_gid16_t; 19 + #define __kernel_size_t __kernel_size_t 29 20 30 - #ifdef __GNUC__ 31 - typedef long long __kernel_loff_t; 32 - #endif 21 + typedef unsigned short __kernel_old_dev_t; 22 + #define __kernel_old_dev_t __kernel_old_dev_t 33 23 34 24 #ifndef __s390x__ 35 25 ··· 30 42 typedef unsigned short __kernel_gid_t; 31 43 typedef int __kernel_ssize_t; 32 44 typedef int __kernel_ptrdiff_t; 33 - typedef unsigned int __kernel_uid32_t; 34 - typedef unsigned int __kernel_gid32_t; 35 - typedef unsigned short __kernel_old_uid_t; 36 - typedef unsigned short __kernel_old_gid_t; 37 - typedef unsigned short __kernel_old_dev_t; 38 45 39 46 #else /* __s390x__ */ 40 47 ··· 42 59 typedef long __kernel_ssize_t; 43 60 typedef long __kernel_ptrdiff_t; 44 61 typedef unsigned long __kernel_sigset_t; /* at least 32 bits */ 45 - typedef __kernel_uid_t __kernel_old_uid_t; 46 - typedef __kernel_gid_t __kernel_old_gid_t; 47 - typedef __kernel_uid_t __kernel_uid32_t; 48 - typedef __kernel_gid_t __kernel_gid32_t; 49 - typedef unsigned short __kernel_old_dev_t; 50 62 51 63 #endif /* __s390x__ */ 52 64 53 - typedef struct { 54 - int val[2]; 55 - } __kernel_fsid_t; 65 + #define __kernel_ino_t __kernel_ino_t 66 + #define __kernel_mode_t __kernel_mode_t 67 + #define __kernel_nlink_t __kernel_nlink_t 68 + #define __kernel_ipc_pid_t __kernel_ipc_pid_t 69 + #define __kernel_uid_t __kernel_uid_t 70 + #define __kernel_gid_t __kernel_gid_t 56 71 57 - 58 - #ifdef __KERNEL__ 59 - 60 - #undef __FD_SET 61 - static inline void __FD_SET(unsigned long fd, __kernel_fd_set *fdsetp) 62 - { 63 - unsigned long _tmp = fd / __NFDBITS; 64 - unsigned long _rem = fd % __NFDBITS; 65 - fdsetp->fds_bits[_tmp] |= (1UL<<_rem); 66 - } 67 - 68 - #undef __FD_CLR 69 - static inline void __FD_CLR(unsigned long fd, __kernel_fd_set *fdsetp) 70 - { 71 - unsigned long _tmp = fd / __NFDBITS; 72 - unsigned long _rem = fd % __NFDBITS; 73 - fdsetp->fds_bits[_tmp] &= ~(1UL<<_rem); 74 - } 75 - 76 - #undef __FD_ISSET 77 - static inline int __FD_ISSET(unsigned long fd, const __kernel_fd_set *fdsetp) 78 - { 79 - unsigned long _tmp = fd / __NFDBITS; 80 - unsigned long _rem = fd % __NFDBITS; 81 - return (fdsetp->fds_bits[_tmp] & (1UL<<_rem)) != 0; 82 - } 83 - 84 - #undef __FD_ZERO 85 - #define __FD_ZERO(fdsetp) \ 86 - ((void) memset ((void *) (fdsetp), 0, sizeof (__kernel_fd_set))) 87 - 88 - #endif /* __KERNEL__ */ 72 + #include <asm-generic/posix_types.h> 89 73 90 74 #endif
-5
arch/sh/include/asm/posix_types_32.h
··· 12 12 typedef unsigned short __kernel_gid_t; 13 13 #define __kernel_gid_t __kernel_gid_t 14 14 15 - typedef unsigned int __kernel_uid32_t; 16 - #define __kernel_uid32_t __kernel_uid32_t 17 - typedef unsigned int __kernel_gid32_t; 18 - #define __kernel_gid32_t __kernel_gid32_t 19 - 20 15 typedef unsigned short __kernel_old_uid_t; 21 16 #define __kernel_old_uid_t __kernel_old_uid_t 22 17 typedef unsigned short __kernel_old_gid_t;
-4
arch/sh/include/asm/posix_types_64.h
··· 17 17 #define __kernel_ssize_t __kernel_ssize_t 18 18 typedef int __kernel_ptrdiff_t; 19 19 #define __kernel_ptrdiff_t __kernel_ptrdiff_t 20 - typedef unsigned int __kernel_uid32_t; 21 - #define __kernel_uid32_t __kernel_uid32_t 22 - typedef unsigned int __kernel_gid32_t; 23 - #define __kernel_gid32_t __kernel_gid32_t 24 20 25 21 typedef unsigned short __kernel_old_uid_t; 26 22 #define __kernel_old_uid_t __kernel_old_uid_t
+17 -116
arch/sparc/include/asm/posix_types.h
··· 9 9 10 10 #if defined(__sparc__) && defined(__arch64__) 11 11 /* sparc 64 bit */ 12 - typedef unsigned long __kernel_size_t; 13 - typedef long __kernel_ssize_t; 14 - typedef long __kernel_ptrdiff_t; 15 - typedef long __kernel_time_t; 16 - typedef long __kernel_clock_t; 17 - typedef int __kernel_pid_t; 18 - typedef int __kernel_ipc_pid_t; 19 - typedef unsigned int __kernel_uid_t; 20 - typedef unsigned int __kernel_gid_t; 21 - typedef unsigned long __kernel_ino_t; 22 - typedef unsigned int __kernel_mode_t; 23 12 typedef unsigned int __kernel_nlink_t; 24 - typedef int __kernel_daddr_t; 25 - typedef long __kernel_off_t; 26 - typedef char * __kernel_caddr_t; 27 - typedef unsigned short __kernel_uid16_t; 28 - typedef unsigned short __kernel_gid16_t; 29 - typedef int __kernel_clockid_t; 30 - typedef int __kernel_timer_t; 13 + #define __kernel_nlink_t __kernel_nlink_t 31 14 32 15 typedef unsigned short __kernel_old_uid_t; 33 16 typedef unsigned short __kernel_old_gid_t; 34 - typedef __kernel_uid_t __kernel_uid32_t; 35 - typedef __kernel_gid_t __kernel_gid32_t; 36 - 37 - typedef unsigned int __kernel_old_dev_t; 17 + #define __kernel_old_uid_t __kernel_old_uid_t 38 18 39 19 /* Note this piece of asymmetry from the v9 ABI. */ 40 20 typedef int __kernel_suseconds_t; 21 + #define __kernel_suseconds_t __kernel_suseconds_t 41 22 42 23 #else 43 24 /* sparc 32 bit */ ··· 26 45 typedef unsigned int __kernel_size_t; 27 46 typedef int __kernel_ssize_t; 28 47 typedef long int __kernel_ptrdiff_t; 29 - typedef long __kernel_time_t; 30 - typedef long __kernel_suseconds_t; 31 - typedef long __kernel_clock_t; 32 - typedef int __kernel_pid_t; 48 + #define __kernel_size_t __kernel_size_t 49 + 33 50 typedef unsigned short __kernel_ipc_pid_t; 51 + #define __kernel_ipc_pid_t __kernel_ipc_pid_t 52 + 34 53 typedef unsigned short __kernel_uid_t; 35 54 typedef unsigned short __kernel_gid_t; 36 - typedef unsigned long __kernel_ino_t; 55 + #define __kernel_uid_t __kernel_uid_t 56 + 37 57 typedef unsigned short __kernel_mode_t; 58 + #define __kernel_mode_t __kernel_mode_t 59 + 38 60 typedef short __kernel_nlink_t; 61 + #define __kernel_nlink_t __kernel_nlink_t 62 + 39 63 typedef long __kernel_daddr_t; 40 - typedef long __kernel_off_t; 41 - typedef char * __kernel_caddr_t; 42 - typedef unsigned short __kernel_uid16_t; 43 - typedef unsigned short __kernel_gid16_t; 44 - typedef unsigned int __kernel_uid32_t; 45 - typedef unsigned int __kernel_gid32_t; 46 - typedef unsigned short __kernel_old_uid_t; 47 - typedef unsigned short __kernel_old_gid_t; 64 + #define __kernel_daddr_t __kernel_daddr_t 65 + 48 66 typedef unsigned short __kernel_old_dev_t; 49 - typedef int __kernel_clockid_t; 50 - typedef int __kernel_timer_t; 67 + #define __kernel_old_dev_t __kernel_old_dev_t 51 68 52 69 #endif /* defined(__sparc__) && defined(__arch64__) */ 53 70 54 - #ifdef __GNUC__ 55 - typedef long long __kernel_loff_t; 56 - #endif 71 + #include <asm-generic/posix_types.h> 57 72 58 - typedef struct { 59 - int val[2]; 60 - } __kernel_fsid_t; 61 - 62 - #ifdef __KERNEL__ 63 - 64 - #undef __FD_SET 65 - static inline void __FD_SET(unsigned long fd, __kernel_fd_set *fdsetp) 66 - { 67 - unsigned long _tmp = fd / __NFDBITS; 68 - unsigned long _rem = fd % __NFDBITS; 69 - fdsetp->fds_bits[_tmp] |= (1UL<<_rem); 70 - } 71 - 72 - #undef __FD_CLR 73 - static inline void __FD_CLR(unsigned long fd, __kernel_fd_set *fdsetp) 74 - { 75 - unsigned long _tmp = fd / __NFDBITS; 76 - unsigned long _rem = fd % __NFDBITS; 77 - fdsetp->fds_bits[_tmp] &= ~(1UL<<_rem); 78 - } 79 - 80 - #undef __FD_ISSET 81 - static inline int __FD_ISSET(unsigned long fd, __const__ __kernel_fd_set *p) 82 - { 83 - unsigned long _tmp = fd / __NFDBITS; 84 - unsigned long _rem = fd % __NFDBITS; 85 - return (p->fds_bits[_tmp] & (1UL<<_rem)) != 0; 86 - } 87 - 88 - /* 89 - * This will unroll the loop for the normal constant cases (8 or 32 longs, 90 - * for 256 and 1024-bit fd_sets respectively) 91 - */ 92 - #undef __FD_ZERO 93 - static inline void __FD_ZERO(__kernel_fd_set *p) 94 - { 95 - unsigned long *tmp = p->fds_bits; 96 - int i; 97 - 98 - if (__builtin_constant_p(__FDSET_LONGS)) { 99 - switch (__FDSET_LONGS) { 100 - case 32: 101 - tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; 102 - tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; 103 - tmp[ 8] = 0; tmp[ 9] = 0; tmp[10] = 0; tmp[11] = 0; 104 - tmp[12] = 0; tmp[13] = 0; tmp[14] = 0; tmp[15] = 0; 105 - tmp[16] = 0; tmp[17] = 0; tmp[18] = 0; tmp[19] = 0; 106 - tmp[20] = 0; tmp[21] = 0; tmp[22] = 0; tmp[23] = 0; 107 - tmp[24] = 0; tmp[25] = 0; tmp[26] = 0; tmp[27] = 0; 108 - tmp[28] = 0; tmp[29] = 0; tmp[30] = 0; tmp[31] = 0; 109 - return; 110 - case 16: 111 - tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; 112 - tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; 113 - tmp[ 8] = 0; tmp[ 9] = 0; tmp[10] = 0; tmp[11] = 0; 114 - tmp[12] = 0; tmp[13] = 0; tmp[14] = 0; tmp[15] = 0; 115 - return; 116 - case 8: 117 - tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; 118 - tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; 119 - return; 120 - case 4: 121 - tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; 122 - return; 123 - } 124 - } 125 - i = __FDSET_LONGS; 126 - while (i) { 127 - i--; 128 - *tmp = 0; 129 - tmp++; 130 - } 131 - } 132 - 133 - #endif /* __KERNEL__ */ 134 73 #endif /* __SPARC_POSIX_TYPES_H */
+17 -4
arch/x86/Kconfig
··· 2163 2163 depends on X86_64 2164 2164 select COMPAT_BINFMT_ELF 2165 2165 ---help--- 2166 - Include code to run 32-bit programs under a 64-bit kernel. You should 2167 - likely turn this on, unless you're 100% sure that you don't have any 2168 - 32-bit programs left. 2166 + Include code to run legacy 32-bit programs under a 2167 + 64-bit kernel. You should likely turn this on, unless you're 2168 + 100% sure that you don't have any 32-bit programs left. 2169 2169 2170 2170 config IA32_AOUT 2171 2171 tristate "IA32 a.out support" ··· 2173 2173 ---help--- 2174 2174 Support old a.out binaries in the 32bit emulation. 2175 2175 2176 + config X86_X32 2177 + bool "x32 ABI for 64-bit mode (EXPERIMENTAL)" 2178 + depends on X86_64 && IA32_EMULATION && EXPERIMENTAL 2179 + ---help--- 2180 + Include code to run binaries for the x32 native 32-bit ABI 2181 + for 64-bit processors. An x32 process gets access to the 2182 + full 64-bit register file and wide data path while leaving 2183 + pointers at 32 bits for smaller memory footprint. 2184 + 2185 + You will need a recent binutils (2.22 or later) with 2186 + elf32_x86_64 support enabled to compile a kernel with this 2187 + option set. 2188 + 2176 2189 config COMPAT 2177 2190 def_bool y 2178 - depends on IA32_EMULATION 2191 + depends on IA32_EMULATION || X86_X32 2179 2192 select ARCH_WANT_OLD_COMPAT_IPC 2180 2193 2181 2194 config COMPAT_FOR_U64_ALIGNMENT
+16
arch/x86/Makefile
··· 82 82 endif 83 83 endif 84 84 85 + ifdef CONFIG_X86_X32 86 + x32_ld_ok := $(call try-run,\ 87 + /bin/echo -e '1: .quad 1b' | \ 88 + $(CC) $(KBUILD_AFLAGS) -c -xassembler -o "$$TMP" - && \ 89 + $(OBJCOPY) -O elf32-x86-64 "$$TMP" "$$TMPO" && \ 90 + $(LD) -m elf32_x86_64 "$$TMPO" -o "$$TMP",y,n) 91 + ifeq ($(x32_ld_ok),y) 92 + CONFIG_X86_X32_ABI := y 93 + KBUILD_AFLAGS += -DCONFIG_X86_X32_ABI 94 + KBUILD_CFLAGS += -DCONFIG_X86_X32_ABI 95 + else 96 + $(warning CONFIG_X86_X32 enabled but no binutils support) 97 + endif 98 + endif 99 + export CONFIG_X86_X32_ABI 100 + 85 101 # Don't unroll struct assignments with kmemcheck enabled 86 102 ifeq ($(CONFIG_KMEMCHECK),y) 87 103 KBUILD_CFLAGS += $(call cc-option,-fno-builtin-memcpy)
+10 -12
arch/x86/ia32/ia32_signal.c
··· 12 12 #include <linux/mm.h> 13 13 #include <linux/smp.h> 14 14 #include <linux/kernel.h> 15 - #include <linux/signal.h> 16 15 #include <linux/errno.h> 17 16 #include <linux/wait.h> 18 - #include <linux/ptrace.h> 19 17 #include <linux/unistd.h> 20 18 #include <linux/stddef.h> 21 19 #include <linux/personality.h> ··· 30 32 #include <asm/proto.h> 31 33 #include <asm/vdso.h> 32 34 #include <asm/sigframe.h> 35 + #include <asm/sighandling.h> 33 36 #include <asm/sys_ia32.h> 34 37 35 - #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) 36 - 37 - #define FIX_EFLAGS (X86_EFLAGS_AC | X86_EFLAGS_OF | \ 38 - X86_EFLAGS_DF | X86_EFLAGS_TF | X86_EFLAGS_SF | \ 39 - X86_EFLAGS_ZF | X86_EFLAGS_AF | X86_EFLAGS_PF | \ 40 - X86_EFLAGS_CF) 41 - 42 - void signal_fault(struct pt_regs *regs, void __user *frame, char *where); 38 + #define FIX_EFLAGS __FIX_EFLAGS 43 39 44 40 int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from) 45 41 { 46 42 int err = 0; 43 + bool ia32 = is_ia32_task(); 47 44 48 45 if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t))) 49 46 return -EFAULT; ··· 68 75 case __SI_FAULT >> 16: 69 76 break; 70 77 case __SI_CHLD >> 16: 71 - put_user_ex(from->si_utime, &to->si_utime); 72 - put_user_ex(from->si_stime, &to->si_stime); 78 + if (ia32) { 79 + put_user_ex(from->si_utime, &to->si_utime); 80 + put_user_ex(from->si_stime, &to->si_stime); 81 + } else { 82 + put_user_ex(from->si_utime, &to->_sifields._sigchld_x32._utime); 83 + put_user_ex(from->si_stime, &to->_sifields._sigchld_x32._stime); 84 + } 73 85 put_user_ex(from->si_status, &to->si_status); 74 86 /* FALL THROUGH */ 75 87 default:
-40
arch/x86/ia32/sys_ia32.c
··· 287 287 return ret; 288 288 } 289 289 290 - asmlinkage long sys32_rt_sigprocmask(int how, compat_sigset_t __user *set, 291 - compat_sigset_t __user *oset, 292 - unsigned int sigsetsize) 293 - { 294 - sigset_t s; 295 - compat_sigset_t s32; 296 - int ret; 297 - mm_segment_t old_fs = get_fs(); 298 - 299 - if (set) { 300 - if (copy_from_user(&s32, set, sizeof(compat_sigset_t))) 301 - return -EFAULT; 302 - switch (_NSIG_WORDS) { 303 - case 4: s.sig[3] = s32.sig[6] | (((long)s32.sig[7]) << 32); 304 - case 3: s.sig[2] = s32.sig[4] | (((long)s32.sig[5]) << 32); 305 - case 2: s.sig[1] = s32.sig[2] | (((long)s32.sig[3]) << 32); 306 - case 1: s.sig[0] = s32.sig[0] | (((long)s32.sig[1]) << 32); 307 - } 308 - } 309 - set_fs(KERNEL_DS); 310 - ret = sys_rt_sigprocmask(how, 311 - set ? (sigset_t __user *)&s : NULL, 312 - oset ? (sigset_t __user *)&s : NULL, 313 - sigsetsize); 314 - set_fs(old_fs); 315 - if (ret) 316 - return ret; 317 - if (oset) { 318 - switch (_NSIG_WORDS) { 319 - case 4: s32.sig[7] = (s.sig[3] >> 32); s32.sig[6] = s.sig[3]; 320 - case 3: s32.sig[5] = (s.sig[2] >> 32); s32.sig[4] = s.sig[2]; 321 - case 2: s32.sig[3] = (s.sig[1] >> 32); s32.sig[2] = s.sig[1]; 322 - case 1: s32.sig[1] = (s.sig[0] >> 32); s32.sig[0] = s.sig[0]; 323 - } 324 - if (copy_to_user(oset, &s32, sizeof(compat_sigset_t))) 325 - return -EFAULT; 326 - } 327 - return 0; 328 - } 329 - 330 290 asmlinkage long sys32_alarm(unsigned int seconds) 331 291 { 332 292 return alarm_setitimer(seconds);
+2
arch/x86/include/asm/Kbuild
··· 14 14 header-y += mtrr.h 15 15 header-y += posix_types_32.h 16 16 header-y += posix_types_64.h 17 + header-y += posix_types_x32.h 17 18 header-y += prctl.h 18 19 header-y += processor-flags.h 19 20 header-y += ptrace-abi.h ··· 25 24 26 25 genhdr-y += unistd_32.h 27 26 genhdr-y += unistd_64.h 27 + genhdr-y += unistd_x32.h
+45 -4
arch/x86/include/asm/compat.h
··· 6 6 */ 7 7 #include <linux/types.h> 8 8 #include <linux/sched.h> 9 + #include <asm/processor.h> 9 10 #include <asm/user32.h> 11 + #include <asm/unistd.h> 10 12 11 13 #define COMPAT_USER_HZ 100 12 14 #define COMPAT_UTS_MACHINE "i686\0\0" ··· 188 186 /* 189 187 * The type of struct elf_prstatus.pr_reg in compatible core dumps. 190 188 */ 189 + #ifdef CONFIG_X86_X32_ABI 190 + typedef struct user_regs_struct compat_elf_gregset_t; 191 + 192 + #define PR_REG_SIZE(S) (test_thread_flag(TIF_IA32) ? 68 : 216) 193 + #define PRSTATUS_SIZE(S) (test_thread_flag(TIF_IA32) ? 144 : 296) 194 + #define SET_PR_FPVALID(S,V) \ 195 + do { *(int *) (((void *) &((S)->pr_reg)) + PR_REG_SIZE(0)) = (V); } \ 196 + while (0) 197 + 198 + #define COMPAT_USE_64BIT_TIME \ 199 + (!!(task_pt_regs(current)->orig_ax & __X32_SYSCALL_BIT)) 200 + #else 191 201 typedef struct user_regs_struct32 compat_elf_gregset_t; 202 + #endif 192 203 193 204 /* 194 205 * A pointer passed in from user mode. This should not ··· 223 208 224 209 static inline void __user *arch_compat_alloc_user_space(long len) 225 210 { 226 - struct pt_regs *regs = task_pt_regs(current); 227 - return (void __user *)regs->sp - len; 211 + compat_uptr_t sp; 212 + 213 + if (test_thread_flag(TIF_IA32)) { 214 + sp = task_pt_regs(current)->sp; 215 + } else { 216 + /* -128 for the x32 ABI redzone */ 217 + sp = percpu_read(old_rsp) - 128; 218 + } 219 + 220 + return (void __user *)round_down(sp - len, 16); 228 221 } 229 222 230 - static inline int is_compat_task(void) 223 + static inline bool is_ia32_task(void) 231 224 { 232 - return current_thread_info()->status & TS_COMPAT; 225 + #ifdef CONFIG_IA32_EMULATION 226 + if (current_thread_info()->status & TS_COMPAT) 227 + return true; 228 + #endif 229 + return false; 230 + } 231 + 232 + static inline bool is_x32_task(void) 233 + { 234 + #ifdef CONFIG_X86_X32_ABI 235 + if (task_pt_regs(current)->orig_ax & __X32_SYSCALL_BIT) 236 + return true; 237 + #endif 238 + return false; 239 + } 240 + 241 + static inline bool is_compat_task(void) 242 + { 243 + return is_ia32_task() || is_x32_task(); 233 244 } 234 245 235 246 #endif /* _ASM_X86_COMPAT_H */
+25 -6
arch/x86/include/asm/elf.h
··· 155 155 #define elf_check_arch(x) \ 156 156 ((x)->e_machine == EM_X86_64) 157 157 158 - #define compat_elf_check_arch(x) elf_check_arch_ia32(x) 158 + #define compat_elf_check_arch(x) \ 159 + (elf_check_arch_ia32(x) || (x)->e_machine == EM_X86_64) 160 + 161 + #if __USER32_DS != __USER_DS 162 + # error "The following code assumes __USER32_DS == __USER_DS" 163 + #endif 159 164 160 165 static inline void elf_common_init(struct thread_struct *t, 161 166 struct pt_regs *regs, const u16 ds) ··· 183 178 void start_thread_ia32(struct pt_regs *regs, u32 new_ip, u32 new_sp); 184 179 #define compat_start_thread start_thread_ia32 185 180 186 - void set_personality_ia32(void); 187 - #define COMPAT_SET_PERSONALITY(ex) set_personality_ia32() 181 + void set_personality_ia32(bool); 182 + #define COMPAT_SET_PERSONALITY(ex) \ 183 + set_personality_ia32((ex).e_machine == EM_X86_64) 188 184 189 185 #define COMPAT_ELF_PLATFORM ("i686") 190 186 ··· 292 286 #define VDSO_HIGH_BASE 0xffffe000U /* CONFIG_COMPAT_VDSO address */ 293 287 294 288 /* 1GB for 64bit, 8MB for 32bit */ 295 - #define STACK_RND_MASK (test_thread_flag(TIF_IA32) ? 0x7ff : 0x3fffff) 289 + #define STACK_RND_MASK (test_thread_flag(TIF_ADDR32) ? 0x7ff : 0x3fffff) 296 290 297 291 #define ARCH_DLINFO \ 298 292 do { \ ··· 301 295 (unsigned long)current->mm->context.vdso); \ 302 296 } while (0) 303 297 298 + #define ARCH_DLINFO_X32 \ 299 + do { \ 300 + if (vdso_enabled) \ 301 + NEW_AUX_ENT(AT_SYSINFO_EHDR, \ 302 + (unsigned long)current->mm->context.vdso); \ 303 + } while (0) 304 + 304 305 #define AT_SYSINFO 32 305 306 306 - #define COMPAT_ARCH_DLINFO ARCH_DLINFO_IA32(sysctl_vsyscall32) 307 + #define COMPAT_ARCH_DLINFO \ 308 + if (test_thread_flag(TIF_X32)) \ 309 + ARCH_DLINFO_X32; \ 310 + else \ 311 + ARCH_DLINFO_IA32(sysctl_vsyscall32) 307 312 308 313 #define COMPAT_ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE + 0x1000000) 309 314 ··· 330 313 #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1 331 314 extern int arch_setup_additional_pages(struct linux_binprm *bprm, 332 315 int uses_interp); 316 + extern int x32_setup_additional_pages(struct linux_binprm *bprm, 317 + int uses_interp); 333 318 334 319 extern int syscall32_setup_pages(struct linux_binprm *, int exstack); 335 320 #define compat_arch_setup_additional_pages syscall32_setup_pages ··· 348 329 return 1; 349 330 #endif 350 331 #ifdef CONFIG_IA32_EMULATION 351 - if (test_thread_flag(TIF_IA32)) 332 + if (test_thread_flag(TIF_ADDR32)) 352 333 return 1; 353 334 #endif 354 335 return 0;
+18
arch/x86/include/asm/ia32.h
··· 43 43 compat_sigset_t uc_sigmask; /* mask last for extensibility */ 44 44 }; 45 45 46 + struct ucontext_x32 { 47 + unsigned int uc_flags; 48 + unsigned int uc_link; 49 + stack_ia32_t uc_stack; 50 + unsigned int uc__pad0; /* needed for alignment */ 51 + struct sigcontext uc_mcontext; /* the 64-bit sigcontext type */ 52 + compat_sigset_t uc_sigmask; /* mask last for extensibility */ 53 + }; 54 + 46 55 /* This matches struct stat64 in glibc2.2, hence the absolutely 47 56 * insane amounts of padding around dev_t's. 48 57 */ ··· 124 115 compat_clock_t _utime; 125 116 compat_clock_t _stime; 126 117 } _sigchld; 118 + 119 + /* SIGCHLD (x32 version) */ 120 + struct { 121 + unsigned int _pid; /* which child */ 122 + unsigned int _uid; /* sender's uid */ 123 + int _status; /* exit code */ 124 + compat_s64 _utime; 125 + compat_s64 _stime; 126 + } _sigchld_x32; 127 127 128 128 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ 129 129 struct {
+19 -11
arch/x86/include/asm/mtrr.h
··· 29 29 30 30 #define MTRR_IOCTL_BASE 'M' 31 31 32 - struct mtrr_sentry { 33 - unsigned long base; /* Base address */ 34 - unsigned int size; /* Size of region */ 35 - unsigned int type; /* Type of region */ 36 - }; 37 - 38 32 /* Warning: this structure has a different order from i386 39 33 on x86-64. The 32bit emulation code takes care of that. 40 34 But you need to use this for 64bit, otherwise your X server 41 35 will break. */ 42 36 43 37 #ifdef __i386__ 38 + struct mtrr_sentry { 39 + unsigned long base; /* Base address */ 40 + unsigned int size; /* Size of region */ 41 + unsigned int type; /* Type of region */ 42 + }; 43 + 44 44 struct mtrr_gentry { 45 45 unsigned int regnum; /* Register number */ 46 46 unsigned long base; /* Base address */ ··· 50 50 51 51 #else /* __i386__ */ 52 52 53 - struct mtrr_gentry { 54 - unsigned long base; /* Base address */ 55 - unsigned int size; /* Size of region */ 56 - unsigned int regnum; /* Register number */ 57 - unsigned int type; /* Type of region */ 53 + struct mtrr_sentry { 54 + __u64 base; /* Base address */ 55 + __u32 size; /* Size of region */ 56 + __u32 type; /* Type of region */ 58 57 }; 58 + 59 + struct mtrr_gentry { 60 + __u64 base; /* Base address */ 61 + __u32 size; /* Size of region */ 62 + __u32 regnum; /* Register number */ 63 + __u32 type; /* Type of region */ 64 + __u32 _pad; /* Unused */ 65 + }; 66 + 59 67 #endif /* !__i386__ */ 60 68 61 69 struct mtrr_var_range {
+3 -1
arch/x86/include/asm/posix_types.h
··· 7 7 #else 8 8 # ifdef __i386__ 9 9 # include "posix_types_32.h" 10 - # else 10 + # elif defined(__LP64__) 11 11 # include "posix_types_64.h" 12 + # else 13 + # include "posix_types_x32.h" 12 14 # endif 13 15 #endif
+9 -66
arch/x86/include/asm/posix_types_32.h
··· 7 7 * assume GCC is being used. 8 8 */ 9 9 10 - typedef unsigned long __kernel_ino_t; 11 10 typedef unsigned short __kernel_mode_t; 11 + #define __kernel_mode_t __kernel_mode_t 12 + 12 13 typedef unsigned short __kernel_nlink_t; 13 - typedef long __kernel_off_t; 14 - typedef int __kernel_pid_t; 14 + #define __kernel_nlink_t __kernel_nlink_t 15 + 15 16 typedef unsigned short __kernel_ipc_pid_t; 17 + #define __kernel_ipc_pid_t __kernel_ipc_pid_t 18 + 16 19 typedef unsigned short __kernel_uid_t; 17 20 typedef unsigned short __kernel_gid_t; 18 - typedef unsigned int __kernel_size_t; 19 - typedef int __kernel_ssize_t; 20 - typedef int __kernel_ptrdiff_t; 21 - typedef long __kernel_time_t; 22 - typedef long __kernel_suseconds_t; 23 - typedef long __kernel_clock_t; 24 - typedef int __kernel_timer_t; 25 - typedef int __kernel_clockid_t; 26 - typedef int __kernel_daddr_t; 27 - typedef char * __kernel_caddr_t; 28 - typedef unsigned short __kernel_uid16_t; 29 - typedef unsigned short __kernel_gid16_t; 30 - typedef unsigned int __kernel_uid32_t; 31 - typedef unsigned int __kernel_gid32_t; 21 + #define __kernel_uid_t __kernel_uid_t 32 22 33 - typedef unsigned short __kernel_old_uid_t; 34 - typedef unsigned short __kernel_old_gid_t; 35 23 typedef unsigned short __kernel_old_dev_t; 24 + #define __kernel_old_dev_t __kernel_old_dev_t 36 25 37 - #ifdef __GNUC__ 38 - typedef long long __kernel_loff_t; 39 - #endif 40 - 41 - typedef struct { 42 - int val[2]; 43 - } __kernel_fsid_t; 44 - 45 - #if defined(__KERNEL__) 46 - 47 - #undef __FD_SET 48 - #define __FD_SET(fd,fdsetp) \ 49 - asm volatile("btsl %1,%0": \ 50 - "+m" (*(__kernel_fd_set *)(fdsetp)) \ 51 - : "r" ((int)(fd))) 52 - 53 - #undef __FD_CLR 54 - #define __FD_CLR(fd,fdsetp) \ 55 - asm volatile("btrl %1,%0": \ 56 - "+m" (*(__kernel_fd_set *)(fdsetp)) \ 57 - : "r" ((int) (fd))) 58 - 59 - #undef __FD_ISSET 60 - #define __FD_ISSET(fd,fdsetp) \ 61 - (__extension__ \ 62 - ({ \ 63 - unsigned char __result; \ 64 - asm volatile("btl %1,%2 ; setb %0" \ 65 - : "=q" (__result) \ 66 - : "r" ((int)(fd)), \ 67 - "m" (*(__kernel_fd_set *)(fdsetp))); \ 68 - __result; \ 69 - })) 70 - 71 - #undef __FD_ZERO 72 - #define __FD_ZERO(fdsetp) \ 73 - do { \ 74 - int __d0, __d1; \ 75 - asm volatile("cld ; rep ; stosl" \ 76 - : "=m" (*(__kernel_fd_set *)(fdsetp)), \ 77 - "=&c" (__d0), "=&D" (__d1) \ 78 - : "a" (0), "1" (__FDSET_LONGS), \ 79 - "2" ((__kernel_fd_set *)(fdsetp)) \ 80 - : "memory"); \ 81 - } while (0) 82 - 83 - #endif /* defined(__KERNEL__) */ 26 + #include <asm-generic/posix_types.h> 84 27 85 28 #endif /* _ASM_X86_POSIX_TYPES_32_H */
+3 -103
arch/x86/include/asm/posix_types_64.h
··· 7 7 * assume GCC is being used. 8 8 */ 9 9 10 - typedef unsigned long __kernel_ino_t; 11 - typedef unsigned int __kernel_mode_t; 12 - typedef unsigned long __kernel_nlink_t; 13 - typedef long __kernel_off_t; 14 - typedef int __kernel_pid_t; 15 - typedef int __kernel_ipc_pid_t; 16 - typedef unsigned int __kernel_uid_t; 17 - typedef unsigned int __kernel_gid_t; 18 - typedef unsigned long __kernel_size_t; 19 - typedef long __kernel_ssize_t; 20 - typedef long __kernel_ptrdiff_t; 21 - typedef long __kernel_time_t; 22 - typedef long __kernel_suseconds_t; 23 - typedef long __kernel_clock_t; 24 - typedef int __kernel_timer_t; 25 - typedef int __kernel_clockid_t; 26 - typedef int __kernel_daddr_t; 27 - typedef char * __kernel_caddr_t; 28 - typedef unsigned short __kernel_uid16_t; 29 - typedef unsigned short __kernel_gid16_t; 30 - 31 - #ifdef __GNUC__ 32 - typedef long long __kernel_loff_t; 33 - #endif 34 - 35 - typedef struct { 36 - int val[2]; 37 - } __kernel_fsid_t; 38 - 39 10 typedef unsigned short __kernel_old_uid_t; 40 11 typedef unsigned short __kernel_old_gid_t; 41 - typedef __kernel_uid_t __kernel_uid32_t; 42 - typedef __kernel_gid_t __kernel_gid32_t; 12 + #define __kernel_old_uid_t __kernel_old_uid_t 43 13 44 14 typedef unsigned long __kernel_old_dev_t; 15 + #define __kernel_old_dev_t __kernel_old_dev_t 45 16 46 - #ifdef __KERNEL__ 47 - 48 - #undef __FD_SET 49 - static inline void __FD_SET(unsigned long fd, __kernel_fd_set *fdsetp) 50 - { 51 - unsigned long _tmp = fd / __NFDBITS; 52 - unsigned long _rem = fd % __NFDBITS; 53 - fdsetp->fds_bits[_tmp] |= (1UL<<_rem); 54 - } 55 - 56 - #undef __FD_CLR 57 - static inline void __FD_CLR(unsigned long fd, __kernel_fd_set *fdsetp) 58 - { 59 - unsigned long _tmp = fd / __NFDBITS; 60 - unsigned long _rem = fd % __NFDBITS; 61 - fdsetp->fds_bits[_tmp] &= ~(1UL<<_rem); 62 - } 63 - 64 - #undef __FD_ISSET 65 - static inline int __FD_ISSET(unsigned long fd, __const__ __kernel_fd_set *p) 66 - { 67 - unsigned long _tmp = fd / __NFDBITS; 68 - unsigned long _rem = fd % __NFDBITS; 69 - return (p->fds_bits[_tmp] & (1UL<<_rem)) != 0; 70 - } 71 - 72 - /* 73 - * This will unroll the loop for the normal constant cases (8 or 32 longs, 74 - * for 256 and 1024-bit fd_sets respectively) 75 - */ 76 - #undef __FD_ZERO 77 - static inline void __FD_ZERO(__kernel_fd_set *p) 78 - { 79 - unsigned long *tmp = p->fds_bits; 80 - int i; 81 - 82 - if (__builtin_constant_p(__FDSET_LONGS)) { 83 - switch (__FDSET_LONGS) { 84 - case 32: 85 - tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; 86 - tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; 87 - tmp[ 8] = 0; tmp[ 9] = 0; tmp[10] = 0; tmp[11] = 0; 88 - tmp[12] = 0; tmp[13] = 0; tmp[14] = 0; tmp[15] = 0; 89 - tmp[16] = 0; tmp[17] = 0; tmp[18] = 0; tmp[19] = 0; 90 - tmp[20] = 0; tmp[21] = 0; tmp[22] = 0; tmp[23] = 0; 91 - tmp[24] = 0; tmp[25] = 0; tmp[26] = 0; tmp[27] = 0; 92 - tmp[28] = 0; tmp[29] = 0; tmp[30] = 0; tmp[31] = 0; 93 - return; 94 - case 16: 95 - tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; 96 - tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; 97 - tmp[ 8] = 0; tmp[ 9] = 0; tmp[10] = 0; tmp[11] = 0; 98 - tmp[12] = 0; tmp[13] = 0; tmp[14] = 0; tmp[15] = 0; 99 - return; 100 - case 8: 101 - tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; 102 - tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; 103 - return; 104 - case 4: 105 - tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; 106 - return; 107 - } 108 - } 109 - i = __FDSET_LONGS; 110 - while (i) { 111 - i--; 112 - *tmp = 0; 113 - tmp++; 114 - } 115 - } 116 - 117 - #endif /* defined(__KERNEL__) */ 17 + #include <asm-generic/posix_types.h> 118 18 119 19 #endif /* _ASM_X86_POSIX_TYPES_64_H */
+19
arch/x86/include/asm/posix_types_x32.h
··· 1 + #ifndef _ASM_X86_POSIX_TYPES_X32_H 2 + #define _ASM_X86_POSIX_TYPES_X32_H 3 + 4 + /* 5 + * This file is only used by user-level software, so you need to 6 + * be a little careful about namespace pollution etc. Also, we cannot 7 + * assume GCC is being used. 8 + * 9 + * These types should generally match the ones used by the 64-bit kernel, 10 + * 11 + */ 12 + 13 + typedef long long __kernel_long_t; 14 + typedef unsigned long long __kernel_ulong_t; 15 + #define __kernel_long_t __kernel_long_t 16 + 17 + #include <asm/posix_types_64.h> 18 + 19 + #endif /* _ASM_X86_POSIX_TYPES_X32_H */
+8 -2
arch/x86/include/asm/processor.h
··· 873 873 #define IA32_PAGE_OFFSET ((current->personality & ADDR_LIMIT_3GB) ? \ 874 874 0xc0000000 : 0xFFFFe000) 875 875 876 - #define TASK_SIZE (test_thread_flag(TIF_IA32) ? \ 876 + #define TASK_SIZE (test_thread_flag(TIF_ADDR32) ? \ 877 877 IA32_PAGE_OFFSET : TASK_SIZE_MAX) 878 - #define TASK_SIZE_OF(child) ((test_tsk_thread_flag(child, TIF_IA32)) ? \ 878 + #define TASK_SIZE_OF(child) ((test_tsk_thread_flag(child, TIF_ADDR32)) ? \ 879 879 IA32_PAGE_OFFSET : TASK_SIZE_MAX) 880 880 881 881 #define STACK_TOP TASK_SIZE ··· 897 897 898 898 #define task_pt_regs(tsk) ((struct pt_regs *)(tsk)->thread.sp0 - 1) 899 899 extern unsigned long KSTK_ESP(struct task_struct *task); 900 + 901 + /* 902 + * User space RSP while inside the SYSCALL fast path 903 + */ 904 + DECLARE_PER_CPU(unsigned long, old_rsp); 905 + 900 906 #endif /* CONFIG_X86_64 */ 901 907 902 908 extern void start_thread(struct pt_regs *regs, unsigned long new_ip,
-1
arch/x86/include/asm/ptrace.h
··· 145 145 convert_ip_to_linear(struct task_struct *child, struct pt_regs *regs); 146 146 extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, 147 147 int error_code, int si_code); 148 - void signal_fault(struct pt_regs *regs, void __user *frame, char *where); 149 148 150 149 extern long syscall_trace_enter(struct pt_regs *); 151 150 extern void syscall_trace_leave(struct pt_regs *);
+30 -27
arch/x86/include/asm/sigcontext.h
··· 230 230 * User-space might still rely on the old definition: 231 231 */ 232 232 struct sigcontext { 233 - unsigned long r8; 234 - unsigned long r9; 235 - unsigned long r10; 236 - unsigned long r11; 237 - unsigned long r12; 238 - unsigned long r13; 239 - unsigned long r14; 240 - unsigned long r15; 241 - unsigned long rdi; 242 - unsigned long rsi; 243 - unsigned long rbp; 244 - unsigned long rbx; 245 - unsigned long rdx; 246 - unsigned long rax; 247 - unsigned long rcx; 248 - unsigned long rsp; 249 - unsigned long rip; 250 - unsigned long eflags; /* RFLAGS */ 251 - unsigned short cs; 252 - unsigned short gs; 253 - unsigned short fs; 254 - unsigned short __pad0; 255 - unsigned long err; 256 - unsigned long trapno; 257 - unsigned long oldmask; 258 - unsigned long cr2; 233 + __u64 r8; 234 + __u64 r9; 235 + __u64 r10; 236 + __u64 r11; 237 + __u64 r12; 238 + __u64 r13; 239 + __u64 r14; 240 + __u64 r15; 241 + __u64 rdi; 242 + __u64 rsi; 243 + __u64 rbp; 244 + __u64 rbx; 245 + __u64 rdx; 246 + __u64 rax; 247 + __u64 rcx; 248 + __u64 rsp; 249 + __u64 rip; 250 + __u64 eflags; /* RFLAGS */ 251 + __u16 cs; 252 + __u16 gs; 253 + __u16 fs; 254 + __u16 __pad0; 255 + __u64 err; 256 + __u64 trapno; 257 + __u64 oldmask; 258 + __u64 cr2; 259 259 struct _fpstate __user *fpstate; /* zero when no FPU context */ 260 - unsigned long reserved1[8]; 260 + #ifndef __LP64__ 261 + __u32 __fpstate_pad; 262 + #endif 263 + __u64 reserved1[8]; 261 264 }; 262 265 #endif /* !__KERNEL__ */ 263 266
+13
arch/x86/include/asm/sigframe.h
··· 59 59 #endif /* defined(CONFIG_X86_32) || defined(CONFIG_IA32_EMULATION) */ 60 60 61 61 #ifdef CONFIG_X86_64 62 + 62 63 struct rt_sigframe { 63 64 char __user *pretcode; 64 65 struct ucontext uc; 65 66 struct siginfo info; 66 67 /* fp state follows here */ 67 68 }; 69 + 70 + #ifdef CONFIG_X86_X32_ABI 71 + 72 + struct rt_sigframe_x32 { 73 + u64 pretcode; 74 + struct ucontext_x32 uc; 75 + compat_siginfo_t info; 76 + /* fp state follows here */ 77 + }; 78 + 79 + #endif /* CONFIG_X86_X32_ABI */ 80 + 68 81 #endif /* CONFIG_X86_64 */ 69 82 70 83 #endif /* _ASM_X86_SIGFRAME_H */
+24
arch/x86/include/asm/sighandling.h
··· 1 + #ifndef _ASM_X86_SIGHANDLING_H 2 + #define _ASM_X86_SIGHANDLING_H 3 + 4 + #include <linux/compiler.h> 5 + #include <linux/ptrace.h> 6 + #include <linux/signal.h> 7 + 8 + #include <asm/processor-flags.h> 9 + 10 + #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) 11 + 12 + #define __FIX_EFLAGS (X86_EFLAGS_AC | X86_EFLAGS_OF | \ 13 + X86_EFLAGS_DF | X86_EFLAGS_TF | X86_EFLAGS_SF | \ 14 + X86_EFLAGS_ZF | X86_EFLAGS_AF | X86_EFLAGS_PF | \ 15 + X86_EFLAGS_CF) 16 + 17 + void signal_fault(struct pt_regs *regs, void __user *frame, char *where); 18 + 19 + int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, 20 + unsigned long *pax); 21 + int setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate, 22 + struct pt_regs *regs, unsigned long mask); 23 + 24 + #endif /* _ASM_X86_SIGHANDLING_H */
+5 -2
arch/x86/include/asm/sys_ia32.h
··· 10 10 #ifndef _ASM_X86_SYS_IA32_H 11 11 #define _ASM_X86_SYS_IA32_H 12 12 13 + #ifdef CONFIG_COMPAT 14 + 13 15 #include <linux/compiler.h> 14 16 #include <linux/linkage.h> 15 17 #include <linux/types.h> ··· 38 36 struct sigaction32 __user *, unsigned int); 39 37 asmlinkage long sys32_sigaction(int, struct old_sigaction32 __user *, 40 38 struct old_sigaction32 __user *); 41 - asmlinkage long sys32_rt_sigprocmask(int, compat_sigset_t __user *, 42 - compat_sigset_t __user *, unsigned int); 43 39 asmlinkage long sys32_alarm(unsigned int); 44 40 45 41 asmlinkage long sys32_waitpid(compat_pid_t, unsigned int *, int); ··· 83 83 84 84 asmlinkage long sys32_fanotify_mark(int, unsigned int, u32, u32, int, 85 85 const char __user *); 86 + 87 + #endif /* CONFIG_COMPAT */ 88 + 86 89 #endif /* _ASM_X86_SYS_IA32_H */
+3 -2
arch/x86/include/asm/syscall.h
··· 16 16 #include <linux/sched.h> 17 17 #include <linux/err.h> 18 18 #include <asm/asm-offsets.h> /* For NR_syscalls */ 19 + #include <asm/unistd.h> 19 20 20 21 extern const unsigned long sys_call_table[]; 21 22 ··· 27 26 */ 28 27 static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs) 29 28 { 30 - return regs->orig_ax; 29 + return regs->orig_ax & __SYSCALL_MASK; 31 30 } 32 31 33 32 static inline void syscall_rollback(struct task_struct *task, 34 33 struct pt_regs *regs) 35 34 { 36 - regs->ax = regs->orig_ax; 35 + regs->ax = regs->orig_ax & __SYSCALL_MASK; 37 36 } 38 37 39 38 static inline long syscall_get_error(struct task_struct *task,
+5 -1
arch/x86/include/asm/thread_info.h
··· 86 86 #define TIF_MCE_NOTIFY 10 /* notify userspace of an MCE */ 87 87 #define TIF_USER_RETURN_NOTIFY 11 /* notify kernel of userspace return */ 88 88 #define TIF_NOTSC 16 /* TSC is not accessible in userland */ 89 - #define TIF_IA32 17 /* 32bit process */ 89 + #define TIF_IA32 17 /* IA32 compatibility process */ 90 90 #define TIF_FORK 18 /* ret_from_fork */ 91 91 #define TIF_MEMDIE 20 /* is terminating due to OOM killer */ 92 92 #define TIF_DEBUG 21 /* uses debug registers */ ··· 95 95 #define TIF_BLOCKSTEP 25 /* set when we want DEBUGCTLMSR_BTF */ 96 96 #define TIF_LAZY_MMU_UPDATES 27 /* task is updating the mmu lazily */ 97 97 #define TIF_SYSCALL_TRACEPOINT 28 /* syscall tracepoint instrumentation */ 98 + #define TIF_ADDR32 29 /* 32-bit address space on 64 bits */ 99 + #define TIF_X32 30 /* 32-bit native x86-64 binary */ 98 100 99 101 #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) 100 102 #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) ··· 118 116 #define _TIF_BLOCKSTEP (1 << TIF_BLOCKSTEP) 119 117 #define _TIF_LAZY_MMU_UPDATES (1 << TIF_LAZY_MMU_UPDATES) 120 118 #define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT) 119 + #define _TIF_ADDR32 (1 << TIF_ADDR32) 120 + #define _TIF_X32 (1 << TIF_X32) 121 121 122 122 /* work to do in syscall_trace_enter() */ 123 123 #define _TIF_WORK_SYSCALL_ENTRY \
+14 -1
arch/x86/include/asm/unistd.h
··· 1 1 #ifndef _ASM_X86_UNISTD_H 2 2 #define _ASM_X86_UNISTD_H 1 3 3 4 + /* x32 syscall flag bit */ 5 + #define __X32_SYSCALL_BIT 0x40000000 6 + 4 7 #ifdef __KERNEL__ 8 + 9 + # ifdef CONFIG_X86_X32_ABI 10 + # define __SYSCALL_MASK (~(__X32_SYSCALL_BIT)) 11 + # else 12 + # define __SYSCALL_MASK (~0) 13 + # endif 14 + 5 15 # ifdef CONFIG_X86_32 6 16 7 17 # include <asm/unistd_32.h> ··· 24 14 # else 25 15 26 16 # include <asm/unistd_64.h> 17 + # include <asm/unistd_64_x32.h> 27 18 # define __ARCH_WANT_COMPAT_SYS_TIME 28 19 29 20 # endif ··· 63 52 #else 64 53 # ifdef __i386__ 65 54 # include <asm/unistd_32.h> 66 - # else 55 + # elif defined(__LP64__) 67 56 # include <asm/unistd_64.h> 57 + # else 58 + # include <asm/unistd_x32.h> 68 59 # endif 69 60 #endif 70 61
+6
arch/x86/kernel/asm-offsets_64.c
··· 1 1 #include <asm/ia32.h> 2 2 3 3 #define __SYSCALL_64(nr, sym, compat) [nr] = 1, 4 + #define __SYSCALL_COMMON(nr, sym, compat) [nr] = 1, 5 + #ifdef CONFIG_X86_X32_ABI 6 + # define __SYSCALL_X32(nr, sym, compat) [nr] = 1, 7 + #else 8 + # define __SYSCALL_X32(nr, sym, compat) /* nothing */ 9 + #endif 4 10 static char syscalls_64[] = { 5 11 #include <asm/syscalls_64.h> 6 12 };
+6 -4
arch/x86/kernel/cpu/mtrr/if.c
··· 167 167 { 168 168 int err = 0; 169 169 mtrr_type type; 170 + unsigned long base; 170 171 unsigned long size; 171 172 struct mtrr_sentry sentry; 172 173 struct mtrr_gentry gentry; ··· 268 267 #endif 269 268 if (gentry.regnum >= num_var_ranges) 270 269 return -EINVAL; 271 - mtrr_if->get(gentry.regnum, &gentry.base, &size, &type); 270 + mtrr_if->get(gentry.regnum, &base, &size, &type); 272 271 273 272 /* Hide entries that go above 4GB */ 274 - if (gentry.base + size - 1 >= (1UL << (8 * sizeof(gentry.size) - PAGE_SHIFT)) 273 + if (base + size - 1 >= (1UL << (8 * sizeof(gentry.size) - PAGE_SHIFT)) 275 274 || size >= (1UL << (8 * sizeof(gentry.size) - PAGE_SHIFT))) 276 275 gentry.base = gentry.size = gentry.type = 0; 277 276 else { 278 - gentry.base <<= PAGE_SHIFT; 277 + gentry.base = base << PAGE_SHIFT; 279 278 gentry.size = size << PAGE_SHIFT; 280 279 gentry.type = type; 281 280 } ··· 322 321 #endif 323 322 if (gentry.regnum >= num_var_ranges) 324 323 return -EINVAL; 325 - mtrr_if->get(gentry.regnum, &gentry.base, &size, &type); 324 + mtrr_if->get(gentry.regnum, &base, &size, &type); 326 325 /* Hide entries that would overflow */ 327 326 if (size != (__typeof__(gentry.size))size) 328 327 gentry.base = gentry.size = gentry.type = 0; 329 328 else { 329 + gentry.base = base; 330 330 gentry.size = size; 331 331 gentry.type = type; 332 332 }
+3 -1
arch/x86/kernel/cpu/perf_event.c
··· 29 29 #include <asm/apic.h> 30 30 #include <asm/stacktrace.h> 31 31 #include <asm/nmi.h> 32 - #include <asm/compat.h> 33 32 #include <asm/smp.h> 34 33 #include <asm/alternative.h> 35 34 #include <asm/timer.h> ··· 1747 1748 } 1748 1749 1749 1750 #ifdef CONFIG_COMPAT 1751 + 1752 + #include <asm/compat.h> 1753 + 1750 1754 static inline int 1751 1755 perf_callchain_user32(struct pt_regs *regs, struct perf_callchain_entry *entry) 1752 1756 {
+44
arch/x86/kernel/entry_64.S
··· 481 481 testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) 482 482 jnz tracesys 483 483 system_call_fastpath: 484 + #if __SYSCALL_MASK == ~0 484 485 cmpq $__NR_syscall_max,%rax 486 + #else 487 + andl $__SYSCALL_MASK,%eax 488 + cmpl $__NR_syscall_max,%eax 489 + #endif 485 490 ja badsys 486 491 movq %r10,%rcx 487 492 call *sys_call_table(,%rax,8) # XXX: rip relative ··· 600 595 */ 601 596 LOAD_ARGS ARGOFFSET, 1 602 597 RESTORE_REST 598 + #if __SYSCALL_MASK == ~0 603 599 cmpq $__NR_syscall_max,%rax 600 + #else 601 + andl $__SYSCALL_MASK,%eax 602 + cmpl $__NR_syscall_max,%eax 603 + #endif 604 604 ja int_ret_from_sys_call /* RAX(%rsp) set to -ENOSYS above */ 605 605 movq %r10,%rcx /* fixup for C */ 606 606 call *sys_call_table(,%rax,8) ··· 744 734 jmp int_ret_from_sys_call 745 735 CFI_ENDPROC 746 736 END(stub_rt_sigreturn) 737 + 738 + #ifdef CONFIG_X86_X32_ABI 739 + PTREGSCALL stub_x32_sigaltstack, sys32_sigaltstack, %rdx 740 + 741 + ENTRY(stub_x32_rt_sigreturn) 742 + CFI_STARTPROC 743 + addq $8, %rsp 744 + PARTIAL_FRAME 0 745 + SAVE_REST 746 + movq %rsp,%rdi 747 + FIXUP_TOP_OF_STACK %r11 748 + call sys32_x32_rt_sigreturn 749 + movq %rax,RAX(%rsp) # fixme, this could be done at the higher layer 750 + RESTORE_REST 751 + jmp int_ret_from_sys_call 752 + CFI_ENDPROC 753 + END(stub_x32_rt_sigreturn) 754 + 755 + ENTRY(stub_x32_execve) 756 + CFI_STARTPROC 757 + addq $8, %rsp 758 + PARTIAL_FRAME 0 759 + SAVE_REST 760 + FIXUP_TOP_OF_STACK %r11 761 + movq %rsp, %rcx 762 + call sys32_execve 763 + RESTORE_TOP_OF_STACK %r11 764 + movq %rax,RAX(%rsp) 765 + RESTORE_REST 766 + jmp int_ret_from_sys_call 767 + CFI_ENDPROC 768 + END(stub_x32_execve) 769 + 770 + #endif 747 771 748 772 /* 749 773 * Build the entry stubs and pointer table with some assembler magic.
+21 -6
arch/x86/kernel/process_64.c
··· 258 258 void start_thread_ia32(struct pt_regs *regs, u32 new_ip, u32 new_sp) 259 259 { 260 260 start_thread_common(regs, new_ip, new_sp, 261 - __USER32_CS, __USER32_DS, __USER32_DS); 261 + test_thread_flag(TIF_X32) 262 + ? __USER_CS : __USER32_CS, 263 + __USER_DS, __USER_DS); 262 264 } 263 265 #endif 264 266 ··· 383 381 384 382 /* Make sure to be in 64bit mode */ 385 383 clear_thread_flag(TIF_IA32); 384 + clear_thread_flag(TIF_ADDR32); 385 + clear_thread_flag(TIF_X32); 386 386 387 387 /* Ensure the corresponding mm is not marked. */ 388 388 if (current->mm) ··· 397 393 current->personality &= ~READ_IMPLIES_EXEC; 398 394 } 399 395 400 - void set_personality_ia32(void) 396 + void set_personality_ia32(bool x32) 401 397 { 402 398 /* inherit personality from parent */ 403 399 404 400 /* Make sure to be in 32bit mode */ 405 - set_thread_flag(TIF_IA32); 406 - current->personality |= force_personality32; 401 + set_thread_flag(TIF_ADDR32); 407 402 408 403 /* Mark the associated mm as containing 32-bit tasks. */ 409 404 if (current->mm) 410 405 current->mm->context.ia32_compat = 1; 411 406 412 - /* Prepare the first "return" to user space */ 413 - current_thread_info()->status |= TS_COMPAT; 407 + if (x32) { 408 + clear_thread_flag(TIF_IA32); 409 + set_thread_flag(TIF_X32); 410 + current->personality &= ~READ_IMPLIES_EXEC; 411 + /* is_compat_task() uses the presence of the x32 412 + syscall bit flag to determine compat status */ 413 + current_thread_info()->status &= ~TS_COMPAT; 414 + } else { 415 + set_thread_flag(TIF_IA32); 416 + clear_thread_flag(TIF_X32); 417 + current->personality |= force_personality32; 418 + /* Prepare the first "return" to user space */ 419 + current_thread_info()->status |= TS_COMPAT; 420 + } 414 421 } 415 422 416 423 unsigned long get_wchan(struct task_struct *p)
+99
arch/x86/kernel/ptrace.c
··· 1130 1130 return ret; 1131 1131 } 1132 1132 1133 + #ifdef CONFIG_X86_X32_ABI 1134 + static long x32_arch_ptrace(struct task_struct *child, 1135 + compat_long_t request, compat_ulong_t caddr, 1136 + compat_ulong_t cdata) 1137 + { 1138 + unsigned long addr = caddr; 1139 + unsigned long data = cdata; 1140 + void __user *datap = compat_ptr(data); 1141 + int ret; 1142 + 1143 + switch (request) { 1144 + /* Read 32bits at location addr in the USER area. Only allow 1145 + to return the lower 32bits of segment and debug registers. */ 1146 + case PTRACE_PEEKUSR: { 1147 + u32 tmp; 1148 + 1149 + ret = -EIO; 1150 + if ((addr & (sizeof(data) - 1)) || addr >= sizeof(struct user) || 1151 + addr < offsetof(struct user_regs_struct, cs)) 1152 + break; 1153 + 1154 + tmp = 0; /* Default return condition */ 1155 + if (addr < sizeof(struct user_regs_struct)) 1156 + tmp = getreg(child, addr); 1157 + else if (addr >= offsetof(struct user, u_debugreg[0]) && 1158 + addr <= offsetof(struct user, u_debugreg[7])) { 1159 + addr -= offsetof(struct user, u_debugreg[0]); 1160 + tmp = ptrace_get_debugreg(child, addr / sizeof(data)); 1161 + } 1162 + ret = put_user(tmp, (__u32 __user *)datap); 1163 + break; 1164 + } 1165 + 1166 + /* Write the word at location addr in the USER area. Only allow 1167 + to update segment and debug registers with the upper 32bits 1168 + zero-extended. */ 1169 + case PTRACE_POKEUSR: 1170 + ret = -EIO; 1171 + if ((addr & (sizeof(data) - 1)) || addr >= sizeof(struct user) || 1172 + addr < offsetof(struct user_regs_struct, cs)) 1173 + break; 1174 + 1175 + if (addr < sizeof(struct user_regs_struct)) 1176 + ret = putreg(child, addr, data); 1177 + else if (addr >= offsetof(struct user, u_debugreg[0]) && 1178 + addr <= offsetof(struct user, u_debugreg[7])) { 1179 + addr -= offsetof(struct user, u_debugreg[0]); 1180 + ret = ptrace_set_debugreg(child, 1181 + addr / sizeof(data), data); 1182 + } 1183 + break; 1184 + 1185 + case PTRACE_GETREGS: /* Get all gp regs from the child. */ 1186 + return copy_regset_to_user(child, 1187 + task_user_regset_view(current), 1188 + REGSET_GENERAL, 1189 + 0, sizeof(struct user_regs_struct), 1190 + datap); 1191 + 1192 + case PTRACE_SETREGS: /* Set all gp regs in the child. */ 1193 + return copy_regset_from_user(child, 1194 + task_user_regset_view(current), 1195 + REGSET_GENERAL, 1196 + 0, sizeof(struct user_regs_struct), 1197 + datap); 1198 + 1199 + case PTRACE_GETFPREGS: /* Get the child FPU state. */ 1200 + return copy_regset_to_user(child, 1201 + task_user_regset_view(current), 1202 + REGSET_FP, 1203 + 0, sizeof(struct user_i387_struct), 1204 + datap); 1205 + 1206 + case PTRACE_SETFPREGS: /* Set the child FPU state. */ 1207 + return copy_regset_from_user(child, 1208 + task_user_regset_view(current), 1209 + REGSET_FP, 1210 + 0, sizeof(struct user_i387_struct), 1211 + datap); 1212 + 1213 + /* normal 64bit interface to access TLS data. 1214 + Works just like arch_prctl, except that the arguments 1215 + are reversed. */ 1216 + case PTRACE_ARCH_PRCTL: 1217 + return do_arch_prctl(child, data, addr); 1218 + 1219 + default: 1220 + return compat_ptrace_request(child, request, addr, data); 1221 + } 1222 + 1223 + return ret; 1224 + } 1225 + #endif 1226 + 1133 1227 long compat_arch_ptrace(struct task_struct *child, compat_long_t request, 1134 1228 compat_ulong_t caddr, compat_ulong_t cdata) 1135 1229 { ··· 1232 1138 void __user *datap = compat_ptr(data); 1233 1139 int ret; 1234 1140 __u32 val; 1141 + 1142 + #ifdef CONFIG_X86_X32_ABI 1143 + if (!is_ia32_task()) 1144 + return x32_arch_ptrace(child, request, caddr, cdata); 1145 + #endif 1235 1146 1236 1147 switch (request) { 1237 1148 case PTRACE_PEEKUSR:
+122 -16
arch/x86/kernel/signal.c
··· 10 10 #include <linux/mm.h> 11 11 #include <linux/smp.h> 12 12 #include <linux/kernel.h> 13 - #include <linux/signal.h> 14 13 #include <linux/errno.h> 15 14 #include <linux/wait.h> 16 - #include <linux/ptrace.h> 17 15 #include <linux/tracehook.h> 18 16 #include <linux/unistd.h> 19 17 #include <linux/stddef.h> ··· 25 27 #include <asm/fpu-internal.h> 26 28 #include <asm/vdso.h> 27 29 #include <asm/mce.h> 30 + #include <asm/sighandling.h> 28 31 29 32 #ifdef CONFIG_X86_64 30 33 #include <asm/proto.h> 31 34 #include <asm/ia32_unistd.h> 35 + #include <asm/sys_ia32.h> 32 36 #endif /* CONFIG_X86_64 */ 33 37 34 38 #include <asm/syscall.h> 35 39 #include <asm/syscalls.h> 36 40 37 41 #include <asm/sigframe.h> 38 - 39 - #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) 40 - 41 - #define __FIX_EFLAGS (X86_EFLAGS_AC | X86_EFLAGS_OF | \ 42 - X86_EFLAGS_DF | X86_EFLAGS_TF | X86_EFLAGS_SF | \ 43 - X86_EFLAGS_ZF | X86_EFLAGS_AF | X86_EFLAGS_PF | \ 44 - X86_EFLAGS_CF) 45 42 46 43 #ifdef CONFIG_X86_32 47 44 # define FIX_EFLAGS (__FIX_EFLAGS | X86_EFLAGS_RF) ··· 62 69 regs->seg = GET_SEG(seg) | 3; \ 63 70 } while (0) 64 71 65 - static int 66 - restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, 67 - unsigned long *pax) 72 + int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, 73 + unsigned long *pax) 68 74 { 69 75 void __user *buf; 70 76 unsigned int tmpflags; ··· 118 126 return err; 119 127 } 120 128 121 - static int 122 - setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate, 123 - struct pt_regs *regs, unsigned long mask) 129 + int setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate, 130 + struct pt_regs *regs, unsigned long mask) 124 131 { 125 132 int err = 0; 126 133 ··· 634 643 #define is_ia32 0 635 644 #endif /* CONFIG_IA32_EMULATION */ 636 645 646 + #ifdef CONFIG_X86_X32_ABI 647 + #define is_x32 test_thread_flag(TIF_X32) 648 + 649 + static int x32_setup_rt_frame(int sig, struct k_sigaction *ka, 650 + siginfo_t *info, compat_sigset_t *set, 651 + struct pt_regs *regs); 652 + #else /* !CONFIG_X86_X32_ABI */ 653 + #define is_x32 0 654 + #endif /* CONFIG_X86_X32_ABI */ 655 + 637 656 int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, 638 657 sigset_t *set, struct pt_regs *regs); 639 658 int ia32_setup_frame(int sig, struct k_sigaction *ka, ··· 668 667 ret = ia32_setup_rt_frame(usig, ka, info, set, regs); 669 668 else 670 669 ret = ia32_setup_frame(usig, ka, set, regs); 671 - } else 670 + #ifdef CONFIG_X86_X32_ABI 671 + } else if (is_x32) { 672 + ret = x32_setup_rt_frame(usig, ka, info, 673 + (compat_sigset_t *)set, regs); 674 + #endif 675 + } else { 672 676 ret = __setup_rt_frame(sig, ka, info, set, regs); 677 + } 673 678 674 679 if (ret) { 675 680 force_sigsegv(sig, current); ··· 858 851 859 852 force_sig(SIGSEGV, me); 860 853 } 854 + 855 + #ifdef CONFIG_X86_X32_ABI 856 + static int x32_setup_rt_frame(int sig, struct k_sigaction *ka, 857 + siginfo_t *info, compat_sigset_t *set, 858 + struct pt_regs *regs) 859 + { 860 + struct rt_sigframe_x32 __user *frame; 861 + void __user *restorer; 862 + int err = 0; 863 + void __user *fpstate = NULL; 864 + 865 + frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate); 866 + 867 + if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) 868 + return -EFAULT; 869 + 870 + if (ka->sa.sa_flags & SA_SIGINFO) { 871 + if (copy_siginfo_to_user32(&frame->info, info)) 872 + return -EFAULT; 873 + } 874 + 875 + put_user_try { 876 + /* Create the ucontext. */ 877 + if (cpu_has_xsave) 878 + put_user_ex(UC_FP_XSTATE, &frame->uc.uc_flags); 879 + else 880 + put_user_ex(0, &frame->uc.uc_flags); 881 + put_user_ex(0, &frame->uc.uc_link); 882 + put_user_ex(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); 883 + put_user_ex(sas_ss_flags(regs->sp), 884 + &frame->uc.uc_stack.ss_flags); 885 + put_user_ex(current->sas_ss_size, &frame->uc.uc_stack.ss_size); 886 + put_user_ex(0, &frame->uc.uc__pad0); 887 + err |= setup_sigcontext(&frame->uc.uc_mcontext, fpstate, 888 + regs, set->sig[0]); 889 + err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); 890 + 891 + if (ka->sa.sa_flags & SA_RESTORER) { 892 + restorer = ka->sa.sa_restorer; 893 + } else { 894 + /* could use a vstub here */ 895 + restorer = NULL; 896 + err |= -EFAULT; 897 + } 898 + put_user_ex(restorer, &frame->pretcode); 899 + } put_user_catch(err); 900 + 901 + if (err) 902 + return -EFAULT; 903 + 904 + /* Set up registers for signal handler */ 905 + regs->sp = (unsigned long) frame; 906 + regs->ip = (unsigned long) ka->sa.sa_handler; 907 + 908 + /* We use the x32 calling convention here... */ 909 + regs->di = sig; 910 + regs->si = (unsigned long) &frame->info; 911 + regs->dx = (unsigned long) &frame->uc; 912 + 913 + loadsegment(ds, __USER_DS); 914 + loadsegment(es, __USER_DS); 915 + 916 + regs->cs = __USER_CS; 917 + regs->ss = __USER_DS; 918 + 919 + return 0; 920 + } 921 + 922 + asmlinkage long sys32_x32_rt_sigreturn(struct pt_regs *regs) 923 + { 924 + struct rt_sigframe_x32 __user *frame; 925 + sigset_t set; 926 + unsigned long ax; 927 + struct pt_regs tregs; 928 + 929 + frame = (struct rt_sigframe_x32 __user *)(regs->sp - 8); 930 + 931 + if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) 932 + goto badframe; 933 + if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set))) 934 + goto badframe; 935 + 936 + sigdelsetmask(&set, ~_BLOCKABLE); 937 + set_current_blocked(&set); 938 + 939 + if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax)) 940 + goto badframe; 941 + 942 + tregs = *regs; 943 + if (sys32_sigaltstack(&frame->uc.uc_stack, NULL, &tregs) == -EFAULT) 944 + goto badframe; 945 + 946 + return ax; 947 + 948 + badframe: 949 + signal_fault(regs, frame, "x32 rt_sigreturn"); 950 + return 0; 951 + } 952 + #endif
+3 -3
arch/x86/kernel/sys_x86_64.c
··· 98 98 static void find_start_end(unsigned long flags, unsigned long *begin, 99 99 unsigned long *end) 100 100 { 101 - if (!test_thread_flag(TIF_IA32) && (flags & MAP_32BIT)) { 101 + if (!test_thread_flag(TIF_ADDR32) && (flags & MAP_32BIT)) { 102 102 unsigned long new_begin; 103 103 /* This is usually used needed to map code in small 104 104 model, so it needs to be in the first 31bit. Limit ··· 144 144 (!vma || addr + len <= vma->vm_start)) 145 145 return addr; 146 146 } 147 - if (((flags & MAP_32BIT) || test_thread_flag(TIF_IA32)) 147 + if (((flags & MAP_32BIT) || test_thread_flag(TIF_ADDR32)) 148 148 && len <= mm->cached_hole_size) { 149 149 mm->cached_hole_size = 0; 150 150 mm->free_area_cache = begin; ··· 205 205 return addr; 206 206 207 207 /* for MAP_32BIT mappings we force the legact mmap base */ 208 - if (!test_thread_flag(TIF_IA32) && (flags & MAP_32BIT)) 208 + if (!test_thread_flag(TIF_ADDR32) && (flags & MAP_32BIT)) 209 209 goto bottomup; 210 210 211 211 /* requesting a specific address */
+8
arch/x86/kernel/syscall_64.c
··· 5 5 #include <linux/cache.h> 6 6 #include <asm/asm-offsets.h> 7 7 8 + #define __SYSCALL_COMMON(nr, sym, compat) __SYSCALL_64(nr, sym, compat) 9 + 10 + #ifdef CONFIG_X86_X32_ABI 11 + # define __SYSCALL_X32(nr, sym, compat) __SYSCALL_64(nr, sym, compat) 12 + #else 13 + # define __SYSCALL_X32(nr, sym, compat) /* nothing */ 14 + #endif 15 + 8 16 #define __SYSCALL_64(nr, sym, compat) extern asmlinkage void sym(void) ; 9 17 #include <asm/syscalls_64.h> 10 18 #undef __SYSCALL_64
+1 -1
arch/x86/oprofile/backtrace.c
··· 67 67 { 68 68 struct stack_frame_ia32 *head; 69 69 70 - /* User process is 32-bit */ 70 + /* User process is IA32 */ 71 71 if (!current || !test_thread_flag(TIF_IA32)) 72 72 return 0; 73 73
+17 -5
arch/x86/syscalls/Makefile
··· 10 10 systbl := $(srctree)/$(src)/syscalltbl.sh 11 11 12 12 quiet_cmd_syshdr = SYSHDR $@ 13 - cmd_syshdr = $(CONFIG_SHELL) '$(syshdr)' $< $@ \ 14 - $(syshdr_abi_$(basetarget)) $(syshdr_pfx_$(basetarget)) 13 + cmd_syshdr = $(CONFIG_SHELL) '$(syshdr)' '$<' '$@' \ 14 + '$(syshdr_abi_$(basetarget))' \ 15 + '$(syshdr_pfx_$(basetarget))' \ 16 + '$(syshdr_offset_$(basetarget))' 15 17 quiet_cmd_systbl = SYSTBL $@ 16 18 cmd_systbl = $(CONFIG_SHELL) '$(systbl)' $< $@ 17 19 ··· 26 24 $(out)/unistd_32_ia32.h: $(syscall32) $(syshdr) 27 25 $(call if_changed,syshdr) 28 26 29 - syshdr_abi_unistd_64 := 64 27 + syshdr_abi_unistd_x32 := common,x32 28 + syshdr_offset_unistd_x32 := __X32_SYSCALL_BIT 29 + $(out)/unistd_x32.h: $(syscall64) $(syshdr) 30 + $(call if_changed,syshdr) 31 + 32 + syshdr_abi_unistd_64 := common,64 30 33 $(out)/unistd_64.h: $(syscall64) $(syshdr) 34 + $(call if_changed,syshdr) 35 + 36 + syshdr_abi_unistd_64_x32 := x32 37 + syshdr_pfx_unistd_64_x32 := x32_ 38 + $(out)/unistd_64_x32.h: $(syscall64) $(syshdr) 31 39 $(call if_changed,syshdr) 32 40 33 41 $(out)/syscalls_32.h: $(syscall32) $(systbl) ··· 45 33 $(out)/syscalls_64.h: $(syscall64) $(systbl) 46 34 $(call if_changed,systbl) 47 35 48 - syshdr-y += unistd_32.h unistd_64.h 36 + syshdr-y += unistd_32.h unistd_64.h unistd_x32.h 49 37 syshdr-y += syscalls_32.h 50 - syshdr-$(CONFIG_X86_64) += unistd_32_ia32.h 38 + syshdr-$(CONFIG_X86_64) += unistd_32_ia32.h unistd_64_x32.h 51 39 syshdr-$(CONFIG_X86_64) += syscalls_64.h 52 40 53 41 targets += $(syshdr-y)
+1 -1
arch/x86/syscalls/syscall_32.tbl
··· 181 181 172 i386 prctl sys_prctl 182 182 173 i386 rt_sigreturn ptregs_rt_sigreturn stub32_rt_sigreturn 183 183 174 i386 rt_sigaction sys_rt_sigaction sys32_rt_sigaction 184 - 175 i386 rt_sigprocmask sys_rt_sigprocmask sys32_rt_sigprocmask 184 + 175 i386 rt_sigprocmask sys_rt_sigprocmask 185 185 176 i386 rt_sigpending sys_rt_sigpending sys32_rt_sigpending 186 186 177 i386 rt_sigtimedwait sys_rt_sigtimedwait compat_sys_rt_sigtimedwait 187 187 178 i386 rt_sigqueueinfo sys_rt_sigqueueinfo sys32_rt_sigqueueinfo
+306 -273
arch/x86/syscalls/syscall_64.tbl
··· 4 4 # The format is: 5 5 # <number> <abi> <name> <entry point> 6 6 # 7 - # The abi is always "64" for this file (for now.) 7 + # The abi is "common", "64" or "x32" for this file. 8 8 # 9 - 0 64 read sys_read 10 - 1 64 write sys_write 11 - 2 64 open sys_open 12 - 3 64 close sys_close 13 - 4 64 stat sys_newstat 14 - 5 64 fstat sys_newfstat 15 - 6 64 lstat sys_newlstat 16 - 7 64 poll sys_poll 17 - 8 64 lseek sys_lseek 18 - 9 64 mmap sys_mmap 19 - 10 64 mprotect sys_mprotect 20 - 11 64 munmap sys_munmap 21 - 12 64 brk sys_brk 9 + 0 common read sys_read 10 + 1 common write sys_write 11 + 2 common open sys_open 12 + 3 common close sys_close 13 + 4 common stat sys_newstat 14 + 5 common fstat sys_newfstat 15 + 6 common lstat sys_newlstat 16 + 7 common poll sys_poll 17 + 8 common lseek sys_lseek 18 + 9 common mmap sys_mmap 19 + 10 common mprotect sys_mprotect 20 + 11 common munmap sys_munmap 21 + 12 common brk sys_brk 22 22 13 64 rt_sigaction sys_rt_sigaction 23 - 14 64 rt_sigprocmask sys_rt_sigprocmask 23 + 14 common rt_sigprocmask sys_rt_sigprocmask 24 24 15 64 rt_sigreturn stub_rt_sigreturn 25 25 16 64 ioctl sys_ioctl 26 - 17 64 pread64 sys_pread64 27 - 18 64 pwrite64 sys_pwrite64 26 + 17 common pread64 sys_pread64 27 + 18 common pwrite64 sys_pwrite64 28 28 19 64 readv sys_readv 29 29 20 64 writev sys_writev 30 - 21 64 access sys_access 31 - 22 64 pipe sys_pipe 32 - 23 64 select sys_select 33 - 24 64 sched_yield sys_sched_yield 34 - 25 64 mremap sys_mremap 35 - 26 64 msync sys_msync 36 - 27 64 mincore sys_mincore 37 - 28 64 madvise sys_madvise 38 - 29 64 shmget sys_shmget 39 - 30 64 shmat sys_shmat 40 - 31 64 shmctl sys_shmctl 41 - 32 64 dup sys_dup 42 - 33 64 dup2 sys_dup2 43 - 34 64 pause sys_pause 44 - 35 64 nanosleep sys_nanosleep 45 - 36 64 getitimer sys_getitimer 46 - 37 64 alarm sys_alarm 47 - 38 64 setitimer sys_setitimer 48 - 39 64 getpid sys_getpid 49 - 40 64 sendfile sys_sendfile64 50 - 41 64 socket sys_socket 51 - 42 64 connect sys_connect 52 - 43 64 accept sys_accept 53 - 44 64 sendto sys_sendto 30 + 21 common access sys_access 31 + 22 common pipe sys_pipe 32 + 23 common select sys_select 33 + 24 common sched_yield sys_sched_yield 34 + 25 common mremap sys_mremap 35 + 26 common msync sys_msync 36 + 27 common mincore sys_mincore 37 + 28 common madvise sys_madvise 38 + 29 common shmget sys_shmget 39 + 30 common shmat sys_shmat 40 + 31 common shmctl sys_shmctl 41 + 32 common dup sys_dup 42 + 33 common dup2 sys_dup2 43 + 34 common pause sys_pause 44 + 35 common nanosleep sys_nanosleep 45 + 36 common getitimer sys_getitimer 46 + 37 common alarm sys_alarm 47 + 38 common setitimer sys_setitimer 48 + 39 common getpid sys_getpid 49 + 40 common sendfile sys_sendfile64 50 + 41 common socket sys_socket 51 + 42 common connect sys_connect 52 + 43 common accept sys_accept 53 + 44 common sendto sys_sendto 54 54 45 64 recvfrom sys_recvfrom 55 55 46 64 sendmsg sys_sendmsg 56 56 47 64 recvmsg sys_recvmsg 57 - 48 64 shutdown sys_shutdown 58 - 49 64 bind sys_bind 59 - 50 64 listen sys_listen 60 - 51 64 getsockname sys_getsockname 61 - 52 64 getpeername sys_getpeername 62 - 53 64 socketpair sys_socketpair 63 - 54 64 setsockopt sys_setsockopt 64 - 55 64 getsockopt sys_getsockopt 65 - 56 64 clone stub_clone 66 - 57 64 fork stub_fork 67 - 58 64 vfork stub_vfork 57 + 48 common shutdown sys_shutdown 58 + 49 common bind sys_bind 59 + 50 common listen sys_listen 60 + 51 common getsockname sys_getsockname 61 + 52 common getpeername sys_getpeername 62 + 53 common socketpair sys_socketpair 63 + 54 common setsockopt sys_setsockopt 64 + 55 common getsockopt sys_getsockopt 65 + 56 common clone stub_clone 66 + 57 common fork stub_fork 67 + 58 common vfork stub_vfork 68 68 59 64 execve stub_execve 69 - 60 64 exit sys_exit 70 - 61 64 wait4 sys_wait4 71 - 62 64 kill sys_kill 72 - 63 64 uname sys_newuname 73 - 64 64 semget sys_semget 74 - 65 64 semop sys_semop 75 - 66 64 semctl sys_semctl 76 - 67 64 shmdt sys_shmdt 77 - 68 64 msgget sys_msgget 78 - 69 64 msgsnd sys_msgsnd 79 - 70 64 msgrcv sys_msgrcv 80 - 71 64 msgctl sys_msgctl 81 - 72 64 fcntl sys_fcntl 82 - 73 64 flock sys_flock 83 - 74 64 fsync sys_fsync 84 - 75 64 fdatasync sys_fdatasync 85 - 76 64 truncate sys_truncate 86 - 77 64 ftruncate sys_ftruncate 87 - 78 64 getdents sys_getdents 88 - 79 64 getcwd sys_getcwd 89 - 80 64 chdir sys_chdir 90 - 81 64 fchdir sys_fchdir 91 - 82 64 rename sys_rename 92 - 83 64 mkdir sys_mkdir 93 - 84 64 rmdir sys_rmdir 94 - 85 64 creat sys_creat 95 - 86 64 link sys_link 96 - 87 64 unlink sys_unlink 97 - 88 64 symlink sys_symlink 98 - 89 64 readlink sys_readlink 99 - 90 64 chmod sys_chmod 100 - 91 64 fchmod sys_fchmod 101 - 92 64 chown sys_chown 102 - 93 64 fchown sys_fchown 103 - 94 64 lchown sys_lchown 104 - 95 64 umask sys_umask 105 - 96 64 gettimeofday sys_gettimeofday 106 - 97 64 getrlimit sys_getrlimit 107 - 98 64 getrusage sys_getrusage 108 - 99 64 sysinfo sys_sysinfo 109 - 100 64 times sys_times 69 + 60 common exit sys_exit 70 + 61 common wait4 sys_wait4 71 + 62 common kill sys_kill 72 + 63 common uname sys_newuname 73 + 64 common semget sys_semget 74 + 65 common semop sys_semop 75 + 66 common semctl sys_semctl 76 + 67 common shmdt sys_shmdt 77 + 68 common msgget sys_msgget 78 + 69 common msgsnd sys_msgsnd 79 + 70 common msgrcv sys_msgrcv 80 + 71 common msgctl sys_msgctl 81 + 72 common fcntl sys_fcntl 82 + 73 common flock sys_flock 83 + 74 common fsync sys_fsync 84 + 75 common fdatasync sys_fdatasync 85 + 76 common truncate sys_truncate 86 + 77 common ftruncate sys_ftruncate 87 + 78 common getdents sys_getdents 88 + 79 common getcwd sys_getcwd 89 + 80 common chdir sys_chdir 90 + 81 common fchdir sys_fchdir 91 + 82 common rename sys_rename 92 + 83 common mkdir sys_mkdir 93 + 84 common rmdir sys_rmdir 94 + 85 common creat sys_creat 95 + 86 common link sys_link 96 + 87 common unlink sys_unlink 97 + 88 common symlink sys_symlink 98 + 89 common readlink sys_readlink 99 + 90 common chmod sys_chmod 100 + 91 common fchmod sys_fchmod 101 + 92 common chown sys_chown 102 + 93 common fchown sys_fchown 103 + 94 common lchown sys_lchown 104 + 95 common umask sys_umask 105 + 96 common gettimeofday sys_gettimeofday 106 + 97 common getrlimit sys_getrlimit 107 + 98 common getrusage sys_getrusage 108 + 99 common sysinfo sys_sysinfo 109 + 100 common times sys_times 110 110 101 64 ptrace sys_ptrace 111 - 102 64 getuid sys_getuid 112 - 103 64 syslog sys_syslog 113 - 104 64 getgid sys_getgid 114 - 105 64 setuid sys_setuid 115 - 106 64 setgid sys_setgid 116 - 107 64 geteuid sys_geteuid 117 - 108 64 getegid sys_getegid 118 - 109 64 setpgid sys_setpgid 119 - 110 64 getppid sys_getppid 120 - 111 64 getpgrp sys_getpgrp 121 - 112 64 setsid sys_setsid 122 - 113 64 setreuid sys_setreuid 123 - 114 64 setregid sys_setregid 124 - 115 64 getgroups sys_getgroups 125 - 116 64 setgroups sys_setgroups 126 - 117 64 setresuid sys_setresuid 127 - 118 64 getresuid sys_getresuid 128 - 119 64 setresgid sys_setresgid 129 - 120 64 getresgid sys_getresgid 130 - 121 64 getpgid sys_getpgid 131 - 122 64 setfsuid sys_setfsuid 132 - 123 64 setfsgid sys_setfsgid 133 - 124 64 getsid sys_getsid 134 - 125 64 capget sys_capget 135 - 126 64 capset sys_capset 111 + 102 common getuid sys_getuid 112 + 103 common syslog sys_syslog 113 + 104 common getgid sys_getgid 114 + 105 common setuid sys_setuid 115 + 106 common setgid sys_setgid 116 + 107 common geteuid sys_geteuid 117 + 108 common getegid sys_getegid 118 + 109 common setpgid sys_setpgid 119 + 110 common getppid sys_getppid 120 + 111 common getpgrp sys_getpgrp 121 + 112 common setsid sys_setsid 122 + 113 common setreuid sys_setreuid 123 + 114 common setregid sys_setregid 124 + 115 common getgroups sys_getgroups 125 + 116 common setgroups sys_setgroups 126 + 117 common setresuid sys_setresuid 127 + 118 common getresuid sys_getresuid 128 + 119 common setresgid sys_setresgid 129 + 120 common getresgid sys_getresgid 130 + 121 common getpgid sys_getpgid 131 + 122 common setfsuid sys_setfsuid 132 + 123 common setfsgid sys_setfsgid 133 + 124 common getsid sys_getsid 134 + 125 common capget sys_capget 135 + 126 common capset sys_capset 136 136 127 64 rt_sigpending sys_rt_sigpending 137 137 128 64 rt_sigtimedwait sys_rt_sigtimedwait 138 138 129 64 rt_sigqueueinfo sys_rt_sigqueueinfo 139 - 130 64 rt_sigsuspend sys_rt_sigsuspend 139 + 130 common rt_sigsuspend sys_rt_sigsuspend 140 140 131 64 sigaltstack stub_sigaltstack 141 - 132 64 utime sys_utime 142 - 133 64 mknod sys_mknod 141 + 132 common utime sys_utime 142 + 133 common mknod sys_mknod 143 143 134 64 uselib 144 - 135 64 personality sys_personality 145 - 136 64 ustat sys_ustat 146 - 137 64 statfs sys_statfs 147 - 138 64 fstatfs sys_fstatfs 148 - 139 64 sysfs sys_sysfs 149 - 140 64 getpriority sys_getpriority 150 - 141 64 setpriority sys_setpriority 151 - 142 64 sched_setparam sys_sched_setparam 152 - 143 64 sched_getparam sys_sched_getparam 153 - 144 64 sched_setscheduler sys_sched_setscheduler 154 - 145 64 sched_getscheduler sys_sched_getscheduler 155 - 146 64 sched_get_priority_max sys_sched_get_priority_max 156 - 147 64 sched_get_priority_min sys_sched_get_priority_min 157 - 148 64 sched_rr_get_interval sys_sched_rr_get_interval 158 - 149 64 mlock sys_mlock 159 - 150 64 munlock sys_munlock 160 - 151 64 mlockall sys_mlockall 161 - 152 64 munlockall sys_munlockall 162 - 153 64 vhangup sys_vhangup 163 - 154 64 modify_ldt sys_modify_ldt 164 - 155 64 pivot_root sys_pivot_root 144 + 135 common personality sys_personality 145 + 136 common ustat sys_ustat 146 + 137 common statfs sys_statfs 147 + 138 common fstatfs sys_fstatfs 148 + 139 common sysfs sys_sysfs 149 + 140 common getpriority sys_getpriority 150 + 141 common setpriority sys_setpriority 151 + 142 common sched_setparam sys_sched_setparam 152 + 143 common sched_getparam sys_sched_getparam 153 + 144 common sched_setscheduler sys_sched_setscheduler 154 + 145 common sched_getscheduler sys_sched_getscheduler 155 + 146 common sched_get_priority_max sys_sched_get_priority_max 156 + 147 common sched_get_priority_min sys_sched_get_priority_min 157 + 148 common sched_rr_get_interval sys_sched_rr_get_interval 158 + 149 common mlock sys_mlock 159 + 150 common munlock sys_munlock 160 + 151 common mlockall sys_mlockall 161 + 152 common munlockall sys_munlockall 162 + 153 common vhangup sys_vhangup 163 + 154 common modify_ldt sys_modify_ldt 164 + 155 common pivot_root sys_pivot_root 165 165 156 64 _sysctl sys_sysctl 166 - 157 64 prctl sys_prctl 167 - 158 64 arch_prctl sys_arch_prctl 168 - 159 64 adjtimex sys_adjtimex 169 - 160 64 setrlimit sys_setrlimit 170 - 161 64 chroot sys_chroot 171 - 162 64 sync sys_sync 172 - 163 64 acct sys_acct 173 - 164 64 settimeofday sys_settimeofday 174 - 165 64 mount sys_mount 175 - 166 64 umount2 sys_umount 176 - 167 64 swapon sys_swapon 177 - 168 64 swapoff sys_swapoff 178 - 169 64 reboot sys_reboot 179 - 170 64 sethostname sys_sethostname 180 - 171 64 setdomainname sys_setdomainname 181 - 172 64 iopl stub_iopl 182 - 173 64 ioperm sys_ioperm 166 + 157 common prctl sys_prctl 167 + 158 common arch_prctl sys_arch_prctl 168 + 159 common adjtimex sys_adjtimex 169 + 160 common setrlimit sys_setrlimit 170 + 161 common chroot sys_chroot 171 + 162 common sync sys_sync 172 + 163 common acct sys_acct 173 + 164 common settimeofday sys_settimeofday 174 + 165 common mount sys_mount 175 + 166 common umount2 sys_umount 176 + 167 common swapon sys_swapon 177 + 168 common swapoff sys_swapoff 178 + 169 common reboot sys_reboot 179 + 170 common sethostname sys_sethostname 180 + 171 common setdomainname sys_setdomainname 181 + 172 common iopl stub_iopl 182 + 173 common ioperm sys_ioperm 183 183 174 64 create_module 184 - 175 64 init_module sys_init_module 185 - 176 64 delete_module sys_delete_module 184 + 175 common init_module sys_init_module 185 + 176 common delete_module sys_delete_module 186 186 177 64 get_kernel_syms 187 187 178 64 query_module 188 - 179 64 quotactl sys_quotactl 188 + 179 common quotactl sys_quotactl 189 189 180 64 nfsservctl 190 - 181 64 getpmsg 191 - 182 64 putpmsg 192 - 183 64 afs_syscall 193 - 184 64 tuxcall 194 - 185 64 security 195 - 186 64 gettid sys_gettid 196 - 187 64 readahead sys_readahead 197 - 188 64 setxattr sys_setxattr 198 - 189 64 lsetxattr sys_lsetxattr 199 - 190 64 fsetxattr sys_fsetxattr 200 - 191 64 getxattr sys_getxattr 201 - 192 64 lgetxattr sys_lgetxattr 202 - 193 64 fgetxattr sys_fgetxattr 203 - 194 64 listxattr sys_listxattr 204 - 195 64 llistxattr sys_llistxattr 205 - 196 64 flistxattr sys_flistxattr 206 - 197 64 removexattr sys_removexattr 207 - 198 64 lremovexattr sys_lremovexattr 208 - 199 64 fremovexattr sys_fremovexattr 209 - 200 64 tkill sys_tkill 210 - 201 64 time sys_time 211 - 202 64 futex sys_futex 212 - 203 64 sched_setaffinity sys_sched_setaffinity 213 - 204 64 sched_getaffinity sys_sched_getaffinity 190 + 181 common getpmsg 191 + 182 common putpmsg 192 + 183 common afs_syscall 193 + 184 common tuxcall 194 + 185 common security 195 + 186 common gettid sys_gettid 196 + 187 common readahead sys_readahead 197 + 188 common setxattr sys_setxattr 198 + 189 common lsetxattr sys_lsetxattr 199 + 190 common fsetxattr sys_fsetxattr 200 + 191 common getxattr sys_getxattr 201 + 192 common lgetxattr sys_lgetxattr 202 + 193 common fgetxattr sys_fgetxattr 203 + 194 common listxattr sys_listxattr 204 + 195 common llistxattr sys_llistxattr 205 + 196 common flistxattr sys_flistxattr 206 + 197 common removexattr sys_removexattr 207 + 198 common lremovexattr sys_lremovexattr 208 + 199 common fremovexattr sys_fremovexattr 209 + 200 common tkill sys_tkill 210 + 201 common time sys_time 211 + 202 common futex sys_futex 212 + 203 common sched_setaffinity sys_sched_setaffinity 213 + 204 common sched_getaffinity sys_sched_getaffinity 214 214 205 64 set_thread_area 215 - 206 64 io_setup sys_io_setup 216 - 207 64 io_destroy sys_io_destroy 217 - 208 64 io_getevents sys_io_getevents 218 - 209 64 io_submit sys_io_submit 219 - 210 64 io_cancel sys_io_cancel 215 + 206 common io_setup sys_io_setup 216 + 207 common io_destroy sys_io_destroy 217 + 208 common io_getevents sys_io_getevents 218 + 209 common io_submit sys_io_submit 219 + 210 common io_cancel sys_io_cancel 220 220 211 64 get_thread_area 221 - 212 64 lookup_dcookie sys_lookup_dcookie 222 - 213 64 epoll_create sys_epoll_create 221 + 212 common lookup_dcookie sys_lookup_dcookie 222 + 213 common epoll_create sys_epoll_create 223 223 214 64 epoll_ctl_old 224 224 215 64 epoll_wait_old 225 - 216 64 remap_file_pages sys_remap_file_pages 226 - 217 64 getdents64 sys_getdents64 227 - 218 64 set_tid_address sys_set_tid_address 228 - 219 64 restart_syscall sys_restart_syscall 229 - 220 64 semtimedop sys_semtimedop 230 - 221 64 fadvise64 sys_fadvise64 225 + 216 common remap_file_pages sys_remap_file_pages 226 + 217 common getdents64 sys_getdents64 227 + 218 common set_tid_address sys_set_tid_address 228 + 219 common restart_syscall sys_restart_syscall 229 + 220 common semtimedop sys_semtimedop 230 + 221 common fadvise64 sys_fadvise64 231 231 222 64 timer_create sys_timer_create 232 - 223 64 timer_settime sys_timer_settime 233 - 224 64 timer_gettime sys_timer_gettime 234 - 225 64 timer_getoverrun sys_timer_getoverrun 235 - 226 64 timer_delete sys_timer_delete 236 - 227 64 clock_settime sys_clock_settime 237 - 228 64 clock_gettime sys_clock_gettime 238 - 229 64 clock_getres sys_clock_getres 239 - 230 64 clock_nanosleep sys_clock_nanosleep 240 - 231 64 exit_group sys_exit_group 241 - 232 64 epoll_wait sys_epoll_wait 242 - 233 64 epoll_ctl sys_epoll_ctl 243 - 234 64 tgkill sys_tgkill 244 - 235 64 utimes sys_utimes 232 + 223 common timer_settime sys_timer_settime 233 + 224 common timer_gettime sys_timer_gettime 234 + 225 common timer_getoverrun sys_timer_getoverrun 235 + 226 common timer_delete sys_timer_delete 236 + 227 common clock_settime sys_clock_settime 237 + 228 common clock_gettime sys_clock_gettime 238 + 229 common clock_getres sys_clock_getres 239 + 230 common clock_nanosleep sys_clock_nanosleep 240 + 231 common exit_group sys_exit_group 241 + 232 common epoll_wait sys_epoll_wait 242 + 233 common epoll_ctl sys_epoll_ctl 243 + 234 common tgkill sys_tgkill 244 + 235 common utimes sys_utimes 245 245 236 64 vserver 246 - 237 64 mbind sys_mbind 247 - 238 64 set_mempolicy sys_set_mempolicy 248 - 239 64 get_mempolicy sys_get_mempolicy 249 - 240 64 mq_open sys_mq_open 250 - 241 64 mq_unlink sys_mq_unlink 251 - 242 64 mq_timedsend sys_mq_timedsend 252 - 243 64 mq_timedreceive sys_mq_timedreceive 246 + 237 common mbind sys_mbind 247 + 238 common set_mempolicy sys_set_mempolicy 248 + 239 common get_mempolicy sys_get_mempolicy 249 + 240 common mq_open sys_mq_open 250 + 241 common mq_unlink sys_mq_unlink 251 + 242 common mq_timedsend sys_mq_timedsend 252 + 243 common mq_timedreceive sys_mq_timedreceive 253 253 244 64 mq_notify sys_mq_notify 254 - 245 64 mq_getsetattr sys_mq_getsetattr 254 + 245 common mq_getsetattr sys_mq_getsetattr 255 255 246 64 kexec_load sys_kexec_load 256 256 247 64 waitid sys_waitid 257 - 248 64 add_key sys_add_key 258 - 249 64 request_key sys_request_key 259 - 250 64 keyctl sys_keyctl 260 - 251 64 ioprio_set sys_ioprio_set 261 - 252 64 ioprio_get sys_ioprio_get 262 - 253 64 inotify_init sys_inotify_init 263 - 254 64 inotify_add_watch sys_inotify_add_watch 264 - 255 64 inotify_rm_watch sys_inotify_rm_watch 265 - 256 64 migrate_pages sys_migrate_pages 266 - 257 64 openat sys_openat 267 - 258 64 mkdirat sys_mkdirat 268 - 259 64 mknodat sys_mknodat 269 - 260 64 fchownat sys_fchownat 270 - 261 64 futimesat sys_futimesat 271 - 262 64 newfstatat sys_newfstatat 272 - 263 64 unlinkat sys_unlinkat 273 - 264 64 renameat sys_renameat 274 - 265 64 linkat sys_linkat 275 - 266 64 symlinkat sys_symlinkat 276 - 267 64 readlinkat sys_readlinkat 277 - 268 64 fchmodat sys_fchmodat 278 - 269 64 faccessat sys_faccessat 279 - 270 64 pselect6 sys_pselect6 280 - 271 64 ppoll sys_ppoll 281 - 272 64 unshare sys_unshare 257 + 248 common add_key sys_add_key 258 + 249 common request_key sys_request_key 259 + 250 common keyctl sys_keyctl 260 + 251 common ioprio_set sys_ioprio_set 261 + 252 common ioprio_get sys_ioprio_get 262 + 253 common inotify_init sys_inotify_init 263 + 254 common inotify_add_watch sys_inotify_add_watch 264 + 255 common inotify_rm_watch sys_inotify_rm_watch 265 + 256 common migrate_pages sys_migrate_pages 266 + 257 common openat sys_openat 267 + 258 common mkdirat sys_mkdirat 268 + 259 common mknodat sys_mknodat 269 + 260 common fchownat sys_fchownat 270 + 261 common futimesat sys_futimesat 271 + 262 common newfstatat sys_newfstatat 272 + 263 common unlinkat sys_unlinkat 273 + 264 common renameat sys_renameat 274 + 265 common linkat sys_linkat 275 + 266 common symlinkat sys_symlinkat 276 + 267 common readlinkat sys_readlinkat 277 + 268 common fchmodat sys_fchmodat 278 + 269 common faccessat sys_faccessat 279 + 270 common pselect6 sys_pselect6 280 + 271 common ppoll sys_ppoll 281 + 272 common unshare sys_unshare 282 282 273 64 set_robust_list sys_set_robust_list 283 283 274 64 get_robust_list sys_get_robust_list 284 - 275 64 splice sys_splice 285 - 276 64 tee sys_tee 286 - 277 64 sync_file_range sys_sync_file_range 284 + 275 common splice sys_splice 285 + 276 common tee sys_tee 286 + 277 common sync_file_range sys_sync_file_range 287 287 278 64 vmsplice sys_vmsplice 288 288 279 64 move_pages sys_move_pages 289 - 280 64 utimensat sys_utimensat 290 - 281 64 epoll_pwait sys_epoll_pwait 291 - 282 64 signalfd sys_signalfd 292 - 283 64 timerfd_create sys_timerfd_create 293 - 284 64 eventfd sys_eventfd 294 - 285 64 fallocate sys_fallocate 295 - 286 64 timerfd_settime sys_timerfd_settime 296 - 287 64 timerfd_gettime sys_timerfd_gettime 297 - 288 64 accept4 sys_accept4 298 - 289 64 signalfd4 sys_signalfd4 299 - 290 64 eventfd2 sys_eventfd2 300 - 291 64 epoll_create1 sys_epoll_create1 301 - 292 64 dup3 sys_dup3 302 - 293 64 pipe2 sys_pipe2 303 - 294 64 inotify_init1 sys_inotify_init1 289 + 280 common utimensat sys_utimensat 290 + 281 common epoll_pwait sys_epoll_pwait 291 + 282 common signalfd sys_signalfd 292 + 283 common timerfd_create sys_timerfd_create 293 + 284 common eventfd sys_eventfd 294 + 285 common fallocate sys_fallocate 295 + 286 common timerfd_settime sys_timerfd_settime 296 + 287 common timerfd_gettime sys_timerfd_gettime 297 + 288 common accept4 sys_accept4 298 + 289 common signalfd4 sys_signalfd4 299 + 290 common eventfd2 sys_eventfd2 300 + 291 common epoll_create1 sys_epoll_create1 301 + 292 common dup3 sys_dup3 302 + 293 common pipe2 sys_pipe2 303 + 294 common inotify_init1 sys_inotify_init1 304 304 295 64 preadv sys_preadv 305 305 296 64 pwritev sys_pwritev 306 306 297 64 rt_tgsigqueueinfo sys_rt_tgsigqueueinfo 307 - 298 64 perf_event_open sys_perf_event_open 307 + 298 common perf_event_open sys_perf_event_open 308 308 299 64 recvmmsg sys_recvmmsg 309 - 300 64 fanotify_init sys_fanotify_init 310 - 301 64 fanotify_mark sys_fanotify_mark 311 - 302 64 prlimit64 sys_prlimit64 312 - 303 64 name_to_handle_at sys_name_to_handle_at 313 - 304 64 open_by_handle_at sys_open_by_handle_at 314 - 305 64 clock_adjtime sys_clock_adjtime 315 - 306 64 syncfs sys_syncfs 309 + 300 common fanotify_init sys_fanotify_init 310 + 301 common fanotify_mark sys_fanotify_mark 311 + 302 common prlimit64 sys_prlimit64 312 + 303 common name_to_handle_at sys_name_to_handle_at 313 + 304 common open_by_handle_at sys_open_by_handle_at 314 + 305 common clock_adjtime sys_clock_adjtime 315 + 306 common syncfs sys_syncfs 316 316 307 64 sendmmsg sys_sendmmsg 317 - 308 64 setns sys_setns 318 - 309 64 getcpu sys_getcpu 317 + 308 common setns sys_setns 318 + 309 common getcpu sys_getcpu 319 319 310 64 process_vm_readv sys_process_vm_readv 320 320 311 64 process_vm_writev sys_process_vm_writev 321 + # 322 + # x32-specific system call numbers start at 512 to avoid cache impact 323 + # for native 64-bit operation. 324 + # 325 + 512 x32 rt_sigaction sys32_rt_sigaction 326 + 513 x32 rt_sigreturn stub_x32_rt_sigreturn 327 + 514 x32 ioctl compat_sys_ioctl 328 + 515 x32 readv compat_sys_readv 329 + 516 x32 writev compat_sys_writev 330 + 517 x32 recvfrom compat_sys_recvfrom 331 + 518 x32 sendmsg compat_sys_sendmsg 332 + 519 x32 recvmsg compat_sys_recvmsg 333 + 520 x32 execve stub_x32_execve 334 + 521 x32 ptrace compat_sys_ptrace 335 + 522 x32 rt_sigpending sys32_rt_sigpending 336 + 523 x32 rt_sigtimedwait compat_sys_rt_sigtimedwait 337 + 524 x32 rt_sigqueueinfo sys32_rt_sigqueueinfo 338 + 525 x32 sigaltstack stub_x32_sigaltstack 339 + 526 x32 timer_create compat_sys_timer_create 340 + 527 x32 mq_notify compat_sys_mq_notify 341 + 528 x32 kexec_load compat_sys_kexec_load 342 + 529 x32 waitid compat_sys_waitid 343 + 530 x32 set_robust_list compat_sys_set_robust_list 344 + 531 x32 get_robust_list compat_sys_get_robust_list 345 + 532 x32 vmsplice compat_sys_vmsplice 346 + 533 x32 move_pages compat_sys_move_pages 347 + 534 x32 preadv compat_sys_preadv64 348 + 535 x32 pwritev compat_sys_pwritev64 349 + 536 x32 rt_tgsigqueueinfo compat_sys_rt_tgsigqueueinfo 350 + 537 x32 recvmmsg compat_sys_recvmmsg 351 + 538 x32 sendmmsg compat_sys_sendmmsg 352 + 539 x32 process_vm_readv compat_sys_process_vm_readv 353 + 540 x32 process_vm_writev compat_sys_process_vm_writev
+3
arch/x86/um/sys_call_table_64.c
··· 35 35 #define stub_sigaltstack sys_sigaltstack 36 36 #define stub_rt_sigreturn sys_rt_sigreturn 37 37 38 + #define __SYSCALL_COMMON(nr, sym, compat) __SYSCALL_64(nr, sym, compat) 39 + #define __SYSCALL_X32(nr, sym, compat) /* Not supported */ 40 + 38 41 #define __SYSCALL_64(nr, sym, compat) extern asmlinkage void sym(void) ; 39 42 #include <asm/syscalls_64.h> 40 43
+2
arch/x86/um/user-offsets.c
··· 15 15 }; 16 16 #else 17 17 #define __SYSCALL_64(nr, sym, compat) [nr] = 1, 18 + #define __SYSCALL_COMMON(nr, sym, compat) [nr] = 1, 19 + #define __SYSCALL_X32(nr, sym, compat) /* Not supported */ 18 20 static char syscalls[] = { 19 21 #include <asm/syscalls_64.h> 20 22 };
+2
arch/x86/vdso/.gitignore
··· 1 1 vdso.lds 2 2 vdso-syms.lds 3 + vdsox32.lds 4 + vdsox32-syms.lds 3 5 vdso32-syms.lds 4 6 vdso32-syscall-syms.lds 5 7 vdso32-sysenter-syms.lds
+45 -1
arch/x86/vdso/Makefile
··· 3 3 # 4 4 5 5 VDSO64-$(CONFIG_X86_64) := y 6 + VDSOX32-$(CONFIG_X86_X32_ABI) := y 6 7 VDSO32-$(CONFIG_X86_32) := y 7 8 VDSO32-$(CONFIG_COMPAT) := y 8 9 9 10 vdso-install-$(VDSO64-y) += vdso.so 11 + vdso-install-$(VDSOX32-y) += vdsox32.so 10 12 vdso-install-$(VDSO32-y) += $(vdso32-images) 11 13 12 14 13 15 # files to link into the vdso 14 16 vobjs-y := vdso-note.o vclock_gettime.o vgetcpu.o 15 17 18 + vobjs-$(VDSOX32-y) += $(vobjx32s-compat) 19 + 20 + # Filter out x32 objects. 21 + vobj64s := $(filter-out $(vobjx32s-compat),$(vobjs-y)) 22 + 16 23 # files to link into kernel 17 24 obj-$(VDSO64-y) += vma.o vdso.o 25 + obj-$(VDSOX32-y) += vdsox32.o 18 26 obj-$(VDSO32-y) += vdso32.o vdso32-setup.o 19 27 20 - vobjs := $(foreach F,$(vobjs-y),$(obj)/$F) 28 + vobjs := $(foreach F,$(vobj64s),$(obj)/$F) 21 29 22 30 $(obj)/vdso.o: $(obj)/vdso.so 23 31 ··· 79 71 80 72 $(obj)/%-syms.lds: $(obj)/%.so.dbg FORCE 81 73 $(call if_changed,vdsosym) 74 + 75 + # 76 + # X32 processes use x32 vDSO to access 64bit kernel data. 77 + # 78 + # Build x32 vDSO image: 79 + # 1. Compile x32 vDSO as 64bit. 80 + # 2. Convert object files to x32. 81 + # 3. Build x32 VDSO image with x32 objects, which contains 64bit codes 82 + # so that it can reach 64bit address space with 64bit pointers. 83 + # 84 + 85 + targets += vdsox32-syms.lds 86 + obj-$(VDSOX32-y) += vdsox32-syms.lds 87 + 88 + CPPFLAGS_vdsox32.lds = $(CPPFLAGS_vdso.lds) 89 + VDSO_LDFLAGS_vdsox32.lds = -Wl,-m,elf32_x86_64 \ 90 + -Wl,-soname=linux-vdso.so.1 \ 91 + -Wl,-z,max-page-size=4096 \ 92 + -Wl,-z,common-page-size=4096 93 + 94 + vobjx32s-y := $(vobj64s:.o=-x32.o) 95 + vobjx32s := $(foreach F,$(vobjx32s-y),$(obj)/$F) 96 + 97 + # Convert 64bit object file to x32 for x32 vDSO. 98 + quiet_cmd_x32 = X32 $@ 99 + cmd_x32 = $(OBJCOPY) -O elf32-x86-64 $< $@ 100 + 101 + $(obj)/%-x32.o: $(obj)/%.o FORCE 102 + $(call if_changed,x32) 103 + 104 + targets += vdsox32.so vdsox32.so.dbg vdsox32.lds $(vobjx32s-y) 105 + 106 + $(obj)/vdsox32.o: $(src)/vdsox32.S $(obj)/vdsox32.so 107 + 108 + $(obj)/vdsox32.so.dbg: $(src)/vdsox32.lds $(vobjx32s) FORCE 109 + $(call if_changed,vdso) 82 110 83 111 # 84 112 # Build multiple 32-bit vDSO images to choose from at boot time.
+5
arch/x86/vdso/vdso32-setup.c
··· 311 311 int ret = 0; 312 312 bool compat; 313 313 314 + #ifdef CONFIG_X86_X32_ABI 315 + if (test_thread_flag(TIF_X32)) 316 + return x32_setup_additional_pages(bprm, uses_interp); 317 + #endif 318 + 314 319 if (vdso_enabled == VDSO_DISABLED) 315 320 return 0; 316 321
+22
arch/x86/vdso/vdsox32.S
··· 1 + #include <asm/page_types.h> 2 + #include <linux/linkage.h> 3 + #include <linux/init.h> 4 + 5 + __PAGE_ALIGNED_DATA 6 + 7 + .globl vdsox32_start, vdsox32_end 8 + .align PAGE_SIZE 9 + vdsox32_start: 10 + .incbin "arch/x86/vdso/vdsox32.so" 11 + vdsox32_end: 12 + .align PAGE_SIZE /* extra data here leaks to userspace. */ 13 + 14 + .previous 15 + 16 + .globl vdsox32_pages 17 + .bss 18 + .align 8 19 + .type vdsox32_pages, @object 20 + vdsox32_pages: 21 + .zero (vdsox32_end - vdsox32_start + PAGE_SIZE - 1) / PAGE_SIZE * 8 22 + .size vdsox32_pages, .-vdsox32_pages
+28
arch/x86/vdso/vdsox32.lds.S
··· 1 + /* 2 + * Linker script for x32 vDSO. 3 + * We #include the file to define the layout details. 4 + * Here we only choose the prelinked virtual address. 5 + * 6 + * This file defines the version script giving the user-exported symbols in 7 + * the DSO. We can define local symbols here called VDSO* to make their 8 + * values visible using the asm-x86/vdso.h macros from the kernel proper. 9 + */ 10 + 11 + #define VDSO_PRELINK 0 12 + #include "vdso-layout.lds.S" 13 + 14 + /* 15 + * This controls what userland symbols we export from the vDSO. 16 + */ 17 + VERSION { 18 + LINUX_2.6 { 19 + global: 20 + __vdso_clock_gettime; 21 + __vdso_gettimeofday; 22 + __vdso_getcpu; 23 + __vdso_time; 24 + local: *; 25 + }; 26 + } 27 + 28 + VDSOX32_PRELINK = VDSO_PRELINK;
+70 -8
arch/x86/vdso/vma.c
··· 24 24 extern struct page *vdso_pages[]; 25 25 static unsigned vdso_size; 26 26 27 - static void __init patch_vdso(void *vdso, size_t len) 27 + #ifdef CONFIG_X86_X32_ABI 28 + extern char vdsox32_start[], vdsox32_end[]; 29 + extern struct page *vdsox32_pages[]; 30 + static unsigned vdsox32_size; 31 + 32 + static void __init patch_vdsox32(void *vdso, size_t len) 33 + { 34 + Elf32_Ehdr *hdr = vdso; 35 + Elf32_Shdr *sechdrs, *alt_sec = 0; 36 + char *secstrings; 37 + void *alt_data; 38 + int i; 39 + 40 + BUG_ON(len < sizeof(Elf32_Ehdr)); 41 + BUG_ON(memcmp(hdr->e_ident, ELFMAG, SELFMAG) != 0); 42 + 43 + sechdrs = (void *)hdr + hdr->e_shoff; 44 + secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; 45 + 46 + for (i = 1; i < hdr->e_shnum; i++) { 47 + Elf32_Shdr *shdr = &sechdrs[i]; 48 + if (!strcmp(secstrings + shdr->sh_name, ".altinstructions")) { 49 + alt_sec = shdr; 50 + goto found; 51 + } 52 + } 53 + 54 + /* If we get here, it's probably a bug. */ 55 + pr_warning("patch_vdsox32: .altinstructions not found\n"); 56 + return; /* nothing to patch */ 57 + 58 + found: 59 + alt_data = (void *)hdr + alt_sec->sh_offset; 60 + apply_alternatives(alt_data, alt_data + alt_sec->sh_size); 61 + } 62 + #endif 63 + 64 + static void __init patch_vdso64(void *vdso, size_t len) 28 65 { 29 66 Elf64_Ehdr *hdr = vdso; 30 67 Elf64_Shdr *sechdrs, *alt_sec = 0; ··· 84 47 } 85 48 86 49 /* If we get here, it's probably a bug. */ 87 - pr_warning("patch_vdso: .altinstructions not found\n"); 50 + pr_warning("patch_vdso64: .altinstructions not found\n"); 88 51 return; /* nothing to patch */ 89 52 90 53 found: ··· 97 60 int npages = (vdso_end - vdso_start + PAGE_SIZE - 1) / PAGE_SIZE; 98 61 int i; 99 62 100 - patch_vdso(vdso_start, vdso_end - vdso_start); 63 + patch_vdso64(vdso_start, vdso_end - vdso_start); 101 64 102 65 vdso_size = npages << PAGE_SHIFT; 103 66 for (i = 0; i < npages; i++) 104 67 vdso_pages[i] = virt_to_page(vdso_start + i*PAGE_SIZE); 68 + 69 + #ifdef CONFIG_X86_X32_ABI 70 + patch_vdsox32(vdsox32_start, vdsox32_end - vdsox32_start); 71 + npages = (vdsox32_end - vdsox32_start + PAGE_SIZE - 1) / PAGE_SIZE; 72 + vdsox32_size = npages << PAGE_SHIFT; 73 + for (i = 0; i < npages; i++) 74 + vdsox32_pages[i] = virt_to_page(vdsox32_start + i*PAGE_SIZE); 75 + #endif 105 76 106 77 return 0; 107 78 } ··· 148 103 149 104 /* Setup a VMA at program startup for the vsyscall page. 150 105 Not called for compat tasks */ 151 - int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) 106 + static int setup_additional_pages(struct linux_binprm *bprm, 107 + int uses_interp, 108 + struct page **pages, 109 + unsigned size) 152 110 { 153 111 struct mm_struct *mm = current->mm; 154 112 unsigned long addr; ··· 161 113 return 0; 162 114 163 115 down_write(&mm->mmap_sem); 164 - addr = vdso_addr(mm->start_stack, vdso_size); 165 - addr = get_unmapped_area(NULL, addr, vdso_size, 0, 0); 116 + addr = vdso_addr(mm->start_stack, size); 117 + addr = get_unmapped_area(NULL, addr, size, 0, 0); 166 118 if (IS_ERR_VALUE(addr)) { 167 119 ret = addr; 168 120 goto up_fail; ··· 170 122 171 123 current->mm->context.vdso = (void *)addr; 172 124 173 - ret = install_special_mapping(mm, addr, vdso_size, 125 + ret = install_special_mapping(mm, addr, size, 174 126 VM_READ|VM_EXEC| 175 127 VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC, 176 - vdso_pages); 128 + pages); 177 129 if (ret) { 178 130 current->mm->context.vdso = NULL; 179 131 goto up_fail; ··· 183 135 up_write(&mm->mmap_sem); 184 136 return ret; 185 137 } 138 + 139 + int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) 140 + { 141 + return setup_additional_pages(bprm, uses_interp, vdso_pages, 142 + vdso_size); 143 + } 144 + 145 + #ifdef CONFIG_X86_X32_ABI 146 + int x32_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) 147 + { 148 + return setup_additional_pages(bprm, uses_interp, vdsox32_pages, 149 + vdsox32_size); 150 + } 151 + #endif 186 152 187 153 static __init int vdso_setup(char *s) 188 154 {
+7 -90
arch/xtensa/include/asm/posix_types.h
··· 19 19 * assume GCC is being used. 20 20 */ 21 21 22 - typedef unsigned long __kernel_ino_t; 23 - typedef unsigned int __kernel_mode_t; 24 - typedef unsigned long __kernel_nlink_t; 25 - typedef long __kernel_off_t; 26 - typedef int __kernel_pid_t; 27 22 typedef unsigned short __kernel_ipc_pid_t; 28 - typedef unsigned int __kernel_uid_t; 29 - typedef unsigned int __kernel_gid_t; 23 + #define __kernel_ipc_pid_t __kernel_ipc_pid_t 24 + 30 25 typedef unsigned int __kernel_size_t; 31 26 typedef int __kernel_ssize_t; 32 27 typedef long __kernel_ptrdiff_t; 33 - typedef long __kernel_time_t; 34 - typedef long __kernel_suseconds_t; 35 - typedef long __kernel_clock_t; 36 - typedef int __kernel_timer_t; 37 - typedef int __kernel_clockid_t; 38 - typedef int __kernel_daddr_t; 39 - typedef char * __kernel_caddr_t; 40 - typedef unsigned short __kernel_uid16_t; 41 - typedef unsigned short __kernel_gid16_t; 42 - typedef unsigned int __kernel_uid32_t; 43 - typedef unsigned int __kernel_gid32_t; 28 + #define __kernel_size_t __kernel_size_t 44 29 45 30 typedef unsigned short __kernel_old_uid_t; 46 31 typedef unsigned short __kernel_old_gid_t; 32 + #define __kernel_old_uid_t __kernel_old_uid_t 33 + 47 34 typedef unsigned short __kernel_old_dev_t; 35 + #define __kernel_old_dev_t __kernel_old_dev_t 48 36 49 - #ifdef __GNUC__ 50 - typedef long long __kernel_loff_t; 51 - #endif 37 + #include <asm-generic/posix_types.h> 52 38 53 - typedef struct { 54 - int val[2]; 55 - } __kernel_fsid_t; 56 - 57 - #ifndef __GNUC__ 58 - 59 - #define __FD_SET(d, set) ((set)->fds_bits[__FDELT(d)] |= __FDMASK(d)) 60 - #define __FD_CLR(d, set) ((set)->fds_bits[__FDELT(d)] &= ~__FDMASK(d)) 61 - #define __FD_ISSET(d, set) (!!((set)->fds_bits[__FDELT(d)] & __FDMASK(d))) 62 - #define __FD_ZERO(set) \ 63 - ((void) memset ((void *) (set), 0, sizeof (__kernel_fd_set))) 64 - 65 - #else /* __GNUC__ */ 66 - 67 - #if defined(__KERNEL__) 68 - /* With GNU C, use inline functions instead so args are evaluated only once: */ 69 - 70 - #undef __FD_SET 71 - static __inline__ void __FD_SET(unsigned long fd, __kernel_fd_set *fdsetp) 72 - { 73 - unsigned long _tmp = fd / __NFDBITS; 74 - unsigned long _rem = fd % __NFDBITS; 75 - fdsetp->fds_bits[_tmp] |= (1UL<<_rem); 76 - } 77 - 78 - #undef __FD_CLR 79 - static __inline__ void __FD_CLR(unsigned long fd, __kernel_fd_set *fdsetp) 80 - { 81 - unsigned long _tmp = fd / __NFDBITS; 82 - unsigned long _rem = fd % __NFDBITS; 83 - fdsetp->fds_bits[_tmp] &= ~(1UL<<_rem); 84 - } 85 - 86 - #undef __FD_ISSET 87 - static __inline__ int __FD_ISSET(unsigned long fd, __kernel_fd_set *p) 88 - { 89 - unsigned long _tmp = fd / __NFDBITS; 90 - unsigned long _rem = fd % __NFDBITS; 91 - return (p->fds_bits[_tmp] & (1UL<<_rem)) != 0; 92 - } 93 - 94 - /* 95 - * This will unroll the loop for the normal constant case (8 ints, 96 - * for a 256-bit fd_set) 97 - */ 98 - #undef __FD_ZERO 99 - static __inline__ void __FD_ZERO(__kernel_fd_set *p) 100 - { 101 - unsigned int *tmp = (unsigned int *)p->fds_bits; 102 - int i; 103 - 104 - if (__builtin_constant_p(__FDSET_LONGS)) { 105 - switch (__FDSET_LONGS) { 106 - case 8: 107 - tmp[0] = 0; tmp[1] = 0; tmp[2] = 0; tmp[3] = 0; 108 - tmp[4] = 0; tmp[5] = 0; tmp[6] = 0; tmp[7] = 0; 109 - return; 110 - } 111 - } 112 - i = __FDSET_LONGS; 113 - while (i) { 114 - i--; 115 - *tmp = 0; 116 - tmp++; 117 - } 118 - } 119 - 120 - #endif /* defined(__KERNEL__) */ 121 - #endif /* __GNUC__ */ 122 39 #endif /* _XTENSA_POSIX_TYPES_H */
+1 -4
drivers/char/lp.c
··· 705 705 { 706 706 unsigned int minor; 707 707 struct timeval par_timeout; 708 - struct compat_timeval __user *tc; 709 708 int ret; 710 709 711 710 minor = iminor(file->f_path.dentry->d_inode); 712 711 mutex_lock(&lp_mutex); 713 712 switch (cmd) { 714 713 case LPSETTIMEOUT: 715 - tc = compat_ptr(arg); 716 - if (get_user(par_timeout.tv_sec, &tc->tv_sec) || 717 - get_user(par_timeout.tv_usec, &tc->tv_usec)) { 714 + if (compat_get_timeval(&par_timeout, compat_ptr(arg))) { 718 715 ret = -EFAULT; 719 716 break; 720 717 }
+2 -2
drivers/input/input-compat.c
··· 17 17 int input_event_from_user(const char __user *buffer, 18 18 struct input_event *event) 19 19 { 20 - if (INPUT_COMPAT_TEST) { 20 + if (INPUT_COMPAT_TEST && !COMPAT_USE_64BIT_TIME) { 21 21 struct input_event_compat compat_event; 22 22 23 23 if (copy_from_user(&compat_event, buffer, ··· 41 41 int input_event_to_user(char __user *buffer, 42 42 const struct input_event *event) 43 43 { 44 - if (INPUT_COMPAT_TEST) { 44 + if (INPUT_COMPAT_TEST && !COMPAT_USE_64BIT_TIME) { 45 45 struct input_event_compat compat_event; 46 46 47 47 compat_event.time.tv_sec = event->time.tv_sec;
+1 -1
drivers/input/input-compat.h
··· 67 67 68 68 static inline size_t input_event_size(void) 69 69 { 70 - return INPUT_COMPAT_TEST ? 70 + return (INPUT_COMPAT_TEST && !COMPAT_USE_64BIT_TIME) ? 71 71 sizeof(struct input_event_compat) : sizeof(struct input_event); 72 72 } 73 73
+6 -7
drivers/staging/android/binder.c
··· 381 381 382 382 repeat: 383 383 fdt = files_fdtable(files); 384 - fd = find_next_zero_bit(fdt->open_fds->fds_bits, fdt->max_fds, 385 - files->next_fd); 384 + fd = find_next_zero_bit(fdt->open_fds, fdt->max_fds, files->next_fd); 386 385 387 386 /* 388 387 * N.B. For clone tasks sharing a files structure, this test ··· 409 410 goto repeat; 410 411 } 411 412 412 - FD_SET(fd, fdt->open_fds); 413 + __set_open_fd(fd, fdt); 413 414 if (flags & O_CLOEXEC) 414 - FD_SET(fd, fdt->close_on_exec); 415 + __set_close_on_exec(fd, fdt); 415 416 else 416 - FD_CLR(fd, fdt->close_on_exec); 417 + __clear_close_on_exec(fd, fdt); 417 418 files->next_fd = fd + 1; 418 419 #if 1 419 420 /* Sanity check */ ··· 454 455 static void __put_unused_fd(struct files_struct *files, unsigned int fd) 455 456 { 456 457 struct fdtable *fdt = files_fdtable(files); 457 - __FD_CLR(fd, fdt->open_fds); 458 + __clear_open_fd(fd, fdt); 458 459 if (fd < files->next_fd) 459 460 files->next_fd = fd; 460 461 } ··· 480 481 if (!filp) 481 482 goto out_unlock; 482 483 rcu_assign_pointer(fdt->fd[fd], NULL); 483 - FD_CLR(fd, fdt->close_on_exec); 484 + __clear_close_on_exec(fd, fdt); 484 485 __put_unused_fd(files, fd); 485 486 spin_unlock(&files->file_lock); 486 487 retval = filp_close(filp, files);
+1 -1
fs/autofs4/dev-ioctl.c
··· 230 230 fdt = files_fdtable(files); 231 231 BUG_ON(fdt->fd[fd] != NULL); 232 232 rcu_assign_pointer(fdt->fd[fd], file); 233 - FD_SET(fd, fdt->close_on_exec); 233 + __set_close_on_exec(fd, fdt); 234 234 spin_unlock(&files->file_lock); 235 235 } 236 236
+20 -4
fs/binfmt_elf.c
··· 1415 1415 regset->writeback(task, regset, 1); 1416 1416 } 1417 1417 1418 + #ifndef PR_REG_SIZE 1419 + #define PR_REG_SIZE(S) sizeof(S) 1420 + #endif 1421 + 1422 + #ifndef PRSTATUS_SIZE 1423 + #define PRSTATUS_SIZE(S) sizeof(S) 1424 + #endif 1425 + 1426 + #ifndef PR_REG_PTR 1427 + #define PR_REG_PTR(S) (&((S)->pr_reg)) 1428 + #endif 1429 + 1430 + #ifndef SET_PR_FPVALID 1431 + #define SET_PR_FPVALID(S, V) ((S)->pr_fpvalid = (V)) 1432 + #endif 1433 + 1418 1434 static int fill_thread_core_info(struct elf_thread_core_info *t, 1419 1435 const struct user_regset_view *view, 1420 1436 long signr, size_t *total) ··· 1445 1429 */ 1446 1430 fill_prstatus(&t->prstatus, t->task, signr); 1447 1431 (void) view->regsets[0].get(t->task, &view->regsets[0], 1448 - 0, sizeof(t->prstatus.pr_reg), 1449 - &t->prstatus.pr_reg, NULL); 1432 + 0, PR_REG_SIZE(t->prstatus.pr_reg), 1433 + PR_REG_PTR(&t->prstatus), NULL); 1450 1434 1451 1435 fill_note(&t->notes[0], "CORE", NT_PRSTATUS, 1452 - sizeof(t->prstatus), &t->prstatus); 1436 + PRSTATUS_SIZE(t->prstatus), &t->prstatus); 1453 1437 *total += notesize(&t->notes[0]); 1454 1438 1455 1439 do_thread_regset_writeback(t->task, &view->regsets[0]); ··· 1479 1463 regset->core_note_type, 1480 1464 size, data); 1481 1465 else { 1482 - t->prstatus.pr_fpvalid = 1; 1466 + SET_PR_FPVALID(&t->prstatus, 1); 1483 1467 fill_note(&t->notes[i], "CORE", 1484 1468 NT_PRFPREG, size, data); 1485 1469 }
+20 -6
fs/compat.c
··· 1170 1170 } 1171 1171 1172 1172 asmlinkage ssize_t 1173 - compat_sys_preadv(unsigned long fd, const struct compat_iovec __user *vec, 1174 - unsigned long vlen, u32 pos_low, u32 pos_high) 1173 + compat_sys_preadv64(unsigned long fd, const struct compat_iovec __user *vec, 1174 + unsigned long vlen, loff_t pos) 1175 1175 { 1176 - loff_t pos = ((loff_t)pos_high << 32) | pos_low; 1177 1176 struct file *file; 1178 1177 int fput_needed; 1179 1178 ssize_t ret; ··· 1187 1188 ret = compat_readv(file, vec, vlen, &pos); 1188 1189 fput_light(file, fput_needed); 1189 1190 return ret; 1191 + } 1192 + 1193 + asmlinkage ssize_t 1194 + compat_sys_preadv(unsigned long fd, const struct compat_iovec __user *vec, 1195 + unsigned long vlen, u32 pos_low, u32 pos_high) 1196 + { 1197 + loff_t pos = ((loff_t)pos_high << 32) | pos_low; 1198 + return compat_sys_preadv64(fd, vec, vlen, pos); 1190 1199 } 1191 1200 1192 1201 static size_t compat_writev(struct file *file, ··· 1236 1229 } 1237 1230 1238 1231 asmlinkage ssize_t 1239 - compat_sys_pwritev(unsigned long fd, const struct compat_iovec __user *vec, 1240 - unsigned long vlen, u32 pos_low, u32 pos_high) 1232 + compat_sys_pwritev64(unsigned long fd, const struct compat_iovec __user *vec, 1233 + unsigned long vlen, loff_t pos) 1241 1234 { 1242 - loff_t pos = ((loff_t)pos_high << 32) | pos_low; 1243 1235 struct file *file; 1244 1236 int fput_needed; 1245 1237 ssize_t ret; ··· 1253 1247 ret = compat_writev(file, vec, vlen, &pos); 1254 1248 fput_light(file, fput_needed); 1255 1249 return ret; 1250 + } 1251 + 1252 + asmlinkage ssize_t 1253 + compat_sys_pwritev(unsigned long fd, const struct compat_iovec __user *vec, 1254 + unsigned long vlen, u32 pos_low, u32 pos_high) 1255 + { 1256 + loff_t pos = ((loff_t)pos_high << 32) | pos_low; 1257 + return compat_sys_pwritev64(fd, vec, vlen, pos); 1256 1258 } 1257 1259 1258 1260 asmlinkage long
+4 -4
fs/exec.c
··· 1028 1028 fdt = files_fdtable(files); 1029 1029 if (i >= fdt->max_fds) 1030 1030 break; 1031 - set = fdt->close_on_exec->fds_bits[j]; 1031 + set = fdt->close_on_exec[j]; 1032 1032 if (!set) 1033 1033 continue; 1034 - fdt->close_on_exec->fds_bits[j] = 0; 1034 + fdt->close_on_exec[j] = 0; 1035 1035 spin_unlock(&files->file_lock); 1036 1036 for ( ; set ; i++,set >>= 1) { 1037 1037 if (set & 1) { ··· 2067 2067 fd_install(0, rp); 2068 2068 spin_lock(&cf->file_lock); 2069 2069 fdt = files_fdtable(cf); 2070 - FD_SET(0, fdt->open_fds); 2071 - FD_CLR(0, fdt->close_on_exec); 2070 + __set_open_fd(0, fdt); 2071 + __clear_close_on_exec(0, fdt); 2072 2072 spin_unlock(&cf->file_lock); 2073 2073 2074 2074 /* and disallow core files too */
+9 -9
fs/fcntl.c
··· 32 32 spin_lock(&files->file_lock); 33 33 fdt = files_fdtable(files); 34 34 if (flag) 35 - FD_SET(fd, fdt->close_on_exec); 35 + __set_close_on_exec(fd, fdt); 36 36 else 37 - FD_CLR(fd, fdt->close_on_exec); 37 + __clear_close_on_exec(fd, fdt); 38 38 spin_unlock(&files->file_lock); 39 39 } 40 40 41 - static int get_close_on_exec(unsigned int fd) 41 + static bool get_close_on_exec(unsigned int fd) 42 42 { 43 43 struct files_struct *files = current->files; 44 44 struct fdtable *fdt; 45 - int res; 45 + bool res; 46 46 rcu_read_lock(); 47 47 fdt = files_fdtable(files); 48 - res = FD_ISSET(fd, fdt->close_on_exec); 48 + res = close_on_exec(fd, fdt); 49 49 rcu_read_unlock(); 50 50 return res; 51 51 } ··· 90 90 err = -EBUSY; 91 91 fdt = files_fdtable(files); 92 92 tofree = fdt->fd[newfd]; 93 - if (!tofree && FD_ISSET(newfd, fdt->open_fds)) 93 + if (!tofree && fd_is_open(newfd, fdt)) 94 94 goto out_unlock; 95 95 get_file(file); 96 96 rcu_assign_pointer(fdt->fd[newfd], file); 97 - FD_SET(newfd, fdt->open_fds); 97 + __set_open_fd(newfd, fdt); 98 98 if (flags & O_CLOEXEC) 99 - FD_SET(newfd, fdt->close_on_exec); 99 + __set_close_on_exec(newfd, fdt); 100 100 else 101 - FD_CLR(newfd, fdt->close_on_exec); 101 + __clear_close_on_exec(newfd, fdt); 102 102 spin_unlock(&files->file_lock); 103 103 104 104 if (tofree)
+25 -27
fs/file.c
··· 40 40 */ 41 41 static DEFINE_PER_CPU(struct fdtable_defer, fdtable_defer_list); 42 42 43 - static void *alloc_fdmem(unsigned int size) 43 + static void *alloc_fdmem(size_t size) 44 44 { 45 45 /* 46 46 * Very large allocations can stress page reclaim, so fall back to ··· 142 142 static struct fdtable * alloc_fdtable(unsigned int nr) 143 143 { 144 144 struct fdtable *fdt; 145 - char *data; 145 + void *data; 146 146 147 147 /* 148 148 * Figure out how many fds we actually want to support in this fdtable. ··· 172 172 data = alloc_fdmem(nr * sizeof(struct file *)); 173 173 if (!data) 174 174 goto out_fdt; 175 - fdt->fd = (struct file **)data; 176 - data = alloc_fdmem(max_t(unsigned int, 175 + fdt->fd = data; 176 + 177 + data = alloc_fdmem(max_t(size_t, 177 178 2 * nr / BITS_PER_BYTE, L1_CACHE_BYTES)); 178 179 if (!data) 179 180 goto out_arr; 180 - fdt->open_fds = (fd_set *)data; 181 + fdt->open_fds = data; 181 182 data += nr / BITS_PER_BYTE; 182 - fdt->close_on_exec = (fd_set *)data; 183 + fdt->close_on_exec = data; 183 184 fdt->next = NULL; 184 185 185 186 return fdt; ··· 276 275 int i; 277 276 278 277 /* Find the last open fd */ 279 - for (i = size/(8*sizeof(long)); i > 0; ) { 280 - if (fdt->open_fds->fds_bits[--i]) 278 + for (i = size / BITS_PER_LONG; i > 0; ) { 279 + if (fdt->open_fds[--i]) 281 280 break; 282 281 } 283 - i = (i+1) * 8 * sizeof(long); 282 + i = (i + 1) * BITS_PER_LONG; 284 283 return i; 285 284 } 286 285 ··· 307 306 newf->next_fd = 0; 308 307 new_fdt = &newf->fdtab; 309 308 new_fdt->max_fds = NR_OPEN_DEFAULT; 310 - new_fdt->close_on_exec = (fd_set *)&newf->close_on_exec_init; 311 - new_fdt->open_fds = (fd_set *)&newf->open_fds_init; 309 + new_fdt->close_on_exec = newf->close_on_exec_init; 310 + new_fdt->open_fds = newf->open_fds_init; 312 311 new_fdt->fd = &newf->fd_array[0]; 313 312 new_fdt->next = NULL; 314 313 ··· 351 350 old_fds = old_fdt->fd; 352 351 new_fds = new_fdt->fd; 353 352 354 - memcpy(new_fdt->open_fds->fds_bits, 355 - old_fdt->open_fds->fds_bits, open_files/8); 356 - memcpy(new_fdt->close_on_exec->fds_bits, 357 - old_fdt->close_on_exec->fds_bits, open_files/8); 353 + memcpy(new_fdt->open_fds, old_fdt->open_fds, open_files / 8); 354 + memcpy(new_fdt->close_on_exec, old_fdt->close_on_exec, open_files / 8); 358 355 359 356 for (i = open_files; i != 0; i--) { 360 357 struct file *f = *old_fds++; ··· 365 366 * is partway through open(). So make sure that this 366 367 * fd is available to the new process. 367 368 */ 368 - FD_CLR(open_files - i, new_fdt->open_fds); 369 + __clear_open_fd(open_files - i, new_fdt); 369 370 } 370 371 rcu_assign_pointer(*new_fds++, f); 371 372 } ··· 378 379 memset(new_fds, 0, size); 379 380 380 381 if (new_fdt->max_fds > open_files) { 381 - int left = (new_fdt->max_fds-open_files)/8; 382 - int start = open_files / (8 * sizeof(unsigned long)); 382 + int left = (new_fdt->max_fds - open_files) / 8; 383 + int start = open_files / BITS_PER_LONG; 383 384 384 - memset(&new_fdt->open_fds->fds_bits[start], 0, left); 385 - memset(&new_fdt->close_on_exec->fds_bits[start], 0, left); 385 + memset(&new_fdt->open_fds[start], 0, left); 386 + memset(&new_fdt->close_on_exec[start], 0, left); 386 387 } 387 388 388 389 rcu_assign_pointer(newf->fdt, new_fdt); ··· 418 419 .fdtab = { 419 420 .max_fds = NR_OPEN_DEFAULT, 420 421 .fd = &init_files.fd_array[0], 421 - .close_on_exec = (fd_set *)&init_files.close_on_exec_init, 422 - .open_fds = (fd_set *)&init_files.open_fds_init, 422 + .close_on_exec = init_files.close_on_exec_init, 423 + .open_fds = init_files.open_fds_init, 423 424 }, 424 425 .file_lock = __SPIN_LOCK_UNLOCKED(init_task.file_lock), 425 426 }; ··· 442 443 fd = files->next_fd; 443 444 444 445 if (fd < fdt->max_fds) 445 - fd = find_next_zero_bit(fdt->open_fds->fds_bits, 446 - fdt->max_fds, fd); 446 + fd = find_next_zero_bit(fdt->open_fds, fdt->max_fds, fd); 447 447 448 448 error = expand_files(files, fd); 449 449 if (error < 0) ··· 458 460 if (start <= files->next_fd) 459 461 files->next_fd = fd + 1; 460 462 461 - FD_SET(fd, fdt->open_fds); 463 + __set_open_fd(fd, fdt); 462 464 if (flags & O_CLOEXEC) 463 - FD_SET(fd, fdt->close_on_exec); 465 + __set_close_on_exec(fd, fdt); 464 466 else 465 - FD_CLR(fd, fdt->close_on_exec); 467 + __clear_close_on_exec(fd, fdt); 466 468 error = fd; 467 469 #if 1 468 470 /* Sanity check */
+2 -2
fs/open.c
··· 836 836 static void __put_unused_fd(struct files_struct *files, unsigned int fd) 837 837 { 838 838 struct fdtable *fdt = files_fdtable(files); 839 - __FD_CLR(fd, fdt->open_fds); 839 + __clear_open_fd(fd, fdt); 840 840 if (fd < files->next_fd) 841 841 files->next_fd = fd; 842 842 } ··· 1080 1080 if (!filp) 1081 1081 goto out_unlock; 1082 1082 rcu_assign_pointer(fdt->fd[fd], NULL); 1083 - FD_CLR(fd, fdt->close_on_exec); 1083 + __clear_close_on_exec(fd, fdt); 1084 1084 __put_unused_fd(files, fd); 1085 1085 spin_unlock(&files->file_lock); 1086 1086 retval = filp_close(filp, files);
+1 -1
fs/proc/base.c
··· 1753 1753 1754 1754 fdt = files_fdtable(files); 1755 1755 f_flags = file->f_flags & ~O_CLOEXEC; 1756 - if (FD_ISSET(fd, fdt->close_on_exec)) 1756 + if (close_on_exec(fd, fdt)) 1757 1757 f_flags |= O_CLOEXEC; 1758 1758 1759 1759 if (path) {
+1 -1
fs/select.c
··· 348 348 set = ~(~0UL << (n & (__NFDBITS-1))); 349 349 n /= __NFDBITS; 350 350 fdt = files_fdtable(current->files); 351 - open_fds = fdt->open_fds->fds_bits+n; 351 + open_fds = fdt->open_fds + n; 352 352 max = 0; 353 353 if (set) { 354 354 set &= BITS(fds, n);
+22 -87
include/asm-generic/posix_types.h
··· 10 10 * architectures, so that you can override them. 11 11 */ 12 12 13 + #ifndef __kernel_long_t 14 + typedef long __kernel_long_t; 15 + typedef unsigned long __kernel_ulong_t; 16 + #endif 17 + 13 18 #ifndef __kernel_ino_t 14 - typedef unsigned long __kernel_ino_t; 19 + typedef __kernel_ulong_t __kernel_ino_t; 15 20 #endif 16 21 17 22 #ifndef __kernel_mode_t ··· 24 19 #endif 25 20 26 21 #ifndef __kernel_nlink_t 27 - typedef unsigned long __kernel_nlink_t; 22 + typedef __kernel_ulong_t __kernel_nlink_t; 28 23 #endif 29 24 30 25 #ifndef __kernel_pid_t ··· 41 36 #endif 42 37 43 38 #ifndef __kernel_suseconds_t 44 - typedef long __kernel_suseconds_t; 39 + typedef __kernel_long_t __kernel_suseconds_t; 45 40 #endif 46 41 47 42 #ifndef __kernel_daddr_t ··· 49 44 #endif 50 45 51 46 #ifndef __kernel_uid32_t 52 - typedef __kernel_uid_t __kernel_uid32_t; 53 - typedef __kernel_gid_t __kernel_gid32_t; 47 + typedef unsigned int __kernel_uid32_t; 48 + typedef unsigned int __kernel_gid32_t; 54 49 #endif 55 50 56 51 #ifndef __kernel_old_uid_t ··· 72 67 typedef int __kernel_ssize_t; 73 68 typedef int __kernel_ptrdiff_t; 74 69 #else 75 - typedef unsigned long __kernel_size_t; 76 - typedef long __kernel_ssize_t; 77 - typedef long __kernel_ptrdiff_t; 70 + typedef __kernel_ulong_t __kernel_size_t; 71 + typedef __kernel_long_t __kernel_ssize_t; 72 + typedef __kernel_long_t __kernel_ptrdiff_t; 78 73 #endif 74 + #endif 75 + 76 + #ifndef __kernel_fsid_t 77 + typedef struct { 78 + int val[2]; 79 + } __kernel_fsid_t; 79 80 #endif 80 81 81 82 /* 82 83 * anything below here should be completely generic 83 84 */ 84 - typedef long __kernel_off_t; 85 + typedef __kernel_long_t __kernel_off_t; 85 86 typedef long long __kernel_loff_t; 86 - typedef long __kernel_time_t; 87 - typedef long __kernel_clock_t; 87 + typedef __kernel_long_t __kernel_time_t; 88 + typedef __kernel_long_t __kernel_clock_t; 88 89 typedef int __kernel_timer_t; 89 90 typedef int __kernel_clockid_t; 90 91 typedef char * __kernel_caddr_t; 91 92 typedef unsigned short __kernel_uid16_t; 92 93 typedef unsigned short __kernel_gid16_t; 93 - 94 - typedef struct { 95 - int val[2]; 96 - } __kernel_fsid_t; 97 - 98 - #ifdef __KERNEL__ 99 - 100 - #undef __FD_SET 101 - static inline void __FD_SET(unsigned long __fd, __kernel_fd_set *__fdsetp) 102 - { 103 - unsigned long __tmp = __fd / __NFDBITS; 104 - unsigned long __rem = __fd % __NFDBITS; 105 - __fdsetp->fds_bits[__tmp] |= (1UL<<__rem); 106 - } 107 - 108 - #undef __FD_CLR 109 - static inline void __FD_CLR(unsigned long __fd, __kernel_fd_set *__fdsetp) 110 - { 111 - unsigned long __tmp = __fd / __NFDBITS; 112 - unsigned long __rem = __fd % __NFDBITS; 113 - __fdsetp->fds_bits[__tmp] &= ~(1UL<<__rem); 114 - } 115 - 116 - #undef __FD_ISSET 117 - static inline int __FD_ISSET(unsigned long __fd, const __kernel_fd_set *__p) 118 - { 119 - unsigned long __tmp = __fd / __NFDBITS; 120 - unsigned long __rem = __fd % __NFDBITS; 121 - return (__p->fds_bits[__tmp] & (1UL<<__rem)) != 0; 122 - } 123 - 124 - /* 125 - * This will unroll the loop for the normal constant case (8 ints, 126 - * for a 256-bit fd_set) 127 - */ 128 - #undef __FD_ZERO 129 - static inline void __FD_ZERO(__kernel_fd_set *__p) 130 - { 131 - unsigned long *__tmp = __p->fds_bits; 132 - int __i; 133 - 134 - if (__builtin_constant_p(__FDSET_LONGS)) { 135 - switch (__FDSET_LONGS) { 136 - case 16: 137 - __tmp[ 0] = 0; __tmp[ 1] = 0; 138 - __tmp[ 2] = 0; __tmp[ 3] = 0; 139 - __tmp[ 4] = 0; __tmp[ 5] = 0; 140 - __tmp[ 6] = 0; __tmp[ 7] = 0; 141 - __tmp[ 8] = 0; __tmp[ 9] = 0; 142 - __tmp[10] = 0; __tmp[11] = 0; 143 - __tmp[12] = 0; __tmp[13] = 0; 144 - __tmp[14] = 0; __tmp[15] = 0; 145 - return; 146 - 147 - case 8: 148 - __tmp[ 0] = 0; __tmp[ 1] = 0; 149 - __tmp[ 2] = 0; __tmp[ 3] = 0; 150 - __tmp[ 4] = 0; __tmp[ 5] = 0; 151 - __tmp[ 6] = 0; __tmp[ 7] = 0; 152 - return; 153 - 154 - case 4: 155 - __tmp[ 0] = 0; __tmp[ 1] = 0; 156 - __tmp[ 2] = 0; __tmp[ 3] = 0; 157 - return; 158 - } 159 - } 160 - __i = __FDSET_LONGS; 161 - while (__i) { 162 - __i--; 163 - *__tmp = 0; 164 - __tmp++; 165 - } 166 - } 167 - 168 - #endif /* __KERNEL__ */ 169 94 170 95 #endif /* __ASM_GENERIC_POSIX_TYPES_H */
+1
include/linux/Kbuild
··· 357 357 header-y += swab.h 358 358 header-y += synclink.h 359 359 header-y += sysctl.h 360 + header-y += sysinfo.h 360 361 header-y += taskstats.h 361 362 header-y += tcp.h 362 363 header-y += telephony.h
+1 -1
include/linux/aio_abi.h
··· 30 30 #include <linux/types.h> 31 31 #include <asm/byteorder.h> 32 32 33 - typedef unsigned long aio_context_t; 33 + typedef __kernel_ulong_t aio_context_t; 34 34 35 35 enum { 36 36 IOCB_CMD_PREAD = 0,
+20
include/linux/compat.h
··· 19 19 #include <asm/siginfo.h> 20 20 #include <asm/signal.h> 21 21 22 + #ifndef COMPAT_USE_64BIT_TIME 23 + #define COMPAT_USE_64BIT_TIME 0 24 + #endif 25 + 22 26 #define compat_jiffies_to_clock_t(x) \ 23 27 (((unsigned long)(x) * COMPAT_USER_HZ) / HZ) 24 28 ··· 87 83 compat_sigset_word sig[_COMPAT_NSIG_WORDS]; 88 84 } compat_sigset_t; 89 85 86 + /* 87 + * These functions operate strictly on struct compat_time* 88 + */ 90 89 extern int get_compat_timespec(struct timespec *, 91 90 const struct compat_timespec __user *); 92 91 extern int put_compat_timespec(const struct timespec *, 93 92 struct compat_timespec __user *); 93 + extern int get_compat_timeval(struct timeval *, 94 + const struct compat_timeval __user *); 95 + extern int put_compat_timeval(const struct timeval *, 96 + struct compat_timeval __user *); 97 + /* 98 + * These functions operate on 32- or 64-bit specs depending on 99 + * COMPAT_USE_64BIT_TIME, hence the void user pointer arguments and the 100 + * naming as compat_get/put_ rather than get/put_compat_. 101 + */ 102 + extern int compat_get_timespec(struct timespec *, const void __user *); 103 + extern int compat_put_timespec(const struct timespec *, void __user *); 104 + extern int compat_get_timeval(struct timeval *, const void __user *); 105 + extern int compat_put_timeval(const struct timeval *, void __user *); 94 106 95 107 struct compat_iovec { 96 108 compat_uptr_t iov_base;
+34 -12
include/linux/fdtable.h
··· 21 21 */ 22 22 #define NR_OPEN_DEFAULT BITS_PER_LONG 23 23 24 - /* 25 - * The embedded_fd_set is a small fd_set, 26 - * suitable for most tasks (which open <= BITS_PER_LONG files) 27 - */ 28 - struct embedded_fd_set { 29 - unsigned long fds_bits[1]; 30 - }; 31 - 32 24 struct fdtable { 33 25 unsigned int max_fds; 34 26 struct file __rcu **fd; /* current fd array */ 35 - fd_set *close_on_exec; 36 - fd_set *open_fds; 27 + unsigned long *close_on_exec; 28 + unsigned long *open_fds; 37 29 struct rcu_head rcu; 38 30 struct fdtable *next; 39 31 }; 32 + 33 + static inline void __set_close_on_exec(int fd, struct fdtable *fdt) 34 + { 35 + __set_bit(fd, fdt->close_on_exec); 36 + } 37 + 38 + static inline void __clear_close_on_exec(int fd, struct fdtable *fdt) 39 + { 40 + __clear_bit(fd, fdt->close_on_exec); 41 + } 42 + 43 + static inline bool close_on_exec(int fd, const struct fdtable *fdt) 44 + { 45 + return test_bit(fd, fdt->close_on_exec); 46 + } 47 + 48 + static inline void __set_open_fd(int fd, struct fdtable *fdt) 49 + { 50 + __set_bit(fd, fdt->open_fds); 51 + } 52 + 53 + static inline void __clear_open_fd(int fd, struct fdtable *fdt) 54 + { 55 + __clear_bit(fd, fdt->open_fds); 56 + } 57 + 58 + static inline bool fd_is_open(int fd, const struct fdtable *fdt) 59 + { 60 + return test_bit(fd, fdt->open_fds); 61 + } 40 62 41 63 /* 42 64 * Open file table structure ··· 75 53 */ 76 54 spinlock_t file_lock ____cacheline_aligned_in_smp; 77 55 int next_fd; 78 - struct embedded_fd_set close_on_exec_init; 79 - struct embedded_fd_set open_fds_init; 56 + unsigned long close_on_exec_init[1]; 57 + unsigned long open_fds_init[1]; 80 58 struct file __rcu * fd_array[NR_OPEN_DEFAULT]; 81 59 }; 82 60
+2 -19
include/linux/kernel.h
··· 1 1 #ifndef _LINUX_KERNEL_H 2 2 #define _LINUX_KERNEL_H 3 3 4 + #include <linux/sysinfo.h> 5 + 4 6 /* 5 7 * 'kernel.h' contains some often-used function prototypes etc 6 8 */ ··· 700 698 # define REBUILD_DUE_TO_FTRACE_MCOUNT_RECORD 701 699 #endif 702 700 703 - struct sysinfo; 704 701 extern int do_sysinfo(struct sysinfo *info); 705 702 706 703 #endif /* __KERNEL__ */ 707 - 708 - #define SI_LOAD_SHIFT 16 709 - struct sysinfo { 710 - long uptime; /* Seconds since boot */ 711 - unsigned long loads[3]; /* 1, 5, and 15 minute load averages */ 712 - unsigned long totalram; /* Total usable main memory size */ 713 - unsigned long freeram; /* Available memory size */ 714 - unsigned long sharedram; /* Amount of shared memory */ 715 - unsigned long bufferram; /* Memory used by buffers */ 716 - unsigned long totalswap; /* Total swap space size */ 717 - unsigned long freeswap; /* swap space still available */ 718 - unsigned short procs; /* Number of current processes */ 719 - unsigned short pad; /* explicit padding for m68k */ 720 - unsigned long totalhigh; /* Total high memory size */ 721 - unsigned long freehigh; /* Available high memory size */ 722 - unsigned int mem_unit; /* Memory unit size in bytes */ 723 - char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding: libc5 uses this.. */ 724 - }; 725 704 726 705 #endif
+24
include/linux/sysinfo.h
··· 1 + #ifndef _LINUX_SYSINFO_H 2 + #define _LINUX_SYSINFO_H 3 + 4 + #include <linux/types.h> 5 + 6 + #define SI_LOAD_SHIFT 16 7 + struct sysinfo { 8 + __kernel_long_t uptime; /* Seconds since boot */ 9 + __kernel_ulong_t loads[3]; /* 1, 5, and 15 minute load averages */ 10 + __kernel_ulong_t totalram; /* Total usable main memory size */ 11 + __kernel_ulong_t freeram; /* Available memory size */ 12 + __kernel_ulong_t sharedram; /* Amount of shared memory */ 13 + __kernel_ulong_t bufferram; /* Memory used by buffers */ 14 + __kernel_ulong_t totalswap; /* Total swap space size */ 15 + __kernel_ulong_t freeswap; /* swap space still available */ 16 + __u16 procs; /* Number of current processes */ 17 + __u16 pad; /* Explicit padding for m68k */ 18 + __kernel_ulong_t totalhigh; /* Total high memory size */ 19 + __kernel_ulong_t freehigh; /* Available high memory size */ 20 + __u32 mem_unit; /* Memory unit size in bytes */ 21 + char _f[20-2*sizeof(__kernel_ulong_t)-sizeof(__u32)]; /* Padding: libc5 uses this.. */ 22 + }; 23 + 24 + #endif /* _LINUX_SYSINFO_H */
+1
include/linux/time.h
··· 255 255 a->tv_sec += __iter_div_u64_rem(a->tv_nsec + ns, NSEC_PER_SEC, &ns); 256 256 a->tv_nsec = ns; 257 257 } 258 + 258 259 #endif /* __KERNEL__ */ 259 260 260 261 #define NFDBITS __NFDBITS
+60 -8
kernel/compat.c
··· 31 31 #include <asm/uaccess.h> 32 32 33 33 /* 34 - * Note that the native side is already converted to a timespec, because 35 - * that's what we want anyway. 34 + * Get/set struct timeval with struct timespec on the native side 36 35 */ 37 - static int compat_get_timeval(struct timespec *o, 38 - struct compat_timeval __user *i) 36 + static int compat_get_timeval_convert(struct timespec *o, 37 + struct compat_timeval __user *i) 39 38 { 40 39 long usec; 41 40 ··· 45 46 return 0; 46 47 } 47 48 48 - static int compat_put_timeval(struct compat_timeval __user *o, 49 - struct timeval *i) 49 + static int compat_put_timeval_convert(struct compat_timeval __user *o, 50 + struct timeval *i) 50 51 { 51 52 return (put_user(i->tv_sec, &o->tv_sec) || 52 53 put_user(i->tv_usec, &o->tv_usec)) ? -EFAULT : 0; ··· 116 117 if (tv) { 117 118 struct timeval ktv; 118 119 do_gettimeofday(&ktv); 119 - if (compat_put_timeval(tv, &ktv)) 120 + if (compat_put_timeval_convert(tv, &ktv)) 120 121 return -EFAULT; 121 122 } 122 123 if (tz) { ··· 134 135 struct timezone ktz; 135 136 136 137 if (tv) { 137 - if (compat_get_timeval(&kts, tv)) 138 + if (compat_get_timeval_convert(&kts, tv)) 138 139 return -EFAULT; 139 140 } 140 141 if (tz) { ··· 145 146 return do_sys_settimeofday(tv ? &kts : NULL, tz ? &ktz : NULL); 146 147 } 147 148 149 + int get_compat_timeval(struct timeval *tv, const struct compat_timeval __user *ctv) 150 + { 151 + return (!access_ok(VERIFY_READ, ctv, sizeof(*ctv)) || 152 + __get_user(tv->tv_sec, &ctv->tv_sec) || 153 + __get_user(tv->tv_usec, &ctv->tv_usec)) ? -EFAULT : 0; 154 + } 155 + EXPORT_SYMBOL_GPL(get_compat_timeval); 156 + 157 + int put_compat_timeval(const struct timeval *tv, struct compat_timeval __user *ctv) 158 + { 159 + return (!access_ok(VERIFY_WRITE, ctv, sizeof(*ctv)) || 160 + __put_user(tv->tv_sec, &ctv->tv_sec) || 161 + __put_user(tv->tv_usec, &ctv->tv_usec)) ? -EFAULT : 0; 162 + } 163 + EXPORT_SYMBOL_GPL(put_compat_timeval); 164 + 148 165 int get_compat_timespec(struct timespec *ts, const struct compat_timespec __user *cts) 149 166 { 150 167 return (!access_ok(VERIFY_READ, cts, sizeof(*cts)) || 151 168 __get_user(ts->tv_sec, &cts->tv_sec) || 152 169 __get_user(ts->tv_nsec, &cts->tv_nsec)) ? -EFAULT : 0; 153 170 } 171 + EXPORT_SYMBOL_GPL(get_compat_timespec); 154 172 155 173 int put_compat_timespec(const struct timespec *ts, struct compat_timespec __user *cts) 156 174 { ··· 176 160 __put_user(ts->tv_nsec, &cts->tv_nsec)) ? -EFAULT : 0; 177 161 } 178 162 EXPORT_SYMBOL_GPL(put_compat_timespec); 163 + 164 + int compat_get_timeval(struct timeval *tv, const void __user *utv) 165 + { 166 + if (COMPAT_USE_64BIT_TIME) 167 + return copy_from_user(tv, utv, sizeof *tv) ? -EFAULT : 0; 168 + else 169 + return get_compat_timeval(tv, utv); 170 + } 171 + EXPORT_SYMBOL_GPL(compat_get_timeval); 172 + 173 + int compat_put_timeval(const struct timeval *tv, void __user *utv) 174 + { 175 + if (COMPAT_USE_64BIT_TIME) 176 + return copy_to_user(utv, tv, sizeof *tv) ? -EFAULT : 0; 177 + else 178 + return put_compat_timeval(tv, utv); 179 + } 180 + EXPORT_SYMBOL_GPL(compat_put_timeval); 181 + 182 + int compat_get_timespec(struct timespec *ts, const void __user *uts) 183 + { 184 + if (COMPAT_USE_64BIT_TIME) 185 + return copy_from_user(ts, uts, sizeof *ts) ? -EFAULT : 0; 186 + else 187 + return get_compat_timespec(ts, uts); 188 + } 189 + EXPORT_SYMBOL_GPL(compat_get_timespec); 190 + 191 + int compat_put_timespec(const struct timespec *ts, void __user *uts) 192 + { 193 + if (COMPAT_USE_64BIT_TIME) 194 + return copy_to_user(uts, ts, sizeof *ts) ? -EFAULT : 0; 195 + else 196 + return put_compat_timespec(ts, uts); 197 + } 198 + EXPORT_SYMBOL_GPL(compat_put_timespec); 179 199 180 200 static long compat_nanosleep_restart(struct restart_block *restart) 181 201 {
+1 -1
kernel/exit.c
··· 474 474 i = j * __NFDBITS; 475 475 if (i >= fdt->max_fds) 476 476 break; 477 - set = fdt->open_fds->fds_bits[j++]; 477 + set = fdt->open_fds[j++]; 478 478 while (set) { 479 479 if (set & 1) { 480 480 struct file * file = xchg(&fdt->fd[i], NULL);
+2 -1
net/bluetooth/hci_sock.c
··· 733 733 data = &tv; 734 734 len = sizeof(tv); 735 735 #ifdef CONFIG_COMPAT 736 - if (msg->msg_flags & MSG_CMSG_COMPAT) { 736 + if (!COMPAT_USE_64BIT_TIME && 737 + (msg->msg_flags & MSG_CMSG_COMPAT)) { 737 738 ctv.tv_sec = tv.tv_sec; 738 739 ctv.tv_usec = tv.tv_usec; 739 740 data = &ctv;
+40 -25
net/compat.c
··· 219 219 220 220 int put_cmsg_compat(struct msghdr *kmsg, int level, int type, int len, void *data) 221 221 { 222 - struct compat_timeval ctv; 223 - struct compat_timespec cts[3]; 224 222 struct compat_cmsghdr __user *cm = (struct compat_cmsghdr __user *) kmsg->msg_control; 225 223 struct compat_cmsghdr cmhdr; 226 224 int cmlen; ··· 228 230 return 0; /* XXX: return error? check spec. */ 229 231 } 230 232 231 - if (level == SOL_SOCKET && type == SCM_TIMESTAMP) { 232 - struct timeval *tv = (struct timeval *)data; 233 - ctv.tv_sec = tv->tv_sec; 234 - ctv.tv_usec = tv->tv_usec; 235 - data = &ctv; 236 - len = sizeof(ctv); 237 - } 238 - if (level == SOL_SOCKET && 239 - (type == SCM_TIMESTAMPNS || type == SCM_TIMESTAMPING)) { 240 - int count = type == SCM_TIMESTAMPNS ? 1 : 3; 241 - int i; 242 - struct timespec *ts = (struct timespec *)data; 243 - for (i = 0; i < count; i++) { 244 - cts[i].tv_sec = ts[i].tv_sec; 245 - cts[i].tv_nsec = ts[i].tv_nsec; 233 + if (!COMPAT_USE_64BIT_TIME) { 234 + struct compat_timeval ctv; 235 + struct compat_timespec cts[3]; 236 + if (level == SOL_SOCKET && type == SCM_TIMESTAMP) { 237 + struct timeval *tv = (struct timeval *)data; 238 + ctv.tv_sec = tv->tv_sec; 239 + ctv.tv_usec = tv->tv_usec; 240 + data = &ctv; 241 + len = sizeof(ctv); 246 242 } 247 - data = &cts; 248 - len = sizeof(cts[0]) * count; 243 + if (level == SOL_SOCKET && 244 + (type == SCM_TIMESTAMPNS || type == SCM_TIMESTAMPING)) { 245 + int count = type == SCM_TIMESTAMPNS ? 1 : 3; 246 + int i; 247 + struct timespec *ts = (struct timespec *)data; 248 + for (i = 0; i < count; i++) { 249 + cts[i].tv_sec = ts[i].tv_sec; 250 + cts[i].tv_nsec = ts[i].tv_nsec; 251 + } 252 + data = &cts; 253 + len = sizeof(cts[0]) * count; 254 + } 249 255 } 250 256 251 257 cmlen = CMSG_COMPAT_LEN(len); ··· 456 454 457 455 int compat_sock_get_timestamp(struct sock *sk, struct timeval __user *userstamp) 458 456 { 459 - struct compat_timeval __user *ctv = 460 - (struct compat_timeval __user *) userstamp; 461 - int err = -ENOENT; 457 + struct compat_timeval __user *ctv; 458 + int err; 462 459 struct timeval tv; 463 460 461 + if (COMPAT_USE_64BIT_TIME) 462 + return sock_get_timestamp(sk, userstamp); 463 + 464 + ctv = (struct compat_timeval __user *) userstamp; 465 + err = -ENOENT; 464 466 if (!sock_flag(sk, SOCK_TIMESTAMP)) 465 467 sock_enable_timestamp(sk, SOCK_TIMESTAMP); 466 468 tv = ktime_to_timeval(sk->sk_stamp); ··· 484 478 485 479 int compat_sock_get_timestampns(struct sock *sk, struct timespec __user *userstamp) 486 480 { 487 - struct compat_timespec __user *ctv = 488 - (struct compat_timespec __user *) userstamp; 489 - int err = -ENOENT; 481 + struct compat_timespec __user *ctv; 482 + int err; 490 483 struct timespec ts; 491 484 485 + if (COMPAT_USE_64BIT_TIME) 486 + return sock_get_timestampns (sk, userstamp); 487 + 488 + ctv = (struct compat_timespec __user *) userstamp; 489 + err = -ENOENT; 492 490 if (!sock_flag(sk, SOCK_TIMESTAMP)) 493 491 sock_enable_timestamp(sk, SOCK_TIMESTAMP); 494 492 ts = ktime_to_timespec(sk->sk_stamp); ··· 776 766 { 777 767 int datagrams; 778 768 struct timespec ktspec; 769 + 770 + if (COMPAT_USE_64BIT_TIME) 771 + return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen, 772 + flags | MSG_CMSG_COMPAT, 773 + (struct timespec *) timeout); 779 774 780 775 if (timeout == NULL) 781 776 return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
+8 -10
net/socket.c
··· 2592 2592 2593 2593 #ifdef CONFIG_COMPAT 2594 2594 static int do_siocgstamp(struct net *net, struct socket *sock, 2595 - unsigned int cmd, struct compat_timeval __user *up) 2595 + unsigned int cmd, void __user *up) 2596 2596 { 2597 2597 mm_segment_t old_fs = get_fs(); 2598 2598 struct timeval ktv; ··· 2601 2601 set_fs(KERNEL_DS); 2602 2602 err = sock_do_ioctl(net, sock, cmd, (unsigned long)&ktv); 2603 2603 set_fs(old_fs); 2604 - if (!err) { 2605 - err = put_user(ktv.tv_sec, &up->tv_sec); 2606 - err |= __put_user(ktv.tv_usec, &up->tv_usec); 2607 - } 2604 + if (!err) 2605 + err = compat_put_timeval(up, &ktv); 2606 + 2608 2607 return err; 2609 2608 } 2610 2609 2611 2610 static int do_siocgstampns(struct net *net, struct socket *sock, 2612 - unsigned int cmd, struct compat_timespec __user *up) 2611 + unsigned int cmd, void __user *up) 2613 2612 { 2614 2613 mm_segment_t old_fs = get_fs(); 2615 2614 struct timespec kts; ··· 2617 2618 set_fs(KERNEL_DS); 2618 2619 err = sock_do_ioctl(net, sock, cmd, (unsigned long)&kts); 2619 2620 set_fs(old_fs); 2620 - if (!err) { 2621 - err = put_user(kts.tv_sec, &up->tv_sec); 2622 - err |= __put_user(kts.tv_nsec, &up->tv_nsec); 2623 - } 2621 + if (!err) 2622 + err = compat_put_timespec(up, &kts); 2623 + 2624 2624 return err; 2625 2625 } 2626 2626
+1 -1
security/selinux/hooks.c
··· 2147 2147 fdt = files_fdtable(files); 2148 2148 if (i >= fdt->max_fds) 2149 2149 break; 2150 - set = fdt->open_fds->fds_bits[j]; 2150 + set = fdt->open_fds[j]; 2151 2151 if (!set) 2152 2152 continue; 2153 2153 spin_unlock(&files->file_lock);