diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-29 21:12:23 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-29 21:12:23 -0400 |
commit | a591afc01d9e48affbacb365558a31e53c85af45 (patch) | |
tree | 9bb91f4eb94ec69fc4706c4944788ec5f3586063 | |
parent | 820d41cf0cd0e94a5661e093821e2e5c6b36a9d8 (diff) | |
parent | 31796ac4e8f0e88f5c10f1ad6dab8f19bebe44a4 (diff) |
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>
...
91 files changed, 1561 insertions, 2180 deletions
diff --git a/Documentation/filesystems/files.txt b/Documentation/filesystems/files.txt index ac2facc50d2a..46dfc6b038c3 100644 --- a/Documentation/filesystems/files.txt +++ b/Documentation/filesystems/files.txt | |||
@@ -113,8 +113,8 @@ the fdtable structure - | |||
113 | if (fd >= 0) { | 113 | if (fd >= 0) { |
114 | /* locate_fd() may have expanded fdtable, load the ptr */ | 114 | /* locate_fd() may have expanded fdtable, load the ptr */ |
115 | fdt = files_fdtable(files); | 115 | fdt = files_fdtable(files); |
116 | FD_SET(fd, fdt->open_fds); | 116 | __set_open_fd(fd, fdt); |
117 | FD_CLR(fd, fdt->close_on_exec); | 117 | __clear_close_on_exec(fd, fdt); |
118 | spin_unlock(&files->file_lock); | 118 | spin_unlock(&files->file_lock); |
119 | ..... | 119 | ..... |
120 | 120 | ||
diff --git a/arch/alpha/include/asm/posix_types.h b/arch/alpha/include/asm/posix_types.h index db167413300b..24779fc95994 100644 --- a/arch/alpha/include/asm/posix_types.h +++ b/arch/alpha/include/asm/posix_types.h | |||
@@ -8,116 +8,13 @@ | |||
8 | */ | 8 | */ |
9 | 9 | ||
10 | typedef unsigned int __kernel_ino_t; | 10 | typedef unsigned int __kernel_ino_t; |
11 | typedef unsigned int __kernel_mode_t; | 11 | #define __kernel_ino_t __kernel_ino_t |
12 | 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; | ||
27 | 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 | |||
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 | 12 | ||
58 | #undef __FD_SET | 13 | typedef unsigned int __kernel_nlink_t; |
59 | static __inline__ void __FD_SET(unsigned long fd, __kernel_fd_set *fdsetp) | 14 | #define __kernel_nlink_t __kernel_nlink_t |
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 | 15 | ||
119 | #endif /* __GNUC__ */ | 16 | typedef unsigned long __kernel_sigset_t; /* at least 32 bits */ |
120 | 17 | ||
121 | #endif /* __KERNEL__ */ | 18 | #include <asm-generic/posix_types.h> |
122 | 19 | ||
123 | #endif /* _ALPHA_POSIX_TYPES_H */ | 20 | #endif /* _ALPHA_POSIX_TYPES_H */ |
diff --git a/arch/arm/include/asm/posix_types.h b/arch/arm/include/asm/posix_types.h index 2446d23bfdbf..efdf99045d87 100644 --- a/arch/arm/include/asm/posix_types.h +++ b/arch/arm/include/asm/posix_types.h | |||
@@ -19,59 +19,22 @@ | |||
19 | * assume GCC is being used. | 19 | * assume GCC is being used. |
20 | */ | 20 | */ |
21 | 21 | ||
22 | typedef unsigned long __kernel_ino_t; | ||
23 | typedef unsigned short __kernel_mode_t; | 22 | typedef unsigned short __kernel_mode_t; |
23 | #define __kernel_mode_t __kernel_mode_t | ||
24 | |||
24 | typedef unsigned short __kernel_nlink_t; | 25 | typedef unsigned short __kernel_nlink_t; |
25 | typedef long __kernel_off_t; | 26 | #define __kernel_nlink_t __kernel_nlink_t |
26 | typedef int __kernel_pid_t; | 27 | |
27 | typedef unsigned short __kernel_ipc_pid_t; | 28 | typedef unsigned short __kernel_ipc_pid_t; |
29 | #define __kernel_ipc_pid_t __kernel_ipc_pid_t | ||
30 | |||
28 | typedef unsigned short __kernel_uid_t; | 31 | typedef unsigned short __kernel_uid_t; |
29 | typedef unsigned short __kernel_gid_t; | 32 | typedef unsigned short __kernel_gid_t; |
30 | typedef unsigned int __kernel_size_t; | 33 | #define __kernel_uid_t __kernel_uid_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; | ||
44 | 34 | ||
45 | typedef unsigned short __kernel_old_uid_t; | ||
46 | typedef unsigned short __kernel_old_gid_t; | ||
47 | typedef unsigned short __kernel_old_dev_t; | 35 | typedef unsigned short __kernel_old_dev_t; |
36 | #define __kernel_old_dev_t __kernel_old_dev_t | ||
48 | 37 | ||
49 | #ifdef __GNUC__ | 38 | #include <asm-generic/posix_types.h> |
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 | ||
76 | 39 | ||
77 | #endif | 40 | #endif |
diff --git a/arch/avr32/include/asm/posix_types.h b/arch/avr32/include/asm/posix_types.h index fe0c0c014389..74667bfc88cc 100644 --- a/arch/avr32/include/asm/posix_types.h +++ b/arch/avr32/include/asm/posix_types.h | |||
@@ -14,112 +14,27 @@ | |||
14 | * assume GCC is being used. | 14 | * assume GCC is being used. |
15 | */ | 15 | */ |
16 | 16 | ||
17 | typedef unsigned long __kernel_ino_t; | ||
18 | typedef unsigned short __kernel_mode_t; | 17 | typedef unsigned short __kernel_mode_t; |
18 | #define __kernel_mode_t __kernel_mode_t | ||
19 | |||
19 | typedef unsigned short __kernel_nlink_t; | 20 | typedef unsigned short __kernel_nlink_t; |
20 | typedef long __kernel_off_t; | 21 | #define __kernel_nlink_t __kernel_nlink_t |
21 | typedef int __kernel_pid_t; | 22 | |
22 | typedef unsigned short __kernel_ipc_pid_t; | 23 | typedef unsigned short __kernel_ipc_pid_t; |
23 | typedef unsigned int __kernel_uid_t; | 24 | #define __kernel_ipc_pid_t __kernel_ipc_pid_t |
24 | typedef unsigned int __kernel_gid_t; | 25 | |
25 | typedef unsigned long __kernel_size_t; | 26 | typedef unsigned long __kernel_size_t; |
26 | typedef long __kernel_ssize_t; | 27 | typedef long __kernel_ssize_t; |
27 | typedef int __kernel_ptrdiff_t; | 28 | typedef int __kernel_ptrdiff_t; |
28 | typedef long __kernel_time_t; | 29 | #define __kernel_size_t __kernel_size_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; | ||
39 | 30 | ||
40 | typedef unsigned short __kernel_old_uid_t; | 31 | typedef unsigned short __kernel_old_uid_t; |
41 | typedef unsigned short __kernel_old_gid_t; | 32 | typedef unsigned short __kernel_old_gid_t; |
42 | typedef unsigned short __kernel_old_dev_t; | 33 | #define __kernel_old_uid_t __kernel_old_uid_t |
43 | |||
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 | 34 | ||
35 | typedef unsigned short __kernel_old_dev_t; | ||
36 | #define __kernel_old_dev_t __kernel_old_dev_t | ||
70 | 37 | ||
71 | #undef __FD_ISSET | 38 | #include <asm-generic/posix_types.h> |
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__) */ | ||
124 | 39 | ||
125 | #endif /* __ASM_AVR32_POSIX_TYPES_H */ | 40 | #endif /* __ASM_AVR32_POSIX_TYPES_H */ |
diff --git a/arch/cris/include/asm/posix_types.h b/arch/cris/include/asm/posix_types.h index ce3fb25a460b..72b3cd6eda0b 100644 --- a/arch/cris/include/asm/posix_types.h +++ b/arch/cris/include/asm/posix_types.h | |||
@@ -12,55 +12,25 @@ | |||
12 | * assume GCC is being used. | 12 | * assume GCC is being used. |
13 | */ | 13 | */ |
14 | 14 | ||
15 | typedef unsigned long __kernel_ino_t; | ||
16 | typedef unsigned short __kernel_mode_t; | 15 | typedef unsigned short __kernel_mode_t; |
16 | #define __kernel_mode_t __kernel_mode_t | ||
17 | |||
17 | typedef unsigned short __kernel_nlink_t; | 18 | typedef unsigned short __kernel_nlink_t; |
18 | typedef long __kernel_off_t; | 19 | #define __kernel_nlink_t __kernel_nlink_t |
19 | typedef int __kernel_pid_t; | 20 | |
20 | typedef unsigned short __kernel_ipc_pid_t; | 21 | typedef unsigned short __kernel_ipc_pid_t; |
22 | #define __kernel_ipc_pid_t __kernel_ipc_pid_t | ||
23 | |||
21 | typedef unsigned short __kernel_uid_t; | 24 | typedef unsigned short __kernel_uid_t; |
22 | typedef unsigned short __kernel_gid_t; | 25 | typedef unsigned short __kernel_gid_t; |
26 | #define __kernel_uid_t __kernel_uid_t | ||
27 | |||
23 | typedef __SIZE_TYPE__ __kernel_size_t; | 28 | typedef __SIZE_TYPE__ __kernel_size_t; |
24 | typedef long __kernel_ssize_t; | 29 | typedef long __kernel_ssize_t; |
25 | typedef int __kernel_ptrdiff_t; | 30 | typedef int __kernel_ptrdiff_t; |
26 | typedef long __kernel_time_t; | 31 | #define __kernel_size_t __kernel_size_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; | ||
37 | 32 | ||
38 | typedef unsigned short __kernel_old_uid_t; | ||
39 | typedef unsigned short __kernel_old_gid_t; | ||
40 | typedef unsigned short __kernel_old_dev_t; | 33 | typedef unsigned short __kernel_old_dev_t; |
41 | 34 | #define __kernel_old_dev_t __kernel_old_dev_t | |
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__ */ | ||
65 | 35 | ||
66 | #endif /* __ARCH_CRIS_POSIX_TYPES_H */ | 36 | #endif /* __ARCH_CRIS_POSIX_TYPES_H */ |
diff --git a/arch/frv/include/asm/posix_types.h b/arch/frv/include/asm/posix_types.h index a9f1f5be0632..3f34cb45fbb3 100644 --- a/arch/frv/include/asm/posix_types.h +++ b/arch/frv/include/asm/posix_types.h | |||
@@ -7,56 +7,23 @@ | |||
7 | * assume GCC is being used. | 7 | * assume GCC is being used. |
8 | */ | 8 | */ |
9 | 9 | ||
10 | typedef unsigned long __kernel_ino_t; | ||
11 | typedef unsigned short __kernel_mode_t; | 10 | typedef unsigned short __kernel_mode_t; |
11 | #define __kernel_mode_t __kernel_mode_t | ||
12 | |||
12 | typedef unsigned short __kernel_nlink_t; | 13 | typedef unsigned short __kernel_nlink_t; |
13 | typedef long __kernel_off_t; | 14 | #define __kernel_nlink_t __kernel_nlink_t |
14 | typedef int __kernel_pid_t; | 15 | |
15 | typedef unsigned short __kernel_ipc_pid_t; | 16 | typedef unsigned short __kernel_ipc_pid_t; |
17 | #define __kernel_ipc_pid_t __kernel_ipc_pid_t | ||
18 | |||
16 | typedef unsigned short __kernel_uid_t; | 19 | typedef unsigned short __kernel_uid_t; |
17 | typedef unsigned short __kernel_gid_t; | 20 | typedef unsigned short __kernel_gid_t; |
18 | typedef unsigned int __kernel_size_t; | 21 | #define __kernel_uid_t __kernel_uid_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; | ||
32 | |||
33 | typedef unsigned short __kernel_old_uid_t; | ||
34 | typedef unsigned short __kernel_old_gid_t; | ||
35 | typedef unsigned short __kernel_old_dev_t; | ||
36 | |||
37 | #ifdef __GNUC__ | ||
38 | typedef long long __kernel_loff_t; | ||
39 | #endif | ||
40 | 22 | ||
41 | typedef struct { | 23 | typedef unsigned short __kernel_old_dev_t; |
42 | int val[2]; | 24 | #define __kernel_old_dev_t __kernel_old_dev_t |
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 | 25 | ||
59 | #endif /* defined(__KERNEL__) */ | 26 | #include <asm-generic/posix_types.h> |
60 | 27 | ||
61 | #endif | 28 | #endif |
62 | 29 | ||
diff --git a/arch/h8300/include/asm/posix_types.h b/arch/h8300/include/asm/posix_types.h index 6f833a16f694..bc4c34efb1ad 100644 --- a/arch/h8300/include/asm/posix_types.h +++ b/arch/h8300/include/asm/posix_types.h | |||
@@ -7,54 +7,23 @@ | |||
7 | * assume GCC is being used. | 7 | * assume GCC is being used. |
8 | */ | 8 | */ |
9 | 9 | ||
10 | typedef unsigned long __kernel_ino_t; | ||
11 | typedef unsigned short __kernel_mode_t; | 10 | typedef unsigned short __kernel_mode_t; |
11 | #define __kernel_mode_t __kernel_mode_t | ||
12 | |||
12 | typedef unsigned short __kernel_nlink_t; | 13 | typedef unsigned short __kernel_nlink_t; |
13 | typedef long __kernel_off_t; | 14 | #define __kernel_nlink_t __kernel_nlink_t |
14 | typedef int __kernel_pid_t; | 15 | |
15 | typedef unsigned short __kernel_ipc_pid_t; | 16 | typedef unsigned short __kernel_ipc_pid_t; |
17 | #define __kernel_ipc_pid_t __kernel_ipc_pid_t | ||
18 | |||
16 | typedef unsigned short __kernel_uid_t; | 19 | typedef unsigned short __kernel_uid_t; |
17 | typedef unsigned short __kernel_gid_t; | 20 | typedef unsigned short __kernel_gid_t; |
18 | typedef unsigned int __kernel_size_t; | 21 | #define __kernel_uid_t __kernel_uid_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; | ||
32 | 22 | ||
33 | typedef unsigned short __kernel_old_uid_t; | 23 | typedef unsigned short __kernel_old_uid_t; |
34 | typedef unsigned short __kernel_old_gid_t; | 24 | typedef unsigned short __kernel_old_gid_t; |
25 | #define __kernel_old_uid_t __kernel_old_uid_t | ||
35 | 26 | ||
36 | #ifdef __GNUC__ | 27 | #include <asm-generic/posix_types.h> |
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__) */ | ||
59 | 28 | ||
60 | #endif | 29 | #endif |
diff --git a/arch/ia64/include/asm/posix_types.h b/arch/ia64/include/asm/posix_types.h index 17885567b731..7323ab9467eb 100644 --- a/arch/ia64/include/asm/posix_types.h +++ b/arch/ia64/include/asm/posix_types.h | |||
@@ -1,126 +1,11 @@ | |||
1 | #ifndef _ASM_IA64_POSIX_TYPES_H | 1 | #ifndef _ASM_IA64_POSIX_TYPES_H |
2 | #define _ASM_IA64_POSIX_TYPES_H | 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 | typedef unsigned int __kernel_nlink_t; | 4 | typedef unsigned int __kernel_nlink_t; |
18 | typedef long __kernel_off_t; | 5 | #define __kernel_nlink_t __kernel_nlink_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; | ||
34 | 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 | |||
38 | typedef struct { | ||
39 | int val[2]; | ||
40 | } __kernel_fsid_t; | ||
41 | |||
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 | 6 | ||
59 | # else /* !__GNUC__ */ | 7 | typedef unsigned long __kernel_sigset_t; /* at least 32 bits */ |
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 | 8 | ||
111 | case 4: | 9 | #include <asm-generic/posix_types.h> |
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 | 10 | ||
124 | # endif /* !__GNUC__ */ | ||
125 | # endif /* __KERNEL__ */ | ||
126 | #endif /* _ASM_IA64_POSIX_TYPES_H */ | 11 | #endif /* _ASM_IA64_POSIX_TYPES_H */ |
diff --git a/arch/m32r/include/asm/posix_types.h b/arch/m32r/include/asm/posix_types.h index b309c5858637..0195850e1f88 100644 --- a/arch/m32r/include/asm/posix_types.h +++ b/arch/m32r/include/asm/posix_types.h | |||
@@ -7,112 +7,22 @@ | |||
7 | * assume GCC is being used. | 7 | * assume GCC is being used. |
8 | */ | 8 | */ |
9 | 9 | ||
10 | typedef unsigned long __kernel_ino_t; | ||
11 | typedef unsigned short __kernel_mode_t; | 10 | typedef unsigned short __kernel_mode_t; |
11 | #define __kernel_mode_t __kernel_mode_t | ||
12 | |||
12 | typedef unsigned short __kernel_nlink_t; | 13 | typedef unsigned short __kernel_nlink_t; |
13 | typedef long __kernel_off_t; | 14 | #define __kernel_nlink_t __kernel_nlink_t |
14 | typedef int __kernel_pid_t; | 15 | |
15 | typedef unsigned short __kernel_ipc_pid_t; | 16 | typedef unsigned short __kernel_ipc_pid_t; |
17 | #define __kernel_ipc_pid_t __kernel_ipc_pid_t | ||
18 | |||
16 | typedef unsigned short __kernel_uid_t; | 19 | typedef unsigned short __kernel_uid_t; |
17 | typedef unsigned short __kernel_gid_t; | 20 | typedef unsigned short __kernel_gid_t; |
18 | typedef unsigned int __kernel_size_t; | 21 | #define __kernel_uid_t __kernel_uid_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; | ||
32 | 22 | ||
33 | typedef unsigned short __kernel_old_uid_t; | ||
34 | typedef unsigned short __kernel_old_gid_t; | ||
35 | typedef unsigned short __kernel_old_dev_t; | 23 | typedef unsigned short __kernel_old_dev_t; |
24 | #define __kernel_old_dev_t __kernel_old_dev_t | ||
36 | 25 | ||
37 | #ifdef __GNUC__ | 26 | #include <asm-generic/posix_types.h> |
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__) */ | ||
117 | 27 | ||
118 | #endif /* _ASM_M32R_POSIX_TYPES_H */ | 28 | #endif /* _ASM_M32R_POSIX_TYPES_H */ |
diff --git a/arch/m68k/include/asm/posix_types.h b/arch/m68k/include/asm/posix_types.h index 98d0970d9bad..6373093be72b 100644 --- a/arch/m68k/include/asm/posix_types.h +++ b/arch/m68k/include/asm/posix_types.h | |||
@@ -7,55 +7,22 @@ | |||
7 | * assume GCC is being used. | 7 | * assume GCC is being used. |
8 | */ | 8 | */ |
9 | 9 | ||
10 | typedef unsigned long __kernel_ino_t; | ||
11 | typedef unsigned short __kernel_mode_t; | 10 | typedef unsigned short __kernel_mode_t; |
11 | #define __kernel_mode_t __kernel_mode_t | ||
12 | |||
12 | typedef unsigned short __kernel_nlink_t; | 13 | typedef unsigned short __kernel_nlink_t; |
13 | typedef long __kernel_off_t; | 14 | #define __kernel_nlink_t __kernel_nlink_t |
14 | typedef int __kernel_pid_t; | 15 | |
15 | typedef unsigned short __kernel_ipc_pid_t; | 16 | typedef unsigned short __kernel_ipc_pid_t; |
17 | #define __kernel_ipc_pid_t __kernel_ipc_pid_t | ||
18 | |||
16 | typedef unsigned short __kernel_uid_t; | 19 | typedef unsigned short __kernel_uid_t; |
17 | typedef unsigned short __kernel_gid_t; | 20 | typedef unsigned short __kernel_gid_t; |
18 | typedef unsigned int __kernel_size_t; | 21 | #define __kernel_uid_t __kernel_uid_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; | ||
32 | |||
33 | typedef unsigned short __kernel_old_uid_t; | ||
34 | typedef unsigned short __kernel_old_gid_t; | ||
35 | typedef unsigned short __kernel_old_dev_t; | ||
36 | |||
37 | #ifdef __GNUC__ | ||
38 | typedef long long __kernel_loff_t; | ||
39 | #endif | ||
40 | 22 | ||
41 | typedef struct { | 23 | typedef unsigned short __kernel_old_dev_t; |
42 | int val[2]; | 24 | #define __kernel_old_dev_t __kernel_old_dev_t |
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 | 25 | ||
59 | #endif /* defined(__KERNEL__) */ | 26 | #include <asm-generic/posix_types.h> |
60 | 27 | ||
61 | #endif | 28 | #endif |
diff --git a/arch/mips/include/asm/posix_types.h b/arch/mips/include/asm/posix_types.h index c200102c8586..e0308dcca135 100644 --- a/arch/mips/include/asm/posix_types.h +++ b/arch/mips/include/asm/posix_types.h | |||
@@ -17,128 +17,21 @@ | |||
17 | * assume GCC is being used. | 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 | #if (_MIPS_SZLONG == 64) | 20 | #if (_MIPS_SZLONG == 64) |
26 | typedef unsigned int __kernel_nlink_t; | 21 | typedef unsigned int __kernel_nlink_t; |
22 | #define __kernel_nlink_t __kernel_nlink_t | ||
27 | #endif | 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; | ||
48 | typedef long __kernel_daddr_t; | ||
49 | typedef char * __kernel_caddr_t; | ||
50 | 24 | ||
51 | typedef unsigned short __kernel_uid16_t; | 25 | typedef long __kernel_daddr_t; |
52 | typedef unsigned short __kernel_gid16_t; | 26 | #define __kernel_daddr_t __kernel_daddr_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 | 27 | ||
63 | typedef struct { | ||
64 | #if (_MIPS_SZLONG == 32) | 28 | #if (_MIPS_SZLONG == 32) |
29 | typedef struct { | ||
65 | long val[2]; | 30 | long val[2]; |
66 | #endif | ||
67 | #if (_MIPS_SZLONG == 64) | ||
68 | int val[2]; | ||
69 | #endif | ||
70 | } __kernel_fsid_t; | 31 | } __kernel_fsid_t; |
32 | #define __kernel_fsid_t __kernel_fsid_t | ||
33 | #endif | ||
71 | 34 | ||
72 | #if defined(__KERNEL__) | 35 | #include <asm-generic/posix_types.h> |
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__) */ | ||
143 | 36 | ||
144 | #endif /* _ASM_POSIX_TYPES_H */ | 37 | #endif /* _ASM_POSIX_TYPES_H */ |
diff --git a/arch/mips/kernel/kspd.c b/arch/mips/kernel/kspd.c index 29811f043399..84d0639e4580 100644 --- a/arch/mips/kernel/kspd.c +++ b/arch/mips/kernel/kspd.c | |||
@@ -326,7 +326,7 @@ static void sp_cleanup(void) | |||
326 | i = j * __NFDBITS; | 326 | i = j * __NFDBITS; |
327 | if (i >= fdt->max_fds) | 327 | if (i >= fdt->max_fds) |
328 | break; | 328 | break; |
329 | set = fdt->open_fds->fds_bits[j++]; | 329 | set = fdt->open_fds[j++]; |
330 | while (set) { | 330 | while (set) { |
331 | if (set & 1) { | 331 | if (set & 1) { |
332 | struct file * file = xchg(&fdt->fd[i], NULL); | 332 | struct file * file = xchg(&fdt->fd[i], NULL); |
diff --git a/arch/mn10300/include/asm/posix_types.h b/arch/mn10300/include/asm/posix_types.h index 56ffbc158798..ab506181ec31 100644 --- a/arch/mn10300/include/asm/posix_types.h +++ b/arch/mn10300/include/asm/posix_types.h | |||
@@ -17,14 +17,19 @@ | |||
17 | * assume GCC is being used. | 17 | * assume GCC is being used. |
18 | */ | 18 | */ |
19 | 19 | ||
20 | typedef unsigned long __kernel_ino_t; | ||
21 | typedef unsigned short __kernel_mode_t; | 20 | typedef unsigned short __kernel_mode_t; |
21 | #define __kernel_mode_t __kernel_mode_t | ||
22 | |||
22 | typedef unsigned short __kernel_nlink_t; | 23 | typedef unsigned short __kernel_nlink_t; |
23 | typedef long __kernel_off_t; | 24 | #define __kernel_nlink_t __kernel_nlink_t |
24 | typedef int __kernel_pid_t; | 25 | |
25 | typedef unsigned short __kernel_ipc_pid_t; | 26 | typedef unsigned short __kernel_ipc_pid_t; |
27 | #define __kernel_ipc_pid_t __kernel_ipc_pid_t | ||
28 | |||
26 | typedef unsigned short __kernel_uid_t; | 29 | typedef unsigned short __kernel_uid_t; |
27 | typedef unsigned short __kernel_gid_t; | 30 | typedef unsigned short __kernel_gid_t; |
31 | #define __kernel_uid_t __kernel_uid_t | ||
32 | |||
28 | #if __GNUC__ == 4 | 33 | #if __GNUC__ == 4 |
29 | typedef unsigned int __kernel_size_t; | 34 | typedef unsigned int __kernel_size_t; |
30 | typedef signed int __kernel_ssize_t; | 35 | typedef signed int __kernel_ssize_t; |
@@ -33,105 +38,11 @@ typedef unsigned long __kernel_size_t; | |||
33 | typedef signed long __kernel_ssize_t; | 38 | typedef signed long __kernel_ssize_t; |
34 | #endif | 39 | #endif |
35 | typedef int __kernel_ptrdiff_t; | 40 | typedef int __kernel_ptrdiff_t; |
36 | typedef long __kernel_time_t; | 41 | #define __kernel_size_t __kernel_size_t |
37 | typedef long __kernel_suseconds_t; | ||
38 | typedef long __kernel_clock_t; | ||
39 | typedef int __kernel_timer_t; | ||
40 | typedef int __kernel_clockid_t; | ||
41 | typedef int __kernel_daddr_t; | ||
42 | typedef char * __kernel_caddr_t; | ||
43 | typedef unsigned short __kernel_uid16_t; | ||
44 | typedef unsigned short __kernel_gid16_t; | ||
45 | typedef unsigned int __kernel_uid32_t; | ||
46 | typedef unsigned int __kernel_gid32_t; | ||
47 | 42 | ||
48 | typedef unsigned short __kernel_old_uid_t; | ||
49 | typedef unsigned short __kernel_old_gid_t; | ||
50 | typedef unsigned short __kernel_old_dev_t; | 43 | typedef unsigned short __kernel_old_dev_t; |
44 | #define __kernel_old_dev_t __kernel_old_dev_t | ||
51 | 45 | ||
52 | #ifdef __GNUC__ | 46 | #include <asm-generic/posix_types.h> |
53 | typedef long long __kernel_loff_t; | ||
54 | #endif | ||
55 | |||
56 | typedef struct { | ||
57 | #if defined(__KERNEL__) || defined(__USE_ALL) | ||
58 | int val[2]; | ||
59 | #else /* !defined(__KERNEL__) && !defined(__USE_ALL) */ | ||
60 | int __val[2]; | ||
61 | #endif /* !defined(__KERNEL__) && !defined(__USE_ALL) */ | ||
62 | } __kernel_fsid_t; | ||
63 | |||
64 | #if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) | ||
65 | |||
66 | #undef __FD_SET | ||
67 | static inline void __FD_SET(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_CLR | ||
75 | static inline void __FD_CLR(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 | |||
83 | #undef __FD_ISSET | ||
84 | static inline int __FD_ISSET(unsigned long __fd, const __kernel_fd_set *__p) | ||
85 | { | ||
86 | unsigned long __tmp = __fd / __NFDBITS; | ||
87 | unsigned long __rem = __fd % __NFDBITS; | ||
88 | return (__p->fds_bits[__tmp] & (1UL<<__rem)) != 0; | ||
89 | } | ||
90 | |||
91 | /* | ||
92 | * This will unroll the loop for the normal constant case (8 ints, | ||
93 | * for a 256-bit fd_set) | ||
94 | */ | ||
95 | #undef __FD_ZERO | ||
96 | static inline void __FD_ZERO(__kernel_fd_set *__p) | ||
97 | { | ||
98 | unsigned long *__tmp = __p->fds_bits; | ||
99 | int __i; | ||
100 | |||
101 | if (__builtin_constant_p(__FDSET_LONGS)) { | ||
102 | switch (__FDSET_LONGS) { | ||
103 | case 16: | ||
104 | __tmp[ 0] = 0; __tmp[ 1] = 0; | ||
105 | __tmp[ 2] = 0; __tmp[ 3] = 0; | ||
106 | __tmp[ 4] = 0; __tmp[ 5] = 0; | ||
107 | __tmp[ 6] = 0; __tmp[ 7] = 0; | ||
108 | __tmp[ 8] = 0; __tmp[ 9] = 0; | ||
109 | __tmp[10] = 0; __tmp[11] = 0; | ||
110 | __tmp[12] = 0; __tmp[13] = 0; | ||
111 | __tmp[14] = 0; __tmp[15] = 0; | ||
112 | return; | ||
113 | |||
114 | case 8: | ||
115 | __tmp[ 0] = 0; __tmp[ 1] = 0; | ||
116 | __tmp[ 2] = 0; __tmp[ 3] = 0; | ||
117 | __tmp[ 4] = 0; __tmp[ 5] = 0; | ||
118 | __tmp[ 6] = 0; __tmp[ 7] = 0; | ||
119 | return; | ||
120 | |||
121 | case 4: | ||
122 | __tmp[ 0] = 0; __tmp[ 1] = 0; | ||
123 | __tmp[ 2] = 0; __tmp[ 3] = 0; | ||
124 | return; | ||
125 | } | ||
126 | } | ||
127 | __i = __FDSET_LONGS; | ||
128 | while (__i) { | ||
129 | __i--; | ||
130 | *__tmp = 0; | ||
131 | __tmp++; | ||
132 | } | ||
133 | } | ||
134 | |||
135 | #endif /* defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) */ | ||
136 | 47 | ||
137 | #endif /* _ASM_POSIX_TYPES_H */ | 48 | #endif /* _ASM_POSIX_TYPES_H */ |
diff --git a/arch/parisc/include/asm/posix_types.h b/arch/parisc/include/asm/posix_types.h index 00da29a340ba..5212b0357daf 100644 --- a/arch/parisc/include/asm/posix_types.h +++ b/arch/parisc/include/asm/posix_types.h | |||
@@ -6,123 +6,22 @@ | |||
6 | * be a little careful about namespace pollution etc. Also, we cannot | 6 | * be a little careful about namespace pollution etc. Also, we cannot |
7 | * assume GCC is being used. | 7 | * assume GCC is being used. |
8 | */ | 8 | */ |
9 | typedef unsigned long __kernel_ino_t; | 9 | |
10 | typedef unsigned short __kernel_mode_t; | 10 | typedef unsigned short __kernel_mode_t; |
11 | #define __kernel_mode_t __kernel_mode_t | ||
12 | |||
11 | typedef unsigned short __kernel_nlink_t; | 13 | typedef unsigned short __kernel_nlink_t; |
12 | typedef long __kernel_off_t; | 14 | #define __kernel_nlink_t __kernel_nlink_t |
13 | typedef int __kernel_pid_t; | 15 | |
14 | typedef unsigned short __kernel_ipc_pid_t; | 16 | typedef unsigned short __kernel_ipc_pid_t; |
15 | typedef unsigned int __kernel_uid_t; | 17 | #define __kernel_ipc_pid_t __kernel_ipc_pid_t |
16 | typedef unsigned int __kernel_gid_t; | ||
17 | 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; | ||
34 | 18 | ||
35 | typedef unsigned short __kernel_uid16_t; | 19 | typedef int __kernel_suseconds_t; |
36 | typedef unsigned short __kernel_gid16_t; | 20 | #define __kernel_suseconds_t __kernel_suseconds_t |
37 | typedef unsigned int __kernel_uid32_t; | ||
38 | typedef unsigned int __kernel_gid32_t; | ||
39 | 21 | ||
40 | #ifdef __GNUC__ | ||
41 | typedef long long __kernel_loff_t; | ||
42 | typedef long long __kernel_off64_t; | 22 | typedef long long __kernel_off64_t; |
43 | typedef unsigned long long __kernel_ino64_t; | 23 | typedef unsigned long long __kernel_ino64_t; |
44 | #endif | ||
45 | |||
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 | 24 | ||
126 | #endif /* defined(__KERNEL__) */ | 25 | #include <asm-generic/posix_types.h> |
127 | 26 | ||
128 | #endif | 27 | #endif |
diff --git a/arch/powerpc/include/asm/posix_types.h b/arch/powerpc/include/asm/posix_types.h index c4e396b540df..f1393252bbda 100644 --- a/arch/powerpc/include/asm/posix_types.h +++ b/arch/powerpc/include/asm/posix_types.h | |||
@@ -7,122 +7,22 @@ | |||
7 | * assume GCC is being used. | 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 | #ifdef __powerpc64__ | 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 | typedef unsigned long __kernel_old_dev_t; | 11 | typedef unsigned long __kernel_old_dev_t; |
12 | #define __kernel_old_dev_t __kernel_old_dev_t | ||
37 | #else | 13 | #else |
38 | typedef unsigned short __kernel_nlink_t; | ||
39 | typedef short __kernel_ipc_pid_t; | ||
40 | typedef unsigned int __kernel_size_t; | 14 | typedef unsigned int __kernel_size_t; |
41 | typedef int __kernel_ssize_t; | 15 | typedef int __kernel_ssize_t; |
42 | typedef unsigned int __kernel_old_dev_t; | 16 | typedef long __kernel_ptrdiff_t; |
43 | #endif | 17 | #define __kernel_size_t __kernel_size_t |
44 | |||
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 | ||
52 | |||
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 | 18 | ||
104 | if (__builtin_constant_p(__FDSET_LONGS)) { | 19 | typedef unsigned short __kernel_nlink_t; |
105 | switch (__FDSET_LONGS) { | 20 | #define __kernel_nlink_t __kernel_nlink_t |
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 | 21 | ||
110 | case 8: | 22 | typedef short __kernel_ipc_pid_t; |
111 | tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; | 23 | #define __kernel_ipc_pid_t __kernel_ipc_pid_t |
24 | #endif | ||
112 | 25 | ||
113 | case 4: | 26 | #include <asm-generic/posix_types.h> |
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 | 27 | ||
126 | #endif /* defined(__KERNEL__) */ | ||
127 | #endif /* __GNUC__ */ | ||
128 | #endif /* _ASM_POWERPC_POSIX_TYPES_H */ | 28 | #endif /* _ASM_POWERPC_POSIX_TYPES_H */ |
diff --git a/arch/powerpc/platforms/cell/spufs/coredump.c b/arch/powerpc/platforms/cell/spufs/coredump.c index 03c5fce2a5b3..c2c5b078ba80 100644 --- a/arch/powerpc/platforms/cell/spufs/coredump.c +++ b/arch/powerpc/platforms/cell/spufs/coredump.c | |||
@@ -122,7 +122,7 @@ static struct spu_context *coredump_next_context(int *fd) | |||
122 | struct spu_context *ctx = NULL; | 122 | struct spu_context *ctx = NULL; |
123 | 123 | ||
124 | for (; *fd < fdt->max_fds; (*fd)++) { | 124 | for (; *fd < fdt->max_fds; (*fd)++) { |
125 | if (!FD_ISSET(*fd, fdt->open_fds)) | 125 | if (!fd_is_open(*fd, fdt)) |
126 | continue; | 126 | continue; |
127 | 127 | ||
128 | file = fcheck(*fd); | 128 | file = fcheck(*fd); |
diff --git a/arch/s390/include/asm/posix_types.h b/arch/s390/include/asm/posix_types.h index 8cc113f92523..edf8527ff08d 100644 --- a/arch/s390/include/asm/posix_types.h +++ b/arch/s390/include/asm/posix_types.h | |||
@@ -3,7 +3,6 @@ | |||
3 | * | 3 | * |
4 | * S390 version | 4 | * S390 version |
5 | * | 5 | * |
6 | * Derived from "include/asm-i386/posix_types.h" | ||
7 | */ | 6 | */ |
8 | 7 | ||
9 | #ifndef __ARCH_S390_POSIX_TYPES_H | 8 | #ifndef __ARCH_S390_POSIX_TYPES_H |
@@ -15,22 +14,11 @@ | |||
15 | * assume GCC is being used. | 14 | * assume GCC is being used. |
16 | */ | 15 | */ |
17 | 16 | ||
18 | typedef long __kernel_off_t; | ||
19 | typedef int __kernel_pid_t; | ||
20 | typedef unsigned long __kernel_size_t; | 17 | typedef unsigned long __kernel_size_t; |
21 | typedef long __kernel_time_t; | 18 | #define __kernel_size_t __kernel_size_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 | 19 | ||
31 | #ifdef __GNUC__ | 20 | typedef unsigned short __kernel_old_dev_t; |
32 | typedef long long __kernel_loff_t; | 21 | #define __kernel_old_dev_t __kernel_old_dev_t |
33 | #endif | ||
34 | 22 | ||
35 | #ifndef __s390x__ | 23 | #ifndef __s390x__ |
36 | 24 | ||
@@ -42,11 +30,6 @@ typedef unsigned short __kernel_uid_t; | |||
42 | typedef unsigned short __kernel_gid_t; | 30 | typedef unsigned short __kernel_gid_t; |
43 | typedef int __kernel_ssize_t; | 31 | typedef int __kernel_ssize_t; |
44 | typedef int __kernel_ptrdiff_t; | 32 | typedef int __kernel_ptrdiff_t; |
45 | typedef unsigned int __kernel_uid32_t; | ||
46 | typedef unsigned int __kernel_gid32_t; | ||
47 | typedef unsigned short __kernel_old_uid_t; | ||
48 | typedef unsigned short __kernel_old_gid_t; | ||
49 | typedef unsigned short __kernel_old_dev_t; | ||
50 | 33 | ||
51 | #else /* __s390x__ */ | 34 | #else /* __s390x__ */ |
52 | 35 | ||
@@ -59,49 +42,16 @@ typedef unsigned int __kernel_gid_t; | |||
59 | typedef long __kernel_ssize_t; | 42 | typedef long __kernel_ssize_t; |
60 | typedef long __kernel_ptrdiff_t; | 43 | typedef long __kernel_ptrdiff_t; |
61 | typedef unsigned long __kernel_sigset_t; /* at least 32 bits */ | 44 | typedef unsigned long __kernel_sigset_t; /* at least 32 bits */ |
62 | typedef __kernel_uid_t __kernel_old_uid_t; | ||
63 | typedef __kernel_gid_t __kernel_old_gid_t; | ||
64 | typedef __kernel_uid_t __kernel_uid32_t; | ||
65 | typedef __kernel_gid_t __kernel_gid32_t; | ||
66 | typedef unsigned short __kernel_old_dev_t; | ||
67 | 45 | ||
68 | #endif /* __s390x__ */ | 46 | #endif /* __s390x__ */ |
69 | 47 | ||
70 | typedef struct { | 48 | #define __kernel_ino_t __kernel_ino_t |
71 | int val[2]; | 49 | #define __kernel_mode_t __kernel_mode_t |
72 | } __kernel_fsid_t; | 50 | #define __kernel_nlink_t __kernel_nlink_t |
73 | 51 | #define __kernel_ipc_pid_t __kernel_ipc_pid_t | |
74 | 52 | #define __kernel_uid_t __kernel_uid_t | |
75 | #ifdef __KERNEL__ | 53 | #define __kernel_gid_t __kernel_gid_t |
76 | |||
77 | #undef __FD_SET | ||
78 | static inline void __FD_SET(unsigned long fd, __kernel_fd_set *fdsetp) | ||
79 | { | ||
80 | unsigned long _tmp = fd / __NFDBITS; | ||
81 | unsigned long _rem = fd % __NFDBITS; | ||
82 | fdsetp->fds_bits[_tmp] |= (1UL<<_rem); | ||
83 | } | ||
84 | |||
85 | #undef __FD_CLR | ||
86 | static inline void __FD_CLR(unsigned long fd, __kernel_fd_set *fdsetp) | ||
87 | { | ||
88 | unsigned long _tmp = fd / __NFDBITS; | ||
89 | unsigned long _rem = fd % __NFDBITS; | ||
90 | fdsetp->fds_bits[_tmp] &= ~(1UL<<_rem); | ||
91 | } | ||
92 | |||
93 | #undef __FD_ISSET | ||
94 | static inline int __FD_ISSET(unsigned long fd, const __kernel_fd_set *fdsetp) | ||
95 | { | ||
96 | unsigned long _tmp = fd / __NFDBITS; | ||
97 | unsigned long _rem = fd % __NFDBITS; | ||
98 | return (fdsetp->fds_bits[_tmp] & (1UL<<_rem)) != 0; | ||
99 | } | ||
100 | |||
101 | #undef __FD_ZERO | ||
102 | #define __FD_ZERO(fdsetp) \ | ||
103 | ((void) memset ((void *) (fdsetp), 0, sizeof (__kernel_fd_set))) | ||
104 | 54 | ||
105 | #endif /* __KERNEL__ */ | 55 | #include <asm-generic/posix_types.h> |
106 | 56 | ||
107 | #endif | 57 | #endif |
diff --git a/arch/sh/include/asm/posix_types_32.h b/arch/sh/include/asm/posix_types_32.h index 6a9ceaaf1aea..abda58467ece 100644 --- a/arch/sh/include/asm/posix_types_32.h +++ b/arch/sh/include/asm/posix_types_32.h | |||
@@ -12,11 +12,6 @@ typedef unsigned short __kernel_uid_t; | |||
12 | typedef unsigned short __kernel_gid_t; | 12 | typedef unsigned short __kernel_gid_t; |
13 | #define __kernel_gid_t __kernel_gid_t | 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 | typedef unsigned short __kernel_old_uid_t; | 15 | typedef unsigned short __kernel_old_uid_t; |
21 | #define __kernel_old_uid_t __kernel_old_uid_t | 16 | #define __kernel_old_uid_t __kernel_old_uid_t |
22 | typedef unsigned short __kernel_old_gid_t; | 17 | typedef unsigned short __kernel_old_gid_t; |
diff --git a/arch/sh/include/asm/posix_types_64.h b/arch/sh/include/asm/posix_types_64.h index 8cd11485c06b..fcda07b4a616 100644 --- a/arch/sh/include/asm/posix_types_64.h +++ b/arch/sh/include/asm/posix_types_64.h | |||
@@ -17,10 +17,6 @@ typedef int __kernel_ssize_t; | |||
17 | #define __kernel_ssize_t __kernel_ssize_t | 17 | #define __kernel_ssize_t __kernel_ssize_t |
18 | typedef int __kernel_ptrdiff_t; | 18 | typedef int __kernel_ptrdiff_t; |
19 | #define __kernel_ptrdiff_t __kernel_ptrdiff_t | 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 | typedef unsigned short __kernel_old_uid_t; | 21 | typedef unsigned short __kernel_old_uid_t; |
26 | #define __kernel_old_uid_t __kernel_old_uid_t | 22 | #define __kernel_old_uid_t __kernel_old_uid_t |
diff --git a/arch/sparc/include/asm/posix_types.h b/arch/sparc/include/asm/posix_types.h index dbfc1a34b3a2..3070f25ae90a 100644 --- a/arch/sparc/include/asm/posix_types.h +++ b/arch/sparc/include/asm/posix_types.h | |||
@@ -9,35 +9,16 @@ | |||
9 | 9 | ||
10 | #if defined(__sparc__) && defined(__arch64__) | 10 | #if defined(__sparc__) && defined(__arch64__) |
11 | /* sparc 64 bit */ | 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 | typedef unsigned int __kernel_nlink_t; | 12 | typedef unsigned int __kernel_nlink_t; |
24 | typedef int __kernel_daddr_t; | 13 | #define __kernel_nlink_t __kernel_nlink_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; | ||
31 | 14 | ||
32 | typedef unsigned short __kernel_old_uid_t; | 15 | typedef unsigned short __kernel_old_uid_t; |
33 | typedef unsigned short __kernel_old_gid_t; | 16 | typedef unsigned short __kernel_old_gid_t; |
34 | typedef __kernel_uid_t __kernel_uid32_t; | 17 | #define __kernel_old_uid_t __kernel_old_uid_t |
35 | typedef __kernel_gid_t __kernel_gid32_t; | ||
36 | |||
37 | typedef unsigned int __kernel_old_dev_t; | ||
38 | 18 | ||
39 | /* Note this piece of asymmetry from the v9 ABI. */ | 19 | /* Note this piece of asymmetry from the v9 ABI. */ |
40 | typedef int __kernel_suseconds_t; | 20 | typedef int __kernel_suseconds_t; |
21 | #define __kernel_suseconds_t __kernel_suseconds_t | ||
41 | 22 | ||
42 | #else | 23 | #else |
43 | /* sparc 32 bit */ | 24 | /* sparc 32 bit */ |
@@ -45,109 +26,29 @@ typedef int __kernel_suseconds_t; | |||
45 | typedef unsigned int __kernel_size_t; | 26 | typedef unsigned int __kernel_size_t; |
46 | typedef int __kernel_ssize_t; | 27 | typedef int __kernel_ssize_t; |
47 | typedef long int __kernel_ptrdiff_t; | 28 | typedef long int __kernel_ptrdiff_t; |
48 | typedef long __kernel_time_t; | 29 | #define __kernel_size_t __kernel_size_t |
49 | typedef long __kernel_suseconds_t; | 30 | |
50 | typedef long __kernel_clock_t; | ||
51 | typedef int __kernel_pid_t; | ||
52 | typedef unsigned short __kernel_ipc_pid_t; | 31 | typedef unsigned short __kernel_ipc_pid_t; |
32 | #define __kernel_ipc_pid_t __kernel_ipc_pid_t | ||
33 | |||
53 | typedef unsigned short __kernel_uid_t; | 34 | typedef unsigned short __kernel_uid_t; |
54 | typedef unsigned short __kernel_gid_t; | 35 | typedef unsigned short __kernel_gid_t; |
55 | typedef unsigned long __kernel_ino_t; | 36 | #define __kernel_uid_t __kernel_uid_t |
37 | |||
56 | typedef unsigned short __kernel_mode_t; | 38 | typedef unsigned short __kernel_mode_t; |
39 | #define __kernel_mode_t __kernel_mode_t | ||
40 | |||
57 | typedef short __kernel_nlink_t; | 41 | typedef short __kernel_nlink_t; |
42 | #define __kernel_nlink_t __kernel_nlink_t | ||
43 | |||
58 | typedef long __kernel_daddr_t; | 44 | typedef long __kernel_daddr_t; |
59 | typedef long __kernel_off_t; | 45 | #define __kernel_daddr_t __kernel_daddr_t |
60 | typedef char * __kernel_caddr_t; | 46 | |
61 | typedef unsigned short __kernel_uid16_t; | ||
62 | typedef unsigned short __kernel_gid16_t; | ||
63 | typedef unsigned int __kernel_uid32_t; | ||
64 | typedef unsigned int __kernel_gid32_t; | ||
65 | typedef unsigned short __kernel_old_uid_t; | ||
66 | typedef unsigned short __kernel_old_gid_t; | ||
67 | typedef unsigned short __kernel_old_dev_t; | 47 | typedef unsigned short __kernel_old_dev_t; |
68 | typedef int __kernel_clockid_t; | 48 | #define __kernel_old_dev_t __kernel_old_dev_t |
69 | typedef int __kernel_timer_t; | ||
70 | 49 | ||
71 | #endif /* defined(__sparc__) && defined(__arch64__) */ | 50 | #endif /* defined(__sparc__) && defined(__arch64__) */ |
72 | 51 | ||
73 | #ifdef __GNUC__ | 52 | #include <asm-generic/posix_types.h> |
74 | typedef long long __kernel_loff_t; | ||
75 | #endif | ||
76 | |||
77 | typedef struct { | ||
78 | int val[2]; | ||
79 | } __kernel_fsid_t; | ||
80 | |||
81 | #ifdef __KERNEL__ | ||
82 | |||
83 | #undef __FD_SET | ||
84 | static inline void __FD_SET(unsigned long fd, __kernel_fd_set *fdsetp) | ||
85 | { | ||
86 | unsigned long _tmp = fd / __NFDBITS; | ||
87 | unsigned long _rem = fd % __NFDBITS; | ||
88 | fdsetp->fds_bits[_tmp] |= (1UL<<_rem); | ||
89 | } | ||
90 | |||
91 | #undef __FD_CLR | ||
92 | static inline void __FD_CLR(unsigned long fd, __kernel_fd_set *fdsetp) | ||
93 | { | ||
94 | unsigned long _tmp = fd / __NFDBITS; | ||
95 | unsigned long _rem = fd % __NFDBITS; | ||
96 | fdsetp->fds_bits[_tmp] &= ~(1UL<<_rem); | ||
97 | } | ||
98 | |||
99 | #undef __FD_ISSET | ||
100 | static inline int __FD_ISSET(unsigned long fd, __const__ __kernel_fd_set *p) | ||
101 | { | ||
102 | unsigned long _tmp = fd / __NFDBITS; | ||
103 | unsigned long _rem = fd % __NFDBITS; | ||
104 | return (p->fds_bits[_tmp] & (1UL<<_rem)) != 0; | ||
105 | } | ||
106 | |||
107 | /* | ||
108 | * This will unroll the loop for the normal constant cases (8 or 32 longs, | ||
109 | * for 256 and 1024-bit fd_sets respectively) | ||
110 | */ | ||
111 | #undef __FD_ZERO | ||
112 | static inline void __FD_ZERO(__kernel_fd_set *p) | ||
113 | { | ||
114 | unsigned long *tmp = p->fds_bits; | ||
115 | int i; | ||
116 | |||
117 | if (__builtin_constant_p(__FDSET_LONGS)) { | ||
118 | switch (__FDSET_LONGS) { | ||
119 | case 32: | ||
120 | tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; | ||
121 | tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; | ||
122 | tmp[ 8] = 0; tmp[ 9] = 0; tmp[10] = 0; tmp[11] = 0; | ||
123 | tmp[12] = 0; tmp[13] = 0; tmp[14] = 0; tmp[15] = 0; | ||
124 | tmp[16] = 0; tmp[17] = 0; tmp[18] = 0; tmp[19] = 0; | ||
125 | tmp[20] = 0; tmp[21] = 0; tmp[22] = 0; tmp[23] = 0; | ||
126 | tmp[24] = 0; tmp[25] = 0; tmp[26] = 0; tmp[27] = 0; | ||
127 | tmp[28] = 0; tmp[29] = 0; tmp[30] = 0; tmp[31] = 0; | ||
128 | return; | ||
129 | case 16: | ||
130 | tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; | ||
131 | tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; | ||
132 | tmp[ 8] = 0; tmp[ 9] = 0; tmp[10] = 0; tmp[11] = 0; | ||
133 | tmp[12] = 0; tmp[13] = 0; tmp[14] = 0; tmp[15] = 0; | ||
134 | return; | ||
135 | case 8: | ||
136 | tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; | ||
137 | tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; | ||
138 | return; | ||
139 | case 4: | ||
140 | tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; | ||
141 | return; | ||
142 | } | ||
143 | } | ||
144 | i = __FDSET_LONGS; | ||
145 | while (i) { | ||
146 | i--; | ||
147 | *tmp = 0; | ||
148 | tmp++; | ||
149 | } | ||
150 | } | ||
151 | 53 | ||
152 | #endif /* __KERNEL__ */ | ||
153 | #endif /* __SPARC_POSIX_TYPES_H */ | 54 | #endif /* __SPARC_POSIX_TYPES_H */ |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index abfb953c131d..1d14cc6b79ad 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -2163,9 +2163,9 @@ config IA32_EMULATION | |||
2163 | depends on X86_64 | 2163 | depends on X86_64 |
2164 | select COMPAT_BINFMT_ELF | 2164 | select COMPAT_BINFMT_ELF |
2165 | ---help--- | 2165 | ---help--- |
2166 | Include code to run 32-bit programs under a 64-bit kernel. You should | 2166 | Include code to run legacy 32-bit programs under a |
2167 | likely turn this on, unless you're 100% sure that you don't have any | 2167 | 64-bit kernel. You should likely turn this on, unless you're |
2168 | 32-bit programs left. | 2168 | 100% sure that you don't have any 32-bit programs left. |
2169 | 2169 | ||
2170 | config IA32_AOUT | 2170 | config IA32_AOUT |
2171 | tristate "IA32 a.out support" | 2171 | tristate "IA32 a.out support" |
@@ -2173,9 +2173,22 @@ config IA32_AOUT | |||
2173 | ---help--- | 2173 | ---help--- |
2174 | Support old a.out binaries in the 32bit emulation. | 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 | config COMPAT | 2189 | config COMPAT |
2177 | def_bool y | 2190 | def_bool y |
2178 | depends on IA32_EMULATION | 2191 | depends on IA32_EMULATION || X86_X32 |
2179 | select ARCH_WANT_OLD_COMPAT_IPC | 2192 | select ARCH_WANT_OLD_COMPAT_IPC |
2180 | 2193 | ||
2181 | config COMPAT_FOR_U64_ALIGNMENT | 2194 | config COMPAT_FOR_U64_ALIGNMENT |
diff --git a/arch/x86/Makefile b/arch/x86/Makefile index 209ba1294592..968dbe24a255 100644 --- a/arch/x86/Makefile +++ b/arch/x86/Makefile | |||
@@ -82,6 +82,22 @@ ifdef CONFIG_CC_STACKPROTECTOR | |||
82 | endif | 82 | endif |
83 | endif | 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 | # Don't unroll struct assignments with kmemcheck enabled | 101 | # Don't unroll struct assignments with kmemcheck enabled |
86 | ifeq ($(CONFIG_KMEMCHECK),y) | 102 | ifeq ($(CONFIG_KMEMCHECK),y) |
87 | KBUILD_CFLAGS += $(call cc-option,-fno-builtin-memcpy) | 103 | KBUILD_CFLAGS += $(call cc-option,-fno-builtin-memcpy) |
diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c index 5563ba1cf513..8ff8e7ddfc55 100644 --- a/arch/x86/ia32/ia32_signal.c +++ b/arch/x86/ia32/ia32_signal.c | |||
@@ -12,10 +12,8 @@ | |||
12 | #include <linux/mm.h> | 12 | #include <linux/mm.h> |
13 | #include <linux/smp.h> | 13 | #include <linux/smp.h> |
14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
15 | #include <linux/signal.h> | ||
16 | #include <linux/errno.h> | 15 | #include <linux/errno.h> |
17 | #include <linux/wait.h> | 16 | #include <linux/wait.h> |
18 | #include <linux/ptrace.h> | ||
19 | #include <linux/unistd.h> | 17 | #include <linux/unistd.h> |
20 | #include <linux/stddef.h> | 18 | #include <linux/stddef.h> |
21 | #include <linux/personality.h> | 19 | #include <linux/personality.h> |
@@ -32,20 +30,15 @@ | |||
32 | #include <asm/proto.h> | 30 | #include <asm/proto.h> |
33 | #include <asm/vdso.h> | 31 | #include <asm/vdso.h> |
34 | #include <asm/sigframe.h> | 32 | #include <asm/sigframe.h> |
33 | #include <asm/sighandling.h> | ||
35 | #include <asm/sys_ia32.h> | 34 | #include <asm/sys_ia32.h> |
36 | 35 | ||
37 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) | 36 | #define FIX_EFLAGS __FIX_EFLAGS |
38 | |||
39 | #define FIX_EFLAGS (X86_EFLAGS_AC | X86_EFLAGS_OF | \ | ||
40 | X86_EFLAGS_DF | X86_EFLAGS_TF | X86_EFLAGS_SF | \ | ||
41 | X86_EFLAGS_ZF | X86_EFLAGS_AF | X86_EFLAGS_PF | \ | ||
42 | X86_EFLAGS_CF) | ||
43 | |||
44 | void signal_fault(struct pt_regs *regs, void __user *frame, char *where); | ||
45 | 37 | ||
46 | int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from) | 38 | int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from) |
47 | { | 39 | { |
48 | int err = 0; | 40 | int err = 0; |
41 | bool ia32 = is_ia32_task(); | ||
49 | 42 | ||
50 | if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t))) | 43 | if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t))) |
51 | return -EFAULT; | 44 | return -EFAULT; |
@@ -75,8 +68,13 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from) | |||
75 | case __SI_FAULT >> 16: | 68 | case __SI_FAULT >> 16: |
76 | break; | 69 | break; |
77 | case __SI_CHLD >> 16: | 70 | case __SI_CHLD >> 16: |
78 | put_user_ex(from->si_utime, &to->si_utime); | 71 | if (ia32) { |
79 | put_user_ex(from->si_stime, &to->si_stime); | 72 | put_user_ex(from->si_utime, &to->si_utime); |
73 | put_user_ex(from->si_stime, &to->si_stime); | ||
74 | } else { | ||
75 | put_user_ex(from->si_utime, &to->_sifields._sigchld_x32._utime); | ||
76 | put_user_ex(from->si_stime, &to->_sifields._sigchld_x32._stime); | ||
77 | } | ||
80 | put_user_ex(from->si_status, &to->si_status); | 78 | put_user_ex(from->si_status, &to->si_status); |
81 | /* FALL THROUGH */ | 79 | /* FALL THROUGH */ |
82 | default: | 80 | default: |
diff --git a/arch/x86/ia32/sys_ia32.c b/arch/x86/ia32/sys_ia32.c index f6f5c53dc903..aec2202a596c 100644 --- a/arch/x86/ia32/sys_ia32.c +++ b/arch/x86/ia32/sys_ia32.c | |||
@@ -287,46 +287,6 @@ asmlinkage long sys32_sigaction(int sig, struct old_sigaction32 __user *act, | |||
287 | return ret; | 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 | asmlinkage long sys32_alarm(unsigned int seconds) | 290 | asmlinkage long sys32_alarm(unsigned int seconds) |
331 | { | 291 | { |
332 | return alarm_setitimer(seconds); | 292 | return alarm_setitimer(seconds); |
diff --git a/arch/x86/include/asm/Kbuild b/arch/x86/include/asm/Kbuild index b57e6a43a37a..f9c0d3ba9e84 100644 --- a/arch/x86/include/asm/Kbuild +++ b/arch/x86/include/asm/Kbuild | |||
@@ -14,6 +14,7 @@ header-y += msr.h | |||
14 | header-y += mtrr.h | 14 | header-y += mtrr.h |
15 | header-y += posix_types_32.h | 15 | header-y += posix_types_32.h |
16 | header-y += posix_types_64.h | 16 | header-y += posix_types_64.h |
17 | header-y += posix_types_x32.h | ||
17 | header-y += prctl.h | 18 | header-y += prctl.h |
18 | header-y += processor-flags.h | 19 | header-y += processor-flags.h |
19 | header-y += ptrace-abi.h | 20 | header-y += ptrace-abi.h |
@@ -24,3 +25,4 @@ header-y += vsyscall.h | |||
24 | 25 | ||
25 | genhdr-y += unistd_32.h | 26 | genhdr-y += unistd_32.h |
26 | genhdr-y += unistd_64.h | 27 | genhdr-y += unistd_64.h |
28 | genhdr-y += unistd_x32.h | ||
diff --git a/arch/x86/include/asm/compat.h b/arch/x86/include/asm/compat.h index 30d737ef2a42..355edc091604 100644 --- a/arch/x86/include/asm/compat.h +++ b/arch/x86/include/asm/compat.h | |||
@@ -6,7 +6,9 @@ | |||
6 | */ | 6 | */ |
7 | #include <linux/types.h> | 7 | #include <linux/types.h> |
8 | #include <linux/sched.h> | 8 | #include <linux/sched.h> |
9 | #include <asm/processor.h> | ||
9 | #include <asm/user32.h> | 10 | #include <asm/user32.h> |
11 | #include <asm/unistd.h> | ||
10 | 12 | ||
11 | #define COMPAT_USER_HZ 100 | 13 | #define COMPAT_USER_HZ 100 |
12 | #define COMPAT_UTS_MACHINE "i686\0\0" | 14 | #define COMPAT_UTS_MACHINE "i686\0\0" |
@@ -186,7 +188,20 @@ struct compat_shmid64_ds { | |||
186 | /* | 188 | /* |
187 | * The type of struct elf_prstatus.pr_reg in compatible core dumps. | 189 | * The type of struct elf_prstatus.pr_reg in compatible core dumps. |
188 | */ | 190 | */ |
191 | #ifdef CONFIG_X86_X32_ABI | ||
192 | typedef struct user_regs_struct compat_elf_gregset_t; | ||
193 | |||
194 | #define PR_REG_SIZE(S) (test_thread_flag(TIF_IA32) ? 68 : 216) | ||
195 | #define PRSTATUS_SIZE(S) (test_thread_flag(TIF_IA32) ? 144 : 296) | ||
196 | #define SET_PR_FPVALID(S,V) \ | ||
197 | do { *(int *) (((void *) &((S)->pr_reg)) + PR_REG_SIZE(0)) = (V); } \ | ||
198 | while (0) | ||
199 | |||
200 | #define COMPAT_USE_64BIT_TIME \ | ||
201 | (!!(task_pt_regs(current)->orig_ax & __X32_SYSCALL_BIT)) | ||
202 | #else | ||
189 | typedef struct user_regs_struct32 compat_elf_gregset_t; | 203 | typedef struct user_regs_struct32 compat_elf_gregset_t; |
204 | #endif | ||
190 | 205 | ||
191 | /* | 206 | /* |
192 | * A pointer passed in from user mode. This should not | 207 | * A pointer passed in from user mode. This should not |
@@ -208,13 +223,39 @@ static inline compat_uptr_t ptr_to_compat(void __user *uptr) | |||
208 | 223 | ||
209 | static inline void __user *arch_compat_alloc_user_space(long len) | 224 | static inline void __user *arch_compat_alloc_user_space(long len) |
210 | { | 225 | { |
211 | struct pt_regs *regs = task_pt_regs(current); | 226 | compat_uptr_t sp; |
212 | return (void __user *)regs->sp - len; | 227 | |
228 | if (test_thread_flag(TIF_IA32)) { | ||
229 | sp = task_pt_regs(current)->sp; | ||
230 | } else { | ||
231 | /* -128 for the x32 ABI redzone */ | ||
232 | sp = percpu_read(old_rsp) - 128; | ||
233 | } | ||
234 | |||
235 | return (void __user *)round_down(sp - len, 16); | ||
236 | } | ||
237 | |||
238 | static inline bool is_ia32_task(void) | ||
239 | { | ||
240 | #ifdef CONFIG_IA32_EMULATION | ||
241 | if (current_thread_info()->status & TS_COMPAT) | ||
242 | return true; | ||
243 | #endif | ||
244 | return false; | ||
245 | } | ||
246 | |||
247 | static inline bool is_x32_task(void) | ||
248 | { | ||
249 | #ifdef CONFIG_X86_X32_ABI | ||
250 | if (task_pt_regs(current)->orig_ax & __X32_SYSCALL_BIT) | ||
251 | return true; | ||
252 | #endif | ||
253 | return false; | ||
213 | } | 254 | } |
214 | 255 | ||
215 | static inline int is_compat_task(void) | 256 | static inline bool is_compat_task(void) |
216 | { | 257 | { |
217 | return current_thread_info()->status & TS_COMPAT; | 258 | return is_ia32_task() || is_x32_task(); |
218 | } | 259 | } |
219 | 260 | ||
220 | #endif /* _ASM_X86_COMPAT_H */ | 261 | #endif /* _ASM_X86_COMPAT_H */ |
diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h index f27f79abe021..5939f44fe0c0 100644 --- a/arch/x86/include/asm/elf.h +++ b/arch/x86/include/asm/elf.h | |||
@@ -155,7 +155,12 @@ do { \ | |||
155 | #define elf_check_arch(x) \ | 155 | #define elf_check_arch(x) \ |
156 | ((x)->e_machine == EM_X86_64) | 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 | static inline void elf_common_init(struct thread_struct *t, | 165 | static inline void elf_common_init(struct thread_struct *t, |
161 | struct pt_regs *regs, const u16 ds) | 166 | struct pt_regs *regs, const u16 ds) |
@@ -178,8 +183,9 @@ static inline void elf_common_init(struct thread_struct *t, | |||
178 | void start_thread_ia32(struct pt_regs *regs, u32 new_ip, u32 new_sp); | 183 | void start_thread_ia32(struct pt_regs *regs, u32 new_ip, u32 new_sp); |
179 | #define compat_start_thread start_thread_ia32 | 184 | #define compat_start_thread start_thread_ia32 |
180 | 185 | ||
181 | void set_personality_ia32(void); | 186 | void set_personality_ia32(bool); |
182 | #define COMPAT_SET_PERSONALITY(ex) set_personality_ia32() | 187 | #define COMPAT_SET_PERSONALITY(ex) \ |
188 | set_personality_ia32((ex).e_machine == EM_X86_64) | ||
183 | 189 | ||
184 | #define COMPAT_ELF_PLATFORM ("i686") | 190 | #define COMPAT_ELF_PLATFORM ("i686") |
185 | 191 | ||
@@ -286,7 +292,7 @@ do { \ | |||
286 | #define VDSO_HIGH_BASE 0xffffe000U /* CONFIG_COMPAT_VDSO address */ | 292 | #define VDSO_HIGH_BASE 0xffffe000U /* CONFIG_COMPAT_VDSO address */ |
287 | 293 | ||
288 | /* 1GB for 64bit, 8MB for 32bit */ | 294 | /* 1GB for 64bit, 8MB for 32bit */ |
289 | #define STACK_RND_MASK (test_thread_flag(TIF_IA32) ? 0x7ff : 0x3fffff) | 295 | #define STACK_RND_MASK (test_thread_flag(TIF_ADDR32) ? 0x7ff : 0x3fffff) |
290 | 296 | ||
291 | #define ARCH_DLINFO \ | 297 | #define ARCH_DLINFO \ |
292 | do { \ | 298 | do { \ |
@@ -295,9 +301,20 @@ do { \ | |||
295 | (unsigned long)current->mm->context.vdso); \ | 301 | (unsigned long)current->mm->context.vdso); \ |
296 | } while (0) | 302 | } while (0) |
297 | 303 | ||
304 | #define ARCH_DLINFO_X32 \ | ||
305 | do { \ | ||
306 | if (vdso_enabled) \ | ||
307 | NEW_AUX_ENT(AT_SYSINFO_EHDR, \ | ||
308 | (unsigned long)current->mm->context.vdso); \ | ||
309 | } while (0) | ||
310 | |||
298 | #define AT_SYSINFO 32 | 311 | #define AT_SYSINFO 32 |
299 | 312 | ||
300 | #define COMPAT_ARCH_DLINFO ARCH_DLINFO_IA32(sysctl_vsyscall32) | 313 | #define COMPAT_ARCH_DLINFO \ |
314 | if (test_thread_flag(TIF_X32)) \ | ||
315 | ARCH_DLINFO_X32; \ | ||
316 | else \ | ||
317 | ARCH_DLINFO_IA32(sysctl_vsyscall32) | ||
301 | 318 | ||
302 | #define COMPAT_ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE + 0x1000000) | 319 | #define COMPAT_ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE + 0x1000000) |
303 | 320 | ||
@@ -313,6 +330,8 @@ struct linux_binprm; | |||
313 | #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1 | 330 | #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1 |
314 | extern int arch_setup_additional_pages(struct linux_binprm *bprm, | 331 | extern int arch_setup_additional_pages(struct linux_binprm *bprm, |
315 | int uses_interp); | 332 | int uses_interp); |
333 | extern int x32_setup_additional_pages(struct linux_binprm *bprm, | ||
334 | int uses_interp); | ||
316 | 335 | ||
317 | extern int syscall32_setup_pages(struct linux_binprm *, int exstack); | 336 | extern int syscall32_setup_pages(struct linux_binprm *, int exstack); |
318 | #define compat_arch_setup_additional_pages syscall32_setup_pages | 337 | #define compat_arch_setup_additional_pages syscall32_setup_pages |
@@ -329,7 +348,7 @@ static inline int mmap_is_ia32(void) | |||
329 | return 1; | 348 | return 1; |
330 | #endif | 349 | #endif |
331 | #ifdef CONFIG_IA32_EMULATION | 350 | #ifdef CONFIG_IA32_EMULATION |
332 | if (test_thread_flag(TIF_IA32)) | 351 | if (test_thread_flag(TIF_ADDR32)) |
333 | return 1; | 352 | return 1; |
334 | #endif | 353 | #endif |
335 | return 0; | 354 | return 0; |
diff --git a/arch/x86/include/asm/ia32.h b/arch/x86/include/asm/ia32.h index 1f7e62517284..ee52760549f0 100644 --- a/arch/x86/include/asm/ia32.h +++ b/arch/x86/include/asm/ia32.h | |||
@@ -43,6 +43,15 @@ struct ucontext_ia32 { | |||
43 | compat_sigset_t uc_sigmask; /* mask last for extensibility */ | 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 | /* This matches struct stat64 in glibc2.2, hence the absolutely | 55 | /* This matches struct stat64 in glibc2.2, hence the absolutely |
47 | * insane amounts of padding around dev_t's. | 56 | * insane amounts of padding around dev_t's. |
48 | */ | 57 | */ |
@@ -116,6 +125,15 @@ typedef struct compat_siginfo { | |||
116 | compat_clock_t _stime; | 125 | compat_clock_t _stime; |
117 | } _sigchld; | 126 | } _sigchld; |
118 | 127 | ||
128 | /* SIGCHLD (x32 version) */ | ||
129 | struct { | ||
130 | unsigned int _pid; /* which child */ | ||
131 | unsigned int _uid; /* sender's uid */ | ||
132 | int _status; /* exit code */ | ||
133 | compat_s64 _utime; | ||
134 | compat_s64 _stime; | ||
135 | } _sigchld_x32; | ||
136 | |||
119 | /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ | 137 | /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ |
120 | struct { | 138 | struct { |
121 | unsigned int _addr; /* faulting insn/memory ref. */ | 139 | unsigned int _addr; /* faulting insn/memory ref. */ |
diff --git a/arch/x86/include/asm/mtrr.h b/arch/x86/include/asm/mtrr.h index 4365ffdb461f..7e3f17f92c66 100644 --- a/arch/x86/include/asm/mtrr.h +++ b/arch/x86/include/asm/mtrr.h | |||
@@ -29,18 +29,18 @@ | |||
29 | 29 | ||
30 | #define MTRR_IOCTL_BASE 'M' | 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 | /* Warning: this structure has a different order from i386 | 32 | /* Warning: this structure has a different order from i386 |
39 | on x86-64. The 32bit emulation code takes care of that. | 33 | on x86-64. The 32bit emulation code takes care of that. |
40 | But you need to use this for 64bit, otherwise your X server | 34 | But you need to use this for 64bit, otherwise your X server |
41 | will break. */ | 35 | will break. */ |
42 | 36 | ||
43 | #ifdef __i386__ | 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 | struct mtrr_gentry { | 44 | struct mtrr_gentry { |
45 | unsigned int regnum; /* Register number */ | 45 | unsigned int regnum; /* Register number */ |
46 | unsigned long base; /* Base address */ | 46 | unsigned long base; /* Base address */ |
@@ -50,12 +50,20 @@ struct mtrr_gentry { | |||
50 | 50 | ||
51 | #else /* __i386__ */ | 51 | #else /* __i386__ */ |
52 | 52 | ||
53 | struct mtrr_sentry { | ||
54 | __u64 base; /* Base address */ | ||
55 | __u32 size; /* Size of region */ | ||
56 | __u32 type; /* Type of region */ | ||
57 | }; | ||
58 | |||
53 | struct mtrr_gentry { | 59 | struct mtrr_gentry { |
54 | unsigned long base; /* Base address */ | 60 | __u64 base; /* Base address */ |
55 | unsigned int size; /* Size of region */ | 61 | __u32 size; /* Size of region */ |
56 | unsigned int regnum; /* Register number */ | 62 | __u32 regnum; /* Register number */ |
57 | unsigned int type; /* Type of region */ | 63 | __u32 type; /* Type of region */ |
64 | __u32 _pad; /* Unused */ | ||
58 | }; | 65 | }; |
66 | |||
59 | #endif /* !__i386__ */ | 67 | #endif /* !__i386__ */ |
60 | 68 | ||
61 | struct mtrr_var_range { | 69 | struct mtrr_var_range { |
diff --git a/arch/x86/include/asm/posix_types.h b/arch/x86/include/asm/posix_types.h index bb7133dc155d..3427b7798dbc 100644 --- a/arch/x86/include/asm/posix_types.h +++ b/arch/x86/include/asm/posix_types.h | |||
@@ -7,7 +7,9 @@ | |||
7 | #else | 7 | #else |
8 | # ifdef __i386__ | 8 | # ifdef __i386__ |
9 | # include "posix_types_32.h" | 9 | # include "posix_types_32.h" |
10 | # else | 10 | # elif defined(__LP64__) |
11 | # include "posix_types_64.h" | 11 | # include "posix_types_64.h" |
12 | # else | ||
13 | # include "posix_types_x32.h" | ||
12 | # endif | 14 | # endif |
13 | #endif | 15 | #endif |
diff --git a/arch/x86/include/asm/posix_types_32.h b/arch/x86/include/asm/posix_types_32.h index f7d9adf82e53..99f262e04b91 100644 --- a/arch/x86/include/asm/posix_types_32.h +++ b/arch/x86/include/asm/posix_types_32.h | |||
@@ -7,79 +7,22 @@ | |||
7 | * assume GCC is being used. | 7 | * assume GCC is being used. |
8 | */ | 8 | */ |
9 | 9 | ||
10 | typedef unsigned long __kernel_ino_t; | ||
11 | typedef unsigned short __kernel_mode_t; | 10 | typedef unsigned short __kernel_mode_t; |
11 | #define __kernel_mode_t __kernel_mode_t | ||
12 | |||
12 | typedef unsigned short __kernel_nlink_t; | 13 | typedef unsigned short __kernel_nlink_t; |
13 | typedef long __kernel_off_t; | 14 | #define __kernel_nlink_t __kernel_nlink_t |
14 | typedef int __kernel_pid_t; | 15 | |
15 | typedef unsigned short __kernel_ipc_pid_t; | 16 | typedef unsigned short __kernel_ipc_pid_t; |
17 | #define __kernel_ipc_pid_t __kernel_ipc_pid_t | ||
18 | |||
16 | typedef unsigned short __kernel_uid_t; | 19 | typedef unsigned short __kernel_uid_t; |
17 | typedef unsigned short __kernel_gid_t; | 20 | typedef unsigned short __kernel_gid_t; |
18 | typedef unsigned int __kernel_size_t; | 21 | #define __kernel_uid_t __kernel_uid_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; | ||
32 | 22 | ||
33 | typedef unsigned short __kernel_old_uid_t; | ||
34 | typedef unsigned short __kernel_old_gid_t; | ||
35 | typedef unsigned short __kernel_old_dev_t; | 23 | typedef unsigned short __kernel_old_dev_t; |
24 | #define __kernel_old_dev_t __kernel_old_dev_t | ||
36 | 25 | ||
37 | #ifdef __GNUC__ | 26 | #include <asm-generic/posix_types.h> |
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__) */ | ||
84 | 27 | ||
85 | #endif /* _ASM_X86_POSIX_TYPES_32_H */ | 28 | #endif /* _ASM_X86_POSIX_TYPES_32_H */ |
diff --git a/arch/x86/include/asm/posix_types_64.h b/arch/x86/include/asm/posix_types_64.h index eb8d2d92b63e..cba0c1ead162 100644 --- a/arch/x86/include/asm/posix_types_64.h +++ b/arch/x86/include/asm/posix_types_64.h | |||
@@ -7,113 +7,13 @@ | |||
7 | * assume GCC is being used. | 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 | typedef unsigned short __kernel_old_uid_t; | 10 | typedef unsigned short __kernel_old_uid_t; |
40 | typedef unsigned short __kernel_old_gid_t; | 11 | typedef unsigned short __kernel_old_gid_t; |
41 | typedef __kernel_uid_t __kernel_uid32_t; | 12 | #define __kernel_old_uid_t __kernel_old_uid_t |
42 | typedef __kernel_gid_t __kernel_gid32_t; | ||
43 | 13 | ||
44 | typedef unsigned long __kernel_old_dev_t; | 14 | typedef unsigned long __kernel_old_dev_t; |
15 | #define __kernel_old_dev_t __kernel_old_dev_t | ||
45 | 16 | ||
46 | #ifdef __KERNEL__ | 17 | #include <asm-generic/posix_types.h> |
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__) */ | ||
118 | 18 | ||
119 | #endif /* _ASM_X86_POSIX_TYPES_64_H */ | 19 | #endif /* _ASM_X86_POSIX_TYPES_64_H */ |
diff --git a/arch/x86/include/asm/posix_types_x32.h b/arch/x86/include/asm/posix_types_x32.h new file mode 100644 index 000000000000..85f9bdafa93c --- /dev/null +++ b/arch/x86/include/asm/posix_types_x32.h | |||
@@ -0,0 +1,19 @@ | |||
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 */ | ||
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index a19542c1685e..f302ef6bb200 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h | |||
@@ -873,9 +873,9 @@ extern unsigned long thread_saved_pc(struct task_struct *tsk); | |||
873 | #define IA32_PAGE_OFFSET ((current->personality & ADDR_LIMIT_3GB) ? \ | 873 | #define IA32_PAGE_OFFSET ((current->personality & ADDR_LIMIT_3GB) ? \ |
874 | 0xc0000000 : 0xFFFFe000) | 874 | 0xc0000000 : 0xFFFFe000) |
875 | 875 | ||
876 | #define TASK_SIZE (test_thread_flag(TIF_IA32) ? \ | 876 | #define TASK_SIZE (test_thread_flag(TIF_ADDR32) ? \ |
877 | IA32_PAGE_OFFSET : TASK_SIZE_MAX) | 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 | IA32_PAGE_OFFSET : TASK_SIZE_MAX) | 879 | IA32_PAGE_OFFSET : TASK_SIZE_MAX) |
880 | 880 | ||
881 | #define STACK_TOP TASK_SIZE | 881 | #define STACK_TOP TASK_SIZE |
@@ -897,6 +897,12 @@ extern unsigned long thread_saved_pc(struct task_struct *tsk); | |||
897 | 897 | ||
898 | #define task_pt_regs(tsk) ((struct pt_regs *)(tsk)->thread.sp0 - 1) | 898 | #define task_pt_regs(tsk) ((struct pt_regs *)(tsk)->thread.sp0 - 1) |
899 | extern unsigned long KSTK_ESP(struct task_struct *task); | 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 | #endif /* CONFIG_X86_64 */ | 906 | #endif /* CONFIG_X86_64 */ |
901 | 907 | ||
902 | extern void start_thread(struct pt_regs *regs, unsigned long new_ip, | 908 | extern void start_thread(struct pt_regs *regs, unsigned long new_ip, |
diff --git a/arch/x86/include/asm/ptrace.h b/arch/x86/include/asm/ptrace.h index 35664547125b..dcfde52979c3 100644 --- a/arch/x86/include/asm/ptrace.h +++ b/arch/x86/include/asm/ptrace.h | |||
@@ -145,7 +145,6 @@ extern unsigned long | |||
145 | convert_ip_to_linear(struct task_struct *child, struct pt_regs *regs); | 145 | convert_ip_to_linear(struct task_struct *child, struct pt_regs *regs); |
146 | extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, | 146 | extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, |
147 | int error_code, int si_code); | 147 | int error_code, int si_code); |
148 | void signal_fault(struct pt_regs *regs, void __user *frame, char *where); | ||
149 | 148 | ||
150 | extern long syscall_trace_enter(struct pt_regs *); | 149 | extern long syscall_trace_enter(struct pt_regs *); |
151 | extern void syscall_trace_leave(struct pt_regs *); | 150 | extern void syscall_trace_leave(struct pt_regs *); |
diff --git a/arch/x86/include/asm/sigcontext.h b/arch/x86/include/asm/sigcontext.h index 04459d25e66e..4a085383af27 100644 --- a/arch/x86/include/asm/sigcontext.h +++ b/arch/x86/include/asm/sigcontext.h | |||
@@ -230,34 +230,37 @@ struct sigcontext { | |||
230 | * User-space might still rely on the old definition: | 230 | * User-space might still rely on the old definition: |
231 | */ | 231 | */ |
232 | struct sigcontext { | 232 | struct sigcontext { |
233 | unsigned long r8; | 233 | __u64 r8; |
234 | unsigned long r9; | 234 | __u64 r9; |
235 | unsigned long r10; | 235 | __u64 r10; |
236 | unsigned long r11; | 236 | __u64 r11; |
237 | unsigned long r12; | 237 | __u64 r12; |
238 | unsigned long r13; | 238 | __u64 r13; |
239 | unsigned long r14; | 239 | __u64 r14; |
240 | unsigned long r15; | 240 | __u64 r15; |
241 | unsigned long rdi; | 241 | __u64 rdi; |
242 | unsigned long rsi; | 242 | __u64 rsi; |
243 | unsigned long rbp; | 243 | __u64 rbp; |
244 | unsigned long rbx; | 244 | __u64 rbx; |
245 | unsigned long rdx; | 245 | __u64 rdx; |
246 | unsigned long rax; | 246 | __u64 rax; |
247 | unsigned long rcx; | 247 | __u64 rcx; |
248 | unsigned long rsp; | 248 | __u64 rsp; |
249 | unsigned long rip; | 249 | __u64 rip; |
250 | unsigned long eflags; /* RFLAGS */ | 250 | __u64 eflags; /* RFLAGS */ |
251 | unsigned short cs; | 251 | __u16 cs; |
252 | unsigned short gs; | 252 | __u16 gs; |
253 | unsigned short fs; | 253 | __u16 fs; |
254 | unsigned short __pad0; | 254 | __u16 __pad0; |
255 | unsigned long err; | 255 | __u64 err; |
256 | unsigned long trapno; | 256 | __u64 trapno; |
257 | unsigned long oldmask; | 257 | __u64 oldmask; |
258 | unsigned long cr2; | 258 | __u64 cr2; |
259 | struct _fpstate __user *fpstate; /* zero when no FPU context */ | 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 | #endif /* !__KERNEL__ */ | 265 | #endif /* !__KERNEL__ */ |
263 | 266 | ||
diff --git a/arch/x86/include/asm/sigframe.h b/arch/x86/include/asm/sigframe.h index 4e0fe26d27d3..7c7c27c97daa 100644 --- a/arch/x86/include/asm/sigframe.h +++ b/arch/x86/include/asm/sigframe.h | |||
@@ -59,12 +59,25 @@ struct rt_sigframe_ia32 { | |||
59 | #endif /* defined(CONFIG_X86_32) || defined(CONFIG_IA32_EMULATION) */ | 59 | #endif /* defined(CONFIG_X86_32) || defined(CONFIG_IA32_EMULATION) */ |
60 | 60 | ||
61 | #ifdef CONFIG_X86_64 | 61 | #ifdef CONFIG_X86_64 |
62 | |||
62 | struct rt_sigframe { | 63 | struct rt_sigframe { |
63 | char __user *pretcode; | 64 | char __user *pretcode; |
64 | struct ucontext uc; | 65 | struct ucontext uc; |
65 | struct siginfo info; | 66 | struct siginfo info; |
66 | /* fp state follows here */ | 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 | #endif /* CONFIG_X86_64 */ | 81 | #endif /* CONFIG_X86_64 */ |
69 | 82 | ||
70 | #endif /* _ASM_X86_SIGFRAME_H */ | 83 | #endif /* _ASM_X86_SIGFRAME_H */ |
diff --git a/arch/x86/include/asm/sighandling.h b/arch/x86/include/asm/sighandling.h new file mode 100644 index 000000000000..ada93b3b8c66 --- /dev/null +++ b/arch/x86/include/asm/sighandling.h | |||
@@ -0,0 +1,24 @@ | |||
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 */ | ||
diff --git a/arch/x86/include/asm/sys_ia32.h b/arch/x86/include/asm/sys_ia32.h index cb238526a9f1..3fda9db48819 100644 --- a/arch/x86/include/asm/sys_ia32.h +++ b/arch/x86/include/asm/sys_ia32.h | |||
@@ -10,6 +10,8 @@ | |||
10 | #ifndef _ASM_X86_SYS_IA32_H | 10 | #ifndef _ASM_X86_SYS_IA32_H |
11 | #define _ASM_X86_SYS_IA32_H | 11 | #define _ASM_X86_SYS_IA32_H |
12 | 12 | ||
13 | #ifdef CONFIG_COMPAT | ||
14 | |||
13 | #include <linux/compiler.h> | 15 | #include <linux/compiler.h> |
14 | #include <linux/linkage.h> | 16 | #include <linux/linkage.h> |
15 | #include <linux/types.h> | 17 | #include <linux/types.h> |
@@ -36,8 +38,6 @@ asmlinkage long sys32_rt_sigaction(int, struct sigaction32 __user *, | |||
36 | struct sigaction32 __user *, unsigned int); | 38 | struct sigaction32 __user *, unsigned int); |
37 | asmlinkage long sys32_sigaction(int, struct old_sigaction32 __user *, | 39 | asmlinkage long sys32_sigaction(int, struct old_sigaction32 __user *, |
38 | struct old_sigaction32 __user *); | 40 | struct old_sigaction32 __user *); |
39 | asmlinkage long sys32_rt_sigprocmask(int, compat_sigset_t __user *, | ||
40 | compat_sigset_t __user *, unsigned int); | ||
41 | asmlinkage long sys32_alarm(unsigned int); | 41 | asmlinkage long sys32_alarm(unsigned int); |
42 | 42 | ||
43 | asmlinkage long sys32_waitpid(compat_pid_t, unsigned int *, int); | 43 | asmlinkage long sys32_waitpid(compat_pid_t, unsigned int *, int); |
@@ -83,4 +83,7 @@ asmlinkage long sys32_ipc(u32, int, int, int, compat_uptr_t, u32); | |||
83 | 83 | ||
84 | asmlinkage long sys32_fanotify_mark(int, unsigned int, u32, u32, int, | 84 | asmlinkage long sys32_fanotify_mark(int, unsigned int, u32, u32, int, |
85 | const char __user *); | 85 | const char __user *); |
86 | |||
87 | #endif /* CONFIG_COMPAT */ | ||
88 | |||
86 | #endif /* _ASM_X86_SYS_IA32_H */ | 89 | #endif /* _ASM_X86_SYS_IA32_H */ |
diff --git a/arch/x86/include/asm/syscall.h b/arch/x86/include/asm/syscall.h index d962e5652a73..386b78686c4d 100644 --- a/arch/x86/include/asm/syscall.h +++ b/arch/x86/include/asm/syscall.h | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/sched.h> | 16 | #include <linux/sched.h> |
17 | #include <linux/err.h> | 17 | #include <linux/err.h> |
18 | #include <asm/asm-offsets.h> /* For NR_syscalls */ | 18 | #include <asm/asm-offsets.h> /* For NR_syscalls */ |
19 | #include <asm/unistd.h> | ||
19 | 20 | ||
20 | extern const unsigned long sys_call_table[]; | 21 | extern const unsigned long sys_call_table[]; |
21 | 22 | ||
@@ -26,13 +27,13 @@ extern const unsigned long sys_call_table[]; | |||
26 | */ | 27 | */ |
27 | static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs) | 28 | static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs) |
28 | { | 29 | { |
29 | return regs->orig_ax; | 30 | return regs->orig_ax & __SYSCALL_MASK; |
30 | } | 31 | } |
31 | 32 | ||
32 | static inline void syscall_rollback(struct task_struct *task, | 33 | static inline void syscall_rollback(struct task_struct *task, |
33 | struct pt_regs *regs) | 34 | struct pt_regs *regs) |
34 | { | 35 | { |
35 | regs->ax = regs->orig_ax; | 36 | regs->ax = regs->orig_ax & __SYSCALL_MASK; |
36 | } | 37 | } |
37 | 38 | ||
38 | static inline long syscall_get_error(struct task_struct *task, | 39 | static inline long syscall_get_error(struct task_struct *task, |
diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h index cfd8144d5527..af1db7e722f4 100644 --- a/arch/x86/include/asm/thread_info.h +++ b/arch/x86/include/asm/thread_info.h | |||
@@ -86,7 +86,7 @@ struct thread_info { | |||
86 | #define TIF_MCE_NOTIFY 10 /* notify userspace of an MCE */ | 86 | #define TIF_MCE_NOTIFY 10 /* notify userspace of an MCE */ |
87 | #define TIF_USER_RETURN_NOTIFY 11 /* notify kernel of userspace return */ | 87 | #define TIF_USER_RETURN_NOTIFY 11 /* notify kernel of userspace return */ |
88 | #define TIF_NOTSC 16 /* TSC is not accessible in userland */ | 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 | #define TIF_FORK 18 /* ret_from_fork */ | 90 | #define TIF_FORK 18 /* ret_from_fork */ |
91 | #define TIF_MEMDIE 20 /* is terminating due to OOM killer */ | 91 | #define TIF_MEMDIE 20 /* is terminating due to OOM killer */ |
92 | #define TIF_DEBUG 21 /* uses debug registers */ | 92 | #define TIF_DEBUG 21 /* uses debug registers */ |
@@ -95,6 +95,8 @@ struct thread_info { | |||
95 | #define TIF_BLOCKSTEP 25 /* set when we want DEBUGCTLMSR_BTF */ | 95 | #define TIF_BLOCKSTEP 25 /* set when we want DEBUGCTLMSR_BTF */ |
96 | #define TIF_LAZY_MMU_UPDATES 27 /* task is updating the mmu lazily */ | 96 | #define TIF_LAZY_MMU_UPDATES 27 /* task is updating the mmu lazily */ |
97 | #define TIF_SYSCALL_TRACEPOINT 28 /* syscall tracepoint instrumentation */ | 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 | #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) | 101 | #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) |
100 | #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) | 102 | #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) |
@@ -116,6 +118,8 @@ struct thread_info { | |||
116 | #define _TIF_BLOCKSTEP (1 << TIF_BLOCKSTEP) | 118 | #define _TIF_BLOCKSTEP (1 << TIF_BLOCKSTEP) |
117 | #define _TIF_LAZY_MMU_UPDATES (1 << TIF_LAZY_MMU_UPDATES) | 119 | #define _TIF_LAZY_MMU_UPDATES (1 << TIF_LAZY_MMU_UPDATES) |
118 | #define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT) | 120 | #define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT) |
121 | #define _TIF_ADDR32 (1 << TIF_ADDR32) | ||
122 | #define _TIF_X32 (1 << TIF_X32) | ||
119 | 123 | ||
120 | /* work to do in syscall_trace_enter() */ | 124 | /* work to do in syscall_trace_enter() */ |
121 | #define _TIF_WORK_SYSCALL_ENTRY \ | 125 | #define _TIF_WORK_SYSCALL_ENTRY \ |
diff --git a/arch/x86/include/asm/unistd.h b/arch/x86/include/asm/unistd.h index 21f77b89e47a..37cdc9d99bb1 100644 --- a/arch/x86/include/asm/unistd.h +++ b/arch/x86/include/asm/unistd.h | |||
@@ -1,7 +1,17 @@ | |||
1 | #ifndef _ASM_X86_UNISTD_H | 1 | #ifndef _ASM_X86_UNISTD_H |
2 | #define _ASM_X86_UNISTD_H 1 | 2 | #define _ASM_X86_UNISTD_H 1 |
3 | 3 | ||
4 | /* x32 syscall flag bit */ | ||
5 | #define __X32_SYSCALL_BIT 0x40000000 | ||
6 | |||
4 | #ifdef __KERNEL__ | 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 | # ifdef CONFIG_X86_32 | 15 | # ifdef CONFIG_X86_32 |
6 | 16 | ||
7 | # include <asm/unistd_32.h> | 17 | # include <asm/unistd_32.h> |
@@ -14,6 +24,7 @@ | |||
14 | # else | 24 | # else |
15 | 25 | ||
16 | # include <asm/unistd_64.h> | 26 | # include <asm/unistd_64.h> |
27 | # include <asm/unistd_64_x32.h> | ||
17 | # define __ARCH_WANT_COMPAT_SYS_TIME | 28 | # define __ARCH_WANT_COMPAT_SYS_TIME |
18 | 29 | ||
19 | # endif | 30 | # endif |
@@ -52,8 +63,10 @@ | |||
52 | #else | 63 | #else |
53 | # ifdef __i386__ | 64 | # ifdef __i386__ |
54 | # include <asm/unistd_32.h> | 65 | # include <asm/unistd_32.h> |
55 | # else | 66 | # elif defined(__LP64__) |
56 | # include <asm/unistd_64.h> | 67 | # include <asm/unistd_64.h> |
68 | # else | ||
69 | # include <asm/unistd_x32.h> | ||
57 | # endif | 70 | # endif |
58 | #endif | 71 | #endif |
59 | 72 | ||
diff --git a/arch/x86/kernel/asm-offsets_64.c b/arch/x86/kernel/asm-offsets_64.c index 834e897b1e25..1b4754f82ba7 100644 --- a/arch/x86/kernel/asm-offsets_64.c +++ b/arch/x86/kernel/asm-offsets_64.c | |||
@@ -1,6 +1,12 @@ | |||
1 | #include <asm/ia32.h> | 1 | #include <asm/ia32.h> |
2 | 2 | ||
3 | #define __SYSCALL_64(nr, sym, compat) [nr] = 1, | 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 | static char syscalls_64[] = { | 10 | static char syscalls_64[] = { |
5 | #include <asm/syscalls_64.h> | 11 | #include <asm/syscalls_64.h> |
6 | }; | 12 | }; |
diff --git a/arch/x86/kernel/cpu/mtrr/if.c b/arch/x86/kernel/cpu/mtrr/if.c index 79289632cb27..a041e094b8b9 100644 --- a/arch/x86/kernel/cpu/mtrr/if.c +++ b/arch/x86/kernel/cpu/mtrr/if.c | |||
@@ -167,6 +167,7 @@ mtrr_ioctl(struct file *file, unsigned int cmd, unsigned long __arg) | |||
167 | { | 167 | { |
168 | int err = 0; | 168 | int err = 0; |
169 | mtrr_type type; | 169 | mtrr_type type; |
170 | unsigned long base; | ||
170 | unsigned long size; | 171 | unsigned long size; |
171 | struct mtrr_sentry sentry; | 172 | struct mtrr_sentry sentry; |
172 | struct mtrr_gentry gentry; | 173 | struct mtrr_gentry gentry; |
@@ -267,14 +268,14 @@ mtrr_ioctl(struct file *file, unsigned int cmd, unsigned long __arg) | |||
267 | #endif | 268 | #endif |
268 | if (gentry.regnum >= num_var_ranges) | 269 | if (gentry.regnum >= num_var_ranges) |
269 | return -EINVAL; | 270 | return -EINVAL; |
270 | mtrr_if->get(gentry.regnum, &gentry.base, &size, &type); | 271 | mtrr_if->get(gentry.regnum, &base, &size, &type); |
271 | 272 | ||
272 | /* Hide entries that go above 4GB */ | 273 | /* Hide entries that go above 4GB */ |
273 | if (gentry.base + size - 1 >= (1UL << (8 * sizeof(gentry.size) - PAGE_SHIFT)) | 274 | if (base + size - 1 >= (1UL << (8 * sizeof(gentry.size) - PAGE_SHIFT)) |
274 | || size >= (1UL << (8 * sizeof(gentry.size) - PAGE_SHIFT))) | 275 | || size >= (1UL << (8 * sizeof(gentry.size) - PAGE_SHIFT))) |
275 | gentry.base = gentry.size = gentry.type = 0; | 276 | gentry.base = gentry.size = gentry.type = 0; |
276 | else { | 277 | else { |
277 | gentry.base <<= PAGE_SHIFT; | 278 | gentry.base = base << PAGE_SHIFT; |
278 | gentry.size = size << PAGE_SHIFT; | 279 | gentry.size = size << PAGE_SHIFT; |
279 | gentry.type = type; | 280 | gentry.type = type; |
280 | } | 281 | } |
@@ -321,11 +322,12 @@ mtrr_ioctl(struct file *file, unsigned int cmd, unsigned long __arg) | |||
321 | #endif | 322 | #endif |
322 | if (gentry.regnum >= num_var_ranges) | 323 | if (gentry.regnum >= num_var_ranges) |
323 | return -EINVAL; | 324 | return -EINVAL; |
324 | mtrr_if->get(gentry.regnum, &gentry.base, &size, &type); | 325 | mtrr_if->get(gentry.regnum, &base, &size, &type); |
325 | /* Hide entries that would overflow */ | 326 | /* Hide entries that would overflow */ |
326 | if (size != (__typeof__(gentry.size))size) | 327 | if (size != (__typeof__(gentry.size))size) |
327 | gentry.base = gentry.size = gentry.type = 0; | 328 | gentry.base = gentry.size = gentry.type = 0; |
328 | else { | 329 | else { |
330 | gentry.base = base; | ||
329 | gentry.size = size; | 331 | gentry.size = size; |
330 | gentry.type = type; | 332 | gentry.type = type; |
331 | } | 333 | } |
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index fa2900c0e398..40883ffe2da9 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c | |||
@@ -29,7 +29,6 @@ | |||
29 | #include <asm/apic.h> | 29 | #include <asm/apic.h> |
30 | #include <asm/stacktrace.h> | 30 | #include <asm/stacktrace.h> |
31 | #include <asm/nmi.h> | 31 | #include <asm/nmi.h> |
32 | #include <asm/compat.h> | ||
33 | #include <asm/smp.h> | 32 | #include <asm/smp.h> |
34 | #include <asm/alternative.h> | 33 | #include <asm/alternative.h> |
35 | #include <asm/timer.h> | 34 | #include <asm/timer.h> |
@@ -1748,6 +1747,9 @@ perf_callchain_kernel(struct perf_callchain_entry *entry, struct pt_regs *regs) | |||
1748 | } | 1747 | } |
1749 | 1748 | ||
1750 | #ifdef CONFIG_COMPAT | 1749 | #ifdef CONFIG_COMPAT |
1750 | |||
1751 | #include <asm/compat.h> | ||
1752 | |||
1751 | static inline int | 1753 | static inline int |
1752 | perf_callchain_user32(struct pt_regs *regs, struct perf_callchain_entry *entry) | 1754 | perf_callchain_user32(struct pt_regs *regs, struct perf_callchain_entry *entry) |
1753 | { | 1755 | { |
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index 734ebd1d3caa..cdc79b5cfcd9 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
@@ -481,7 +481,12 @@ GLOBAL(system_call_after_swapgs) | |||
481 | testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) | 481 | testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) |
482 | jnz tracesys | 482 | jnz tracesys |
483 | system_call_fastpath: | 483 | system_call_fastpath: |
484 | #if __SYSCALL_MASK == ~0 | ||
484 | cmpq $__NR_syscall_max,%rax | 485 | cmpq $__NR_syscall_max,%rax |
486 | #else | ||
487 | andl $__SYSCALL_MASK,%eax | ||
488 | cmpl $__NR_syscall_max,%eax | ||
489 | #endif | ||
485 | ja badsys | 490 | ja badsys |
486 | movq %r10,%rcx | 491 | movq %r10,%rcx |
487 | call *sys_call_table(,%rax,8) # XXX: rip relative | 492 | call *sys_call_table(,%rax,8) # XXX: rip relative |
@@ -595,7 +600,12 @@ tracesys: | |||
595 | */ | 600 | */ |
596 | LOAD_ARGS ARGOFFSET, 1 | 601 | LOAD_ARGS ARGOFFSET, 1 |
597 | RESTORE_REST | 602 | RESTORE_REST |
603 | #if __SYSCALL_MASK == ~0 | ||
598 | cmpq $__NR_syscall_max,%rax | 604 | cmpq $__NR_syscall_max,%rax |
605 | #else | ||
606 | andl $__SYSCALL_MASK,%eax | ||
607 | cmpl $__NR_syscall_max,%eax | ||
608 | #endif | ||
599 | ja int_ret_from_sys_call /* RAX(%rsp) set to -ENOSYS above */ | 609 | ja int_ret_from_sys_call /* RAX(%rsp) set to -ENOSYS above */ |
600 | movq %r10,%rcx /* fixup for C */ | 610 | movq %r10,%rcx /* fixup for C */ |
601 | call *sys_call_table(,%rax,8) | 611 | call *sys_call_table(,%rax,8) |
@@ -735,6 +745,40 @@ ENTRY(stub_rt_sigreturn) | |||
735 | CFI_ENDPROC | 745 | CFI_ENDPROC |
736 | END(stub_rt_sigreturn) | 746 | END(stub_rt_sigreturn) |
737 | 747 | ||
748 | #ifdef CONFIG_X86_X32_ABI | ||
749 | PTREGSCALL stub_x32_sigaltstack, sys32_sigaltstack, %rdx | ||
750 | |||
751 | ENTRY(stub_x32_rt_sigreturn) | ||
752 | CFI_STARTPROC | ||
753 | addq $8, %rsp | ||
754 | PARTIAL_FRAME 0 | ||
755 | SAVE_REST | ||
756 | movq %rsp,%rdi | ||
757 | FIXUP_TOP_OF_STACK %r11 | ||
758 | call sys32_x32_rt_sigreturn | ||
759 | movq %rax,RAX(%rsp) # fixme, this could be done at the higher layer | ||
760 | RESTORE_REST | ||
761 | jmp int_ret_from_sys_call | ||
762 | CFI_ENDPROC | ||
763 | END(stub_x32_rt_sigreturn) | ||
764 | |||
765 | ENTRY(stub_x32_execve) | ||
766 | CFI_STARTPROC | ||
767 | addq $8, %rsp | ||
768 | PARTIAL_FRAME 0 | ||
769 | SAVE_REST | ||
770 | FIXUP_TOP_OF_STACK %r11 | ||
771 | movq %rsp, %rcx | ||
772 | call sys32_execve | ||
773 | RESTORE_TOP_OF_STACK %r11 | ||
774 | movq %rax,RAX(%rsp) | ||
775 | RESTORE_REST | ||
776 | jmp int_ret_from_sys_call | ||
777 | CFI_ENDPROC | ||
778 | END(stub_x32_execve) | ||
779 | |||
780 | #endif | ||
781 | |||
738 | /* | 782 | /* |
739 | * Build the entry stubs and pointer table with some assembler magic. | 783 | * Build the entry stubs and pointer table with some assembler magic. |
740 | * We pack 7 stubs into a single 32-byte chunk, which will fit in a | 784 | * We pack 7 stubs into a single 32-byte chunk, which will fit in a |
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 2b154da0b6d3..733ca39f367e 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c | |||
@@ -258,7 +258,9 @@ start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp) | |||
258 | void start_thread_ia32(struct pt_regs *regs, u32 new_ip, u32 new_sp) | 258 | void start_thread_ia32(struct pt_regs *regs, u32 new_ip, u32 new_sp) |
259 | { | 259 | { |
260 | start_thread_common(regs, new_ip, new_sp, | 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 | #endif | 265 | #endif |
264 | 266 | ||
@@ -381,6 +383,8 @@ void set_personality_64bit(void) | |||
381 | 383 | ||
382 | /* Make sure to be in 64bit mode */ | 384 | /* Make sure to be in 64bit mode */ |
383 | clear_thread_flag(TIF_IA32); | 385 | clear_thread_flag(TIF_IA32); |
386 | clear_thread_flag(TIF_ADDR32); | ||
387 | clear_thread_flag(TIF_X32); | ||
384 | 388 | ||
385 | /* Ensure the corresponding mm is not marked. */ | 389 | /* Ensure the corresponding mm is not marked. */ |
386 | if (current->mm) | 390 | if (current->mm) |
@@ -393,20 +397,31 @@ void set_personality_64bit(void) | |||
393 | current->personality &= ~READ_IMPLIES_EXEC; | 397 | current->personality &= ~READ_IMPLIES_EXEC; |
394 | } | 398 | } |
395 | 399 | ||
396 | void set_personality_ia32(void) | 400 | void set_personality_ia32(bool x32) |
397 | { | 401 | { |
398 | /* inherit personality from parent */ | 402 | /* inherit personality from parent */ |
399 | 403 | ||
400 | /* Make sure to be in 32bit mode */ | 404 | /* Make sure to be in 32bit mode */ |
401 | set_thread_flag(TIF_IA32); | 405 | set_thread_flag(TIF_ADDR32); |
402 | current->personality |= force_personality32; | ||
403 | 406 | ||
404 | /* Mark the associated mm as containing 32-bit tasks. */ | 407 | /* Mark the associated mm as containing 32-bit tasks. */ |
405 | if (current->mm) | 408 | if (current->mm) |
406 | current->mm->context.ia32_compat = 1; | 409 | current->mm->context.ia32_compat = 1; |
407 | 410 | ||
408 | /* Prepare the first "return" to user space */ | 411 | if (x32) { |
409 | current_thread_info()->status |= TS_COMPAT; | 412 | clear_thread_flag(TIF_IA32); |
413 | set_thread_flag(TIF_X32); | ||
414 | current->personality &= ~READ_IMPLIES_EXEC; | ||
415 | /* is_compat_task() uses the presence of the x32 | ||
416 | syscall bit flag to determine compat status */ | ||
417 | current_thread_info()->status &= ~TS_COMPAT; | ||
418 | } else { | ||
419 | set_thread_flag(TIF_IA32); | ||
420 | clear_thread_flag(TIF_X32); | ||
421 | current->personality |= force_personality32; | ||
422 | /* Prepare the first "return" to user space */ | ||
423 | current_thread_info()->status |= TS_COMPAT; | ||
424 | } | ||
410 | } | 425 | } |
411 | 426 | ||
412 | unsigned long get_wchan(struct task_struct *p) | 427 | unsigned long get_wchan(struct task_struct *p) |
diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c index 8a634c887652..284c35ae60e4 100644 --- a/arch/x86/kernel/ptrace.c +++ b/arch/x86/kernel/ptrace.c | |||
@@ -1130,6 +1130,100 @@ static int genregs32_set(struct task_struct *target, | |||
1130 | return ret; | 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 | long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | 1227 | long compat_arch_ptrace(struct task_struct *child, compat_long_t request, |
1134 | compat_ulong_t caddr, compat_ulong_t cdata) | 1228 | compat_ulong_t caddr, compat_ulong_t cdata) |
1135 | { | 1229 | { |
@@ -1139,6 +1233,11 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | |||
1139 | int ret; | 1233 | int ret; |
1140 | __u32 val; | 1234 | __u32 val; |
1141 | 1235 | ||
1236 | #ifdef CONFIG_X86_X32_ABI | ||
1237 | if (!is_ia32_task()) | ||
1238 | return x32_arch_ptrace(child, request, caddr, cdata); | ||
1239 | #endif | ||
1240 | |||
1142 | switch (request) { | 1241 | switch (request) { |
1143 | case PTRACE_PEEKUSR: | 1242 | case PTRACE_PEEKUSR: |
1144 | ret = getreg32(child, addr, &val); | 1243 | ret = getreg32(child, addr, &val); |
diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c index 25edcfc9ba5b..5134e17855f0 100644 --- a/arch/x86/kernel/signal.c +++ b/arch/x86/kernel/signal.c | |||
@@ -10,10 +10,8 @@ | |||
10 | #include <linux/mm.h> | 10 | #include <linux/mm.h> |
11 | #include <linux/smp.h> | 11 | #include <linux/smp.h> |
12 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
13 | #include <linux/signal.h> | ||
14 | #include <linux/errno.h> | 13 | #include <linux/errno.h> |
15 | #include <linux/wait.h> | 14 | #include <linux/wait.h> |
16 | #include <linux/ptrace.h> | ||
17 | #include <linux/tracehook.h> | 15 | #include <linux/tracehook.h> |
18 | #include <linux/unistd.h> | 16 | #include <linux/unistd.h> |
19 | #include <linux/stddef.h> | 17 | #include <linux/stddef.h> |
@@ -27,10 +25,12 @@ | |||
27 | #include <asm/fpu-internal.h> | 25 | #include <asm/fpu-internal.h> |
28 | #include <asm/vdso.h> | 26 | #include <asm/vdso.h> |
29 | #include <asm/mce.h> | 27 | #include <asm/mce.h> |
28 | #include <asm/sighandling.h> | ||
30 | 29 | ||
31 | #ifdef CONFIG_X86_64 | 30 | #ifdef CONFIG_X86_64 |
32 | #include <asm/proto.h> | 31 | #include <asm/proto.h> |
33 | #include <asm/ia32_unistd.h> | 32 | #include <asm/ia32_unistd.h> |
33 | #include <asm/sys_ia32.h> | ||
34 | #endif /* CONFIG_X86_64 */ | 34 | #endif /* CONFIG_X86_64 */ |
35 | 35 | ||
36 | #include <asm/syscall.h> | 36 | #include <asm/syscall.h> |
@@ -38,13 +38,6 @@ | |||
38 | 38 | ||
39 | #include <asm/sigframe.h> | 39 | #include <asm/sigframe.h> |
40 | 40 | ||
41 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) | ||
42 | |||
43 | #define __FIX_EFLAGS (X86_EFLAGS_AC | X86_EFLAGS_OF | \ | ||
44 | X86_EFLAGS_DF | X86_EFLAGS_TF | X86_EFLAGS_SF | \ | ||
45 | X86_EFLAGS_ZF | X86_EFLAGS_AF | X86_EFLAGS_PF | \ | ||
46 | X86_EFLAGS_CF) | ||
47 | |||
48 | #ifdef CONFIG_X86_32 | 41 | #ifdef CONFIG_X86_32 |
49 | # define FIX_EFLAGS (__FIX_EFLAGS | X86_EFLAGS_RF) | 42 | # define FIX_EFLAGS (__FIX_EFLAGS | X86_EFLAGS_RF) |
50 | #else | 43 | #else |
@@ -69,9 +62,8 @@ | |||
69 | regs->seg = GET_SEG(seg) | 3; \ | 62 | regs->seg = GET_SEG(seg) | 3; \ |
70 | } while (0) | 63 | } while (0) |
71 | 64 | ||
72 | static int | 65 | int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, |
73 | restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, | 66 | unsigned long *pax) |
74 | unsigned long *pax) | ||
75 | { | 67 | { |
76 | void __user *buf; | 68 | void __user *buf; |
77 | unsigned int tmpflags; | 69 | unsigned int tmpflags; |
@@ -126,9 +118,8 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, | |||
126 | return err; | 118 | return err; |
127 | } | 119 | } |
128 | 120 | ||
129 | static int | 121 | int setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate, |
130 | setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate, | 122 | struct pt_regs *regs, unsigned long mask) |
131 | struct pt_regs *regs, unsigned long mask) | ||
132 | { | 123 | { |
133 | int err = 0; | 124 | int err = 0; |
134 | 125 | ||
@@ -643,6 +634,16 @@ static int signr_convert(int sig) | |||
643 | #define is_ia32 0 | 634 | #define is_ia32 0 |
644 | #endif /* CONFIG_IA32_EMULATION */ | 635 | #endif /* CONFIG_IA32_EMULATION */ |
645 | 636 | ||
637 | #ifdef CONFIG_X86_X32_ABI | ||
638 | #define is_x32 test_thread_flag(TIF_X32) | ||
639 | |||
640 | static int x32_setup_rt_frame(int sig, struct k_sigaction *ka, | ||
641 | siginfo_t *info, compat_sigset_t *set, | ||
642 | struct pt_regs *regs); | ||
643 | #else /* !CONFIG_X86_X32_ABI */ | ||
644 | #define is_x32 0 | ||
645 | #endif /* CONFIG_X86_X32_ABI */ | ||
646 | |||
646 | int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | 647 | int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, |
647 | sigset_t *set, struct pt_regs *regs); | 648 | sigset_t *set, struct pt_regs *regs); |
648 | int ia32_setup_frame(int sig, struct k_sigaction *ka, | 649 | int ia32_setup_frame(int sig, struct k_sigaction *ka, |
@@ -667,8 +668,14 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
667 | ret = ia32_setup_rt_frame(usig, ka, info, set, regs); | 668 | ret = ia32_setup_rt_frame(usig, ka, info, set, regs); |
668 | else | 669 | else |
669 | ret = ia32_setup_frame(usig, ka, set, regs); | 670 | ret = ia32_setup_frame(usig, ka, set, regs); |
670 | } else | 671 | #ifdef CONFIG_X86_X32_ABI |
672 | } else if (is_x32) { | ||
673 | ret = x32_setup_rt_frame(usig, ka, info, | ||
674 | (compat_sigset_t *)set, regs); | ||
675 | #endif | ||
676 | } else { | ||
671 | ret = __setup_rt_frame(sig, ka, info, set, regs); | 677 | ret = __setup_rt_frame(sig, ka, info, set, regs); |
678 | } | ||
672 | 679 | ||
673 | if (ret) { | 680 | if (ret) { |
674 | force_sigsegv(sig, current); | 681 | force_sigsegv(sig, current); |
@@ -851,3 +858,102 @@ void signal_fault(struct pt_regs *regs, void __user *frame, char *where) | |||
851 | 858 | ||
852 | force_sig(SIGSEGV, me); | 859 | force_sig(SIGSEGV, me); |
853 | } | 860 | } |
861 | |||
862 | #ifdef CONFIG_X86_X32_ABI | ||
863 | static int x32_setup_rt_frame(int sig, struct k_sigaction *ka, | ||
864 | siginfo_t *info, compat_sigset_t *set, | ||
865 | struct pt_regs *regs) | ||
866 | { | ||
867 | struct rt_sigframe_x32 __user *frame; | ||
868 | void __user *restorer; | ||
869 | int err = 0; | ||
870 | void __user *fpstate = NULL; | ||
871 | |||
872 | frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate); | ||
873 | |||
874 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) | ||
875 | return -EFAULT; | ||
876 | |||
877 | if (ka->sa.sa_flags & SA_SIGINFO) { | ||
878 | if (copy_siginfo_to_user32(&frame->info, info)) | ||
879 | return -EFAULT; | ||
880 | } | ||
881 | |||
882 | put_user_try { | ||
883 | /* Create the ucontext. */ | ||
884 | if (cpu_has_xsave) | ||
885 | put_user_ex(UC_FP_XSTATE, &frame->uc.uc_flags); | ||
886 | else | ||
887 | put_user_ex(0, &frame->uc.uc_flags); | ||
888 | put_user_ex(0, &frame->uc.uc_link); | ||
889 | put_user_ex(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); | ||
890 | put_user_ex(sas_ss_flags(regs->sp), | ||
891 | &frame->uc.uc_stack.ss_flags); | ||
892 | put_user_ex(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | ||
893 | put_user_ex(0, &frame->uc.uc__pad0); | ||
894 | err |= setup_sigcontext(&frame->uc.uc_mcontext, fpstate, | ||
895 | regs, set->sig[0]); | ||
896 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | ||
897 | |||
898 | if (ka->sa.sa_flags & SA_RESTORER) { | ||
899 | restorer = ka->sa.sa_restorer; | ||
900 | } else { | ||
901 | /* could use a vstub here */ | ||
902 | restorer = NULL; | ||
903 | err |= -EFAULT; | ||
904 | } | ||
905 | put_user_ex(restorer, &frame->pretcode); | ||
906 | } put_user_catch(err); | ||
907 | |||
908 | if (err) | ||
909 | return -EFAULT; | ||
910 | |||
911 | /* Set up registers for signal handler */ | ||
912 | regs->sp = (unsigned long) frame; | ||
913 | regs->ip = (unsigned long) ka->sa.sa_handler; | ||
914 | |||
915 | /* We use the x32 calling convention here... */ | ||
916 | regs->di = sig; | ||
917 | regs->si = (unsigned long) &frame->info; | ||
918 | regs->dx = (unsigned long) &frame->uc; | ||
919 | |||
920 | loadsegment(ds, __USER_DS); | ||
921 | loadsegment(es, __USER_DS); | ||
922 | |||
923 | regs->cs = __USER_CS; | ||
924 | regs->ss = __USER_DS; | ||
925 | |||
926 | return 0; | ||
927 | } | ||
928 | |||
929 | asmlinkage long sys32_x32_rt_sigreturn(struct pt_regs *regs) | ||
930 | { | ||
931 | struct rt_sigframe_x32 __user *frame; | ||
932 | sigset_t set; | ||
933 | unsigned long ax; | ||
934 | struct pt_regs tregs; | ||
935 | |||
936 | frame = (struct rt_sigframe_x32 __user *)(regs->sp - 8); | ||
937 | |||
938 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) | ||
939 | goto badframe; | ||
940 | if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set))) | ||
941 | goto badframe; | ||
942 | |||
943 | sigdelsetmask(&set, ~_BLOCKABLE); | ||
944 | set_current_blocked(&set); | ||
945 | |||
946 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax)) | ||
947 | goto badframe; | ||
948 | |||
949 | tregs = *regs; | ||
950 | if (sys32_sigaltstack(&frame->uc.uc_stack, NULL, &tregs) == -EFAULT) | ||
951 | goto badframe; | ||
952 | |||
953 | return ax; | ||
954 | |||
955 | badframe: | ||
956 | signal_fault(regs, frame, "x32 rt_sigreturn"); | ||
957 | return 0; | ||
958 | } | ||
959 | #endif | ||
diff --git a/arch/x86/kernel/sys_x86_64.c b/arch/x86/kernel/sys_x86_64.c index ef59642ff1bf..b4d3c3927dd8 100644 --- a/arch/x86/kernel/sys_x86_64.c +++ b/arch/x86/kernel/sys_x86_64.c | |||
@@ -98,7 +98,7 @@ out: | |||
98 | static void find_start_end(unsigned long flags, unsigned long *begin, | 98 | static void find_start_end(unsigned long flags, unsigned long *begin, |
99 | unsigned long *end) | 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 | unsigned long new_begin; | 102 | unsigned long new_begin; |
103 | /* This is usually used needed to map code in small | 103 | /* This is usually used needed to map code in small |
104 | model, so it needs to be in the first 31bit. Limit | 104 | model, so it needs to be in the first 31bit. Limit |
@@ -144,7 +144,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, | |||
144 | (!vma || addr + len <= vma->vm_start)) | 144 | (!vma || addr + len <= vma->vm_start)) |
145 | return addr; | 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 | && len <= mm->cached_hole_size) { | 148 | && len <= mm->cached_hole_size) { |
149 | mm->cached_hole_size = 0; | 149 | mm->cached_hole_size = 0; |
150 | mm->free_area_cache = begin; | 150 | mm->free_area_cache = begin; |
@@ -205,7 +205,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, | |||
205 | return addr; | 205 | return addr; |
206 | 206 | ||
207 | /* for MAP_32BIT mappings we force the legact mmap base */ | 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 | goto bottomup; | 209 | goto bottomup; |
210 | 210 | ||
211 | /* requesting a specific address */ | 211 | /* requesting a specific address */ |
diff --git a/arch/x86/kernel/syscall_64.c b/arch/x86/kernel/syscall_64.c index 7ac7943be02c..5c7f8c20da74 100644 --- a/arch/x86/kernel/syscall_64.c +++ b/arch/x86/kernel/syscall_64.c | |||
@@ -5,6 +5,14 @@ | |||
5 | #include <linux/cache.h> | 5 | #include <linux/cache.h> |
6 | #include <asm/asm-offsets.h> | 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 | #define __SYSCALL_64(nr, sym, compat) extern asmlinkage void sym(void) ; | 16 | #define __SYSCALL_64(nr, sym, compat) extern asmlinkage void sym(void) ; |
9 | #include <asm/syscalls_64.h> | 17 | #include <asm/syscalls_64.h> |
10 | #undef __SYSCALL_64 | 18 | #undef __SYSCALL_64 |
diff --git a/arch/x86/oprofile/backtrace.c b/arch/x86/oprofile/backtrace.c index bff89dfe3619..d6aa6e8315d1 100644 --- a/arch/x86/oprofile/backtrace.c +++ b/arch/x86/oprofile/backtrace.c | |||
@@ -67,7 +67,7 @@ x86_backtrace_32(struct pt_regs * const regs, unsigned int depth) | |||
67 | { | 67 | { |
68 | struct stack_frame_ia32 *head; | 68 | struct stack_frame_ia32 *head; |
69 | 69 | ||
70 | /* User process is 32-bit */ | 70 | /* User process is IA32 */ |
71 | if (!current || !test_thread_flag(TIF_IA32)) | 71 | if (!current || !test_thread_flag(TIF_IA32)) |
72 | return 0; | 72 | return 0; |
73 | 73 | ||
diff --git a/arch/x86/syscalls/Makefile b/arch/x86/syscalls/Makefile index 564b2476fede..3236aebc828d 100644 --- a/arch/x86/syscalls/Makefile +++ b/arch/x86/syscalls/Makefile | |||
@@ -10,8 +10,10 @@ syshdr := $(srctree)/$(src)/syscallhdr.sh | |||
10 | systbl := $(srctree)/$(src)/syscalltbl.sh | 10 | systbl := $(srctree)/$(src)/syscalltbl.sh |
11 | 11 | ||
12 | quiet_cmd_syshdr = SYSHDR $@ | 12 | quiet_cmd_syshdr = SYSHDR $@ |
13 | cmd_syshdr = $(CONFIG_SHELL) '$(syshdr)' $< $@ \ | 13 | cmd_syshdr = $(CONFIG_SHELL) '$(syshdr)' '$<' '$@' \ |
14 | $(syshdr_abi_$(basetarget)) $(syshdr_pfx_$(basetarget)) | 14 | '$(syshdr_abi_$(basetarget))' \ |
15 | '$(syshdr_pfx_$(basetarget))' \ | ||
16 | '$(syshdr_offset_$(basetarget))' | ||
15 | quiet_cmd_systbl = SYSTBL $@ | 17 | quiet_cmd_systbl = SYSTBL $@ |
16 | cmd_systbl = $(CONFIG_SHELL) '$(systbl)' $< $@ | 18 | cmd_systbl = $(CONFIG_SHELL) '$(systbl)' $< $@ |
17 | 19 | ||
@@ -24,18 +26,28 @@ syshdr_pfx_unistd_32_ia32 := ia32_ | |||
24 | $(out)/unistd_32_ia32.h: $(syscall32) $(syshdr) | 26 | $(out)/unistd_32_ia32.h: $(syscall32) $(syshdr) |
25 | $(call if_changed,syshdr) | 27 | $(call if_changed,syshdr) |
26 | 28 | ||
27 | syshdr_abi_unistd_64 := 64 | 29 | syshdr_abi_unistd_x32 := common,x32 |
30 | syshdr_offset_unistd_x32 := __X32_SYSCALL_BIT | ||
31 | $(out)/unistd_x32.h: $(syscall64) $(syshdr) | ||
32 | $(call if_changed,syshdr) | ||
33 | |||
34 | syshdr_abi_unistd_64 := common,64 | ||
28 | $(out)/unistd_64.h: $(syscall64) $(syshdr) | 35 | $(out)/unistd_64.h: $(syscall64) $(syshdr) |
29 | $(call if_changed,syshdr) | 36 | $(call if_changed,syshdr) |
30 | 37 | ||
38 | syshdr_abi_unistd_64_x32 := x32 | ||
39 | syshdr_pfx_unistd_64_x32 := x32_ | ||
40 | $(out)/unistd_64_x32.h: $(syscall64) $(syshdr) | ||
41 | $(call if_changed,syshdr) | ||
42 | |||
31 | $(out)/syscalls_32.h: $(syscall32) $(systbl) | 43 | $(out)/syscalls_32.h: $(syscall32) $(systbl) |
32 | $(call if_changed,systbl) | 44 | $(call if_changed,systbl) |
33 | $(out)/syscalls_64.h: $(syscall64) $(systbl) | 45 | $(out)/syscalls_64.h: $(syscall64) $(systbl) |
34 | $(call if_changed,systbl) | 46 | $(call if_changed,systbl) |
35 | 47 | ||
36 | syshdr-y += unistd_32.h unistd_64.h | 48 | syshdr-y += unistd_32.h unistd_64.h unistd_x32.h |
37 | syshdr-y += syscalls_32.h | 49 | syshdr-y += syscalls_32.h |
38 | syshdr-$(CONFIG_X86_64) += unistd_32_ia32.h | 50 | syshdr-$(CONFIG_X86_64) += unistd_32_ia32.h unistd_64_x32.h |
39 | syshdr-$(CONFIG_X86_64) += syscalls_64.h | 51 | syshdr-$(CONFIG_X86_64) += syscalls_64.h |
40 | 52 | ||
41 | targets += $(syshdr-y) | 53 | targets += $(syshdr-y) |
diff --git a/arch/x86/syscalls/syscall_32.tbl b/arch/x86/syscalls/syscall_32.tbl index e7e67cc3c14b..29f9f0554f7d 100644 --- a/arch/x86/syscalls/syscall_32.tbl +++ b/arch/x86/syscalls/syscall_32.tbl | |||
@@ -181,7 +181,7 @@ | |||
181 | 172 i386 prctl sys_prctl | 181 | 172 i386 prctl sys_prctl |
182 | 173 i386 rt_sigreturn ptregs_rt_sigreturn stub32_rt_sigreturn | 182 | 173 i386 rt_sigreturn ptregs_rt_sigreturn stub32_rt_sigreturn |
183 | 174 i386 rt_sigaction sys_rt_sigaction sys32_rt_sigaction | 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 | 176 i386 rt_sigpending sys_rt_sigpending sys32_rt_sigpending | 185 | 176 i386 rt_sigpending sys_rt_sigpending sys32_rt_sigpending |
186 | 177 i386 rt_sigtimedwait sys_rt_sigtimedwait compat_sys_rt_sigtimedwait | 186 | 177 i386 rt_sigtimedwait sys_rt_sigtimedwait compat_sys_rt_sigtimedwait |
187 | 178 i386 rt_sigqueueinfo sys_rt_sigqueueinfo sys32_rt_sigqueueinfo | 187 | 178 i386 rt_sigqueueinfo sys_rt_sigqueueinfo sys32_rt_sigqueueinfo |
diff --git a/arch/x86/syscalls/syscall_64.tbl b/arch/x86/syscalls/syscall_64.tbl index b440a8f7eefa..dd29a9ea27c5 100644 --- a/arch/x86/syscalls/syscall_64.tbl +++ b/arch/x86/syscalls/syscall_64.tbl | |||
@@ -4,317 +4,350 @@ | |||
4 | # The format is: | 4 | # The format is: |
5 | # <number> <abi> <name> <entry point> | 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 | 9 | 0 common read sys_read |
10 | 1 64 write sys_write | 10 | 1 common write sys_write |
11 | 2 64 open sys_open | 11 | 2 common open sys_open |
12 | 3 64 close sys_close | 12 | 3 common close sys_close |
13 | 4 64 stat sys_newstat | 13 | 4 common stat sys_newstat |
14 | 5 64 fstat sys_newfstat | 14 | 5 common fstat sys_newfstat |
15 | 6 64 lstat sys_newlstat | 15 | 6 common lstat sys_newlstat |
16 | 7 64 poll sys_poll | 16 | 7 common poll sys_poll |
17 | 8 64 lseek sys_lseek | 17 | 8 common lseek sys_lseek |
18 | 9 64 mmap sys_mmap | 18 | 9 common mmap sys_mmap |
19 | 10 64 mprotect sys_mprotect | 19 | 10 common mprotect sys_mprotect |
20 | 11 64 munmap sys_munmap | 20 | 11 common munmap sys_munmap |
21 | 12 64 brk sys_brk | 21 | 12 common brk sys_brk |
22 | 13 64 rt_sigaction sys_rt_sigaction | 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 | 15 64 rt_sigreturn stub_rt_sigreturn | 24 | 15 64 rt_sigreturn stub_rt_sigreturn |
25 | 16 64 ioctl sys_ioctl | 25 | 16 64 ioctl sys_ioctl |
26 | 17 64 pread64 sys_pread64 | 26 | 17 common pread64 sys_pread64 |
27 | 18 64 pwrite64 sys_pwrite64 | 27 | 18 common pwrite64 sys_pwrite64 |
28 | 19 64 readv sys_readv | 28 | 19 64 readv sys_readv |
29 | 20 64 writev sys_writev | 29 | 20 64 writev sys_writev |
30 | 21 64 access sys_access | 30 | 21 common access sys_access |
31 | 22 64 pipe sys_pipe | 31 | 22 common pipe sys_pipe |
32 | 23 64 select sys_select | 32 | 23 common select sys_select |
33 | 24 64 sched_yield sys_sched_yield | 33 | 24 common sched_yield sys_sched_yield |
34 | 25 64 mremap sys_mremap | 34 | 25 common mremap sys_mremap |
35 | 26 64 msync sys_msync | 35 | 26 common msync sys_msync |
36 | 27 64 mincore sys_mincore | 36 | 27 common mincore sys_mincore |
37 | 28 64 madvise sys_madvise | 37 | 28 common madvise sys_madvise |
38 | 29 64 shmget sys_shmget | 38 | 29 common shmget sys_shmget |
39 | 30 64 shmat sys_shmat | 39 | 30 common shmat sys_shmat |
40 | 31 64 shmctl sys_shmctl | 40 | 31 common shmctl sys_shmctl |
41 | 32 64 dup sys_dup | 41 | 32 common dup sys_dup |
42 | 33 64 dup2 sys_dup2 | 42 | 33 common dup2 sys_dup2 |
43 | 34 64 pause sys_pause | 43 | 34 common pause sys_pause |
44 | 35 64 nanosleep sys_nanosleep | 44 | 35 common nanosleep sys_nanosleep |
45 | 36 64 getitimer sys_getitimer | 45 | 36 common getitimer sys_getitimer |
46 | 37 64 alarm sys_alarm | 46 | 37 common alarm sys_alarm |
47 | 38 64 setitimer sys_setitimer | 47 | 38 common setitimer sys_setitimer |
48 | 39 64 getpid sys_getpid | 48 | 39 common getpid sys_getpid |
49 | 40 64 sendfile sys_sendfile64 | 49 | 40 common sendfile sys_sendfile64 |
50 | 41 64 socket sys_socket | 50 | 41 common socket sys_socket |
51 | 42 64 connect sys_connect | 51 | 42 common connect sys_connect |
52 | 43 64 accept sys_accept | 52 | 43 common accept sys_accept |
53 | 44 64 sendto sys_sendto | 53 | 44 common sendto sys_sendto |
54 | 45 64 recvfrom sys_recvfrom | 54 | 45 64 recvfrom sys_recvfrom |
55 | 46 64 sendmsg sys_sendmsg | 55 | 46 64 sendmsg sys_sendmsg |
56 | 47 64 recvmsg sys_recvmsg | 56 | 47 64 recvmsg sys_recvmsg |
57 | 48 64 shutdown sys_shutdown | 57 | 48 common shutdown sys_shutdown |
58 | 49 64 bind sys_bind | 58 | 49 common bind sys_bind |
59 | 50 64 listen sys_listen | 59 | 50 common listen sys_listen |
60 | 51 64 getsockname sys_getsockname | 60 | 51 common getsockname sys_getsockname |
61 | 52 64 getpeername sys_getpeername | 61 | 52 common getpeername sys_getpeername |
62 | 53 64 socketpair sys_socketpair | 62 | 53 common socketpair sys_socketpair |
63 | 54 64 setsockopt sys_setsockopt | 63 | 54 common setsockopt sys_setsockopt |
64 | 55 64 getsockopt sys_getsockopt | 64 | 55 common getsockopt sys_getsockopt |
65 | 56 64 clone stub_clone | 65 | 56 common clone stub_clone |
66 | 57 64 fork stub_fork | 66 | 57 common fork stub_fork |
67 | 58 64 vfork stub_vfork | 67 | 58 common vfork stub_vfork |
68 | 59 64 execve stub_execve | 68 | 59 64 execve stub_execve |
69 | 60 64 exit sys_exit | 69 | 60 common exit sys_exit |
70 | 61 64 wait4 sys_wait4 | 70 | 61 common wait4 sys_wait4 |
71 | 62 64 kill sys_kill | 71 | 62 common kill sys_kill |
72 | 63 64 uname sys_newuname | 72 | 63 common uname sys_newuname |
73 | 64 64 semget sys_semget | 73 | 64 common semget sys_semget |
74 | 65 64 semop sys_semop | 74 | 65 common semop sys_semop |
75 | 66 64 semctl sys_semctl | 75 | 66 common semctl sys_semctl |
76 | 67 64 shmdt sys_shmdt | 76 | 67 common shmdt sys_shmdt |
77 | 68 64 msgget sys_msgget | 77 | 68 common msgget sys_msgget |
78 | 69 64 msgsnd sys_msgsnd | 78 | 69 common msgsnd sys_msgsnd |
79 | 70 64 msgrcv sys_msgrcv | 79 | 70 common msgrcv sys_msgrcv |
80 | 71 64 msgctl sys_msgctl | 80 | 71 common msgctl sys_msgctl |
81 | 72 64 fcntl sys_fcntl | 81 | 72 common fcntl sys_fcntl |
82 | 73 64 flock sys_flock | 82 | 73 common flock sys_flock |
83 | 74 64 fsync sys_fsync | 83 | 74 common fsync sys_fsync |
84 | 75 64 fdatasync sys_fdatasync | 84 | 75 common fdatasync sys_fdatasync |
85 | 76 64 truncate sys_truncate | 85 | 76 common truncate sys_truncate |
86 | 77 64 ftruncate sys_ftruncate | 86 | 77 common ftruncate sys_ftruncate |
87 | 78 64 getdents sys_getdents | 87 | 78 common getdents sys_getdents |
88 | 79 64 getcwd sys_getcwd | 88 | 79 common getcwd sys_getcwd |
89 | 80 64 chdir sys_chdir | 89 | 80 common chdir sys_chdir |
90 | 81 64 fchdir sys_fchdir | 90 | 81 common fchdir sys_fchdir |
91 | 82 64 rename sys_rename | 91 | 82 common rename sys_rename |
92 | 83 64 mkdir sys_mkdir | 92 | 83 common mkdir sys_mkdir |
93 | 84 64 rmdir sys_rmdir | 93 | 84 common rmdir sys_rmdir |
94 | 85 64 creat sys_creat | 94 | 85 common creat sys_creat |
95 | 86 64 link sys_link | 95 | 86 common link sys_link |
96 | 87 64 unlink sys_unlink | 96 | 87 common unlink sys_unlink |
97 | 88 64 symlink sys_symlink | 97 | 88 common symlink sys_symlink |
98 | 89 64 readlink sys_readlink | 98 | 89 common readlink sys_readlink |
99 | 90 64 chmod sys_chmod | 99 | 90 common chmod sys_chmod |
100 | 91 64 fchmod sys_fchmod | 100 | 91 common fchmod sys_fchmod |
101 | 92 64 chown sys_chown | 101 | 92 common chown sys_chown |
102 | 93 64 fchown sys_fchown | 102 | 93 common fchown sys_fchown |
103 | 94 64 lchown sys_lchown | 103 | 94 common lchown sys_lchown |
104 | 95 64 umask sys_umask | 104 | 95 common umask sys_umask |
105 | 96 64 gettimeofday sys_gettimeofday | 105 | 96 common gettimeofday sys_gettimeofday |
106 | 97 64 getrlimit sys_getrlimit | 106 | 97 common getrlimit sys_getrlimit |
107 | 98 64 getrusage sys_getrusage | 107 | 98 common getrusage sys_getrusage |
108 | 99 64 sysinfo sys_sysinfo | 108 | 99 common sysinfo sys_sysinfo |
109 | 100 64 times sys_times | 109 | 100 common times sys_times |
110 | 101 64 ptrace sys_ptrace | 110 | 101 64 ptrace sys_ptrace |
111 | 102 64 getuid sys_getuid | 111 | 102 common getuid sys_getuid |
112 | 103 64 syslog sys_syslog | 112 | 103 common syslog sys_syslog |
113 | 104 64 getgid sys_getgid | 113 | 104 common getgid sys_getgid |
114 | 105 64 setuid sys_setuid | 114 | 105 common setuid sys_setuid |
115 | 106 64 setgid sys_setgid | 115 | 106 common setgid sys_setgid |
116 | 107 64 geteuid sys_geteuid | 116 | 107 common geteuid sys_geteuid |
117 | 108 64 getegid sys_getegid | 117 | 108 common getegid sys_getegid |
118 | 109 64 setpgid sys_setpgid | 118 | 109 common setpgid sys_setpgid |
119 | 110 64 getppid sys_getppid | 119 | 110 common getppid sys_getppid |
120 | 111 64 getpgrp sys_getpgrp | 120 | 111 common getpgrp sys_getpgrp |
121 | 112 64 setsid sys_setsid | 121 | 112 common setsid sys_setsid |
122 | 113 64 setreuid sys_setreuid | 122 | 113 common setreuid sys_setreuid |
123 | 114 64 setregid sys_setregid | 123 | 114 common setregid sys_setregid |
124 | 115 64 getgroups sys_getgroups | 124 | 115 common getgroups sys_getgroups |
125 | 116 64 setgroups sys_setgroups | 125 | 116 common setgroups sys_setgroups |
126 | 117 64 setresuid sys_setresuid | 126 | 117 common setresuid sys_setresuid |
127 | 118 64 getresuid sys_getresuid | 127 | 118 common getresuid sys_getresuid |
128 | 119 64 setresgid sys_setresgid | 128 | 119 common setresgid sys_setresgid |
129 | 120 64 getresgid sys_getresgid | 129 | 120 common getresgid sys_getresgid |
130 | 121 64 getpgid sys_getpgid | 130 | 121 common getpgid sys_getpgid |
131 | 122 64 setfsuid sys_setfsuid | 131 | 122 common setfsuid sys_setfsuid |
132 | 123 64 setfsgid sys_setfsgid | 132 | 123 common setfsgid sys_setfsgid |
133 | 124 64 getsid sys_getsid | 133 | 124 common getsid sys_getsid |
134 | 125 64 capget sys_capget | 134 | 125 common capget sys_capget |
135 | 126 64 capset sys_capset | 135 | 126 common capset sys_capset |
136 | 127 64 rt_sigpending sys_rt_sigpending | 136 | 127 64 rt_sigpending sys_rt_sigpending |
137 | 128 64 rt_sigtimedwait sys_rt_sigtimedwait | 137 | 128 64 rt_sigtimedwait sys_rt_sigtimedwait |
138 | 129 64 rt_sigqueueinfo sys_rt_sigqueueinfo | 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 | 131 64 sigaltstack stub_sigaltstack | 140 | 131 64 sigaltstack stub_sigaltstack |
141 | 132 64 utime sys_utime | 141 | 132 common utime sys_utime |
142 | 133 64 mknod sys_mknod | 142 | 133 common mknod sys_mknod |
143 | 134 64 uselib | 143 | 134 64 uselib |
144 | 135 64 personality sys_personality | 144 | 135 common personality sys_personality |
145 | 136 64 ustat sys_ustat | 145 | 136 common ustat sys_ustat |
146 | 137 64 statfs sys_statfs | 146 | 137 common statfs sys_statfs |
147 | 138 64 fstatfs sys_fstatfs | 147 | 138 common fstatfs sys_fstatfs |
148 | 139 64 sysfs sys_sysfs | 148 | 139 common sysfs sys_sysfs |
149 | 140 64 getpriority sys_getpriority | 149 | 140 common getpriority sys_getpriority |
150 | 141 64 setpriority sys_setpriority | 150 | 141 common setpriority sys_setpriority |
151 | 142 64 sched_setparam sys_sched_setparam | 151 | 142 common sched_setparam sys_sched_setparam |
152 | 143 64 sched_getparam sys_sched_getparam | 152 | 143 common sched_getparam sys_sched_getparam |
153 | 144 64 sched_setscheduler sys_sched_setscheduler | 153 | 144 common sched_setscheduler sys_sched_setscheduler |
154 | 145 64 sched_getscheduler sys_sched_getscheduler | 154 | 145 common sched_getscheduler sys_sched_getscheduler |
155 | 146 64 sched_get_priority_max sys_sched_get_priority_max | 155 | 146 common sched_get_priority_max sys_sched_get_priority_max |
156 | 147 64 sched_get_priority_min sys_sched_get_priority_min | 156 | 147 common sched_get_priority_min sys_sched_get_priority_min |
157 | 148 64 sched_rr_get_interval sys_sched_rr_get_interval | 157 | 148 common sched_rr_get_interval sys_sched_rr_get_interval |
158 | 149 64 mlock sys_mlock | 158 | 149 common mlock sys_mlock |
159 | 150 64 munlock sys_munlock | 159 | 150 common munlock sys_munlock |
160 | 151 64 mlockall sys_mlockall | 160 | 151 common mlockall sys_mlockall |
161 | 152 64 munlockall sys_munlockall | 161 | 152 common munlockall sys_munlockall |
162 | 153 64 vhangup sys_vhangup | 162 | 153 common vhangup sys_vhangup |
163 | 154 64 modify_ldt sys_modify_ldt | 163 | 154 common modify_ldt sys_modify_ldt |
164 | 155 64 pivot_root sys_pivot_root | 164 | 155 common pivot_root sys_pivot_root |
165 | 156 64 _sysctl sys_sysctl | 165 | 156 64 _sysctl sys_sysctl |
166 | 157 64 prctl sys_prctl | 166 | 157 common prctl sys_prctl |
167 | 158 64 arch_prctl sys_arch_prctl | 167 | 158 common arch_prctl sys_arch_prctl |
168 | 159 64 adjtimex sys_adjtimex | 168 | 159 common adjtimex sys_adjtimex |
169 | 160 64 setrlimit sys_setrlimit | 169 | 160 common setrlimit sys_setrlimit |
170 | 161 64 chroot sys_chroot | 170 | 161 common chroot sys_chroot |
171 | 162 64 sync sys_sync | 171 | 162 common sync sys_sync |
172 | 163 64 acct sys_acct | 172 | 163 common acct sys_acct |
173 | 164 64 settimeofday sys_settimeofday | 173 | 164 common settimeofday sys_settimeofday |
174 | 165 64 mount sys_mount | 174 | 165 common mount sys_mount |
175 | 166 64 umount2 sys_umount | 175 | 166 common umount2 sys_umount |
176 | 167 64 swapon sys_swapon | 176 | 167 common swapon sys_swapon |
177 | 168 64 swapoff sys_swapoff | 177 | 168 common swapoff sys_swapoff |
178 | 169 64 reboot sys_reboot | 178 | 169 common reboot sys_reboot |
179 | 170 64 sethostname sys_sethostname | 179 | 170 common sethostname sys_sethostname |
180 | 171 64 setdomainname sys_setdomainname | 180 | 171 common setdomainname sys_setdomainname |
181 | 172 64 iopl stub_iopl | 181 | 172 common iopl stub_iopl |
182 | 173 64 ioperm sys_ioperm | 182 | 173 common ioperm sys_ioperm |
183 | 174 64 create_module | 183 | 174 64 create_module |
184 | 175 64 init_module sys_init_module | 184 | 175 common init_module sys_init_module |
185 | 176 64 delete_module sys_delete_module | 185 | 176 common delete_module sys_delete_module |
186 | 177 64 get_kernel_syms | 186 | 177 64 get_kernel_syms |
187 | 178 64 query_module | 187 | 178 64 query_module |
188 | 179 64 quotactl sys_quotactl | 188 | 179 common quotactl sys_quotactl |
189 | 180 64 nfsservctl | 189 | 180 64 nfsservctl |
190 | 181 64 getpmsg | 190 | 181 common getpmsg |
191 | 182 64 putpmsg | 191 | 182 common putpmsg |
192 | 183 64 afs_syscall | 192 | 183 common afs_syscall |
193 | 184 64 tuxcall | 193 | 184 common tuxcall |
194 | 185 64 security | 194 | 185 common security |
195 | 186 64 gettid sys_gettid | 195 | 186 common gettid sys_gettid |
196 | 187 64 readahead sys_readahead | 196 | 187 common readahead sys_readahead |
197 | 188 64 setxattr sys_setxattr | 197 | 188 common setxattr sys_setxattr |
198 | 189 64 lsetxattr sys_lsetxattr | 198 | 189 common lsetxattr sys_lsetxattr |
199 | 190 64 fsetxattr sys_fsetxattr | 199 | 190 common fsetxattr sys_fsetxattr |
200 | 191 64 getxattr sys_getxattr | 200 | 191 common getxattr sys_getxattr |
201 | 192 64 lgetxattr sys_lgetxattr | 201 | 192 common lgetxattr sys_lgetxattr |
202 | 193 64 fgetxattr sys_fgetxattr | 202 | 193 common fgetxattr sys_fgetxattr |
203 | 194 64 listxattr sys_listxattr | 203 | 194 common listxattr sys_listxattr |
204 | 195 64 llistxattr sys_llistxattr | 204 | 195 common llistxattr sys_llistxattr |
205 | 196 64 flistxattr sys_flistxattr | 205 | 196 common flistxattr sys_flistxattr |
206 | 197 64 removexattr sys_removexattr | 206 | 197 common removexattr sys_removexattr |
207 | 198 64 lremovexattr sys_lremovexattr | 207 | 198 common lremovexattr sys_lremovexattr |
208 | 199 64 fremovexattr sys_fremovexattr | 208 | 199 common fremovexattr sys_fremovexattr |
209 | 200 64 tkill sys_tkill | 209 | 200 common tkill sys_tkill |
210 | 201 64 time sys_time | 210 | 201 common time sys_time |
211 | 202 64 futex sys_futex | 211 | 202 common futex sys_futex |
212 | 203 64 sched_setaffinity sys_sched_setaffinity | 212 | 203 common sched_setaffinity sys_sched_setaffinity |
213 | 204 64 sched_getaffinity sys_sched_getaffinity | 213 | 204 common sched_getaffinity sys_sched_getaffinity |
214 | 205 64 set_thread_area | 214 | 205 64 set_thread_area |
215 | 206 64 io_setup sys_io_setup | 215 | 206 common io_setup sys_io_setup |
216 | 207 64 io_destroy sys_io_destroy | 216 | 207 common io_destroy sys_io_destroy |
217 | 208 64 io_getevents sys_io_getevents | 217 | 208 common io_getevents sys_io_getevents |
218 | 209 64 io_submit sys_io_submit | 218 | 209 common io_submit sys_io_submit |
219 | 210 64 io_cancel sys_io_cancel | 219 | 210 common io_cancel sys_io_cancel |
220 | 211 64 get_thread_area | 220 | 211 64 get_thread_area |
221 | 212 64 lookup_dcookie sys_lookup_dcookie | 221 | 212 common lookup_dcookie sys_lookup_dcookie |
222 | 213 64 epoll_create sys_epoll_create | 222 | 213 common epoll_create sys_epoll_create |
223 | 214 64 epoll_ctl_old | 223 | 214 64 epoll_ctl_old |
224 | 215 64 epoll_wait_old | 224 | 215 64 epoll_wait_old |
225 | 216 64 remap_file_pages sys_remap_file_pages | 225 | 216 common remap_file_pages sys_remap_file_pages |
226 | 217 64 getdents64 sys_getdents64 | 226 | 217 common getdents64 sys_getdents64 |
227 | 218 64 set_tid_address sys_set_tid_address | 227 | 218 common set_tid_address sys_set_tid_address |
228 | 219 64 restart_syscall sys_restart_syscall | 228 | 219 common restart_syscall sys_restart_syscall |
229 | 220 64 semtimedop sys_semtimedop | 229 | 220 common semtimedop sys_semtimedop |
230 | 221 64 fadvise64 sys_fadvise64 | 230 | 221 common fadvise64 sys_fadvise64 |
231 | 222 64 timer_create sys_timer_create | 231 | 222 64 timer_create sys_timer_create |
232 | 223 64 timer_settime sys_timer_settime | 232 | 223 common timer_settime sys_timer_settime |
233 | 224 64 timer_gettime sys_timer_gettime | 233 | 224 common timer_gettime sys_timer_gettime |
234 | 225 64 timer_getoverrun sys_timer_getoverrun | 234 | 225 common timer_getoverrun sys_timer_getoverrun |
235 | 226 64 timer_delete sys_timer_delete | 235 | 226 common timer_delete sys_timer_delete |
236 | 227 64 clock_settime sys_clock_settime | 236 | 227 common clock_settime sys_clock_settime |
237 | 228 64 clock_gettime sys_clock_gettime | 237 | 228 common clock_gettime sys_clock_gettime |
238 | 229 64 clock_getres sys_clock_getres | 238 | 229 common clock_getres sys_clock_getres |
239 | 230 64 clock_nanosleep sys_clock_nanosleep | 239 | 230 common clock_nanosleep sys_clock_nanosleep |
240 | 231 64 exit_group sys_exit_group | 240 | 231 common exit_group sys_exit_group |
241 | 232 64 epoll_wait sys_epoll_wait | 241 | 232 common epoll_wait sys_epoll_wait |
242 | 233 64 epoll_ctl sys_epoll_ctl | 242 | 233 common epoll_ctl sys_epoll_ctl |
243 | 234 64 tgkill sys_tgkill | 243 | 234 common tgkill sys_tgkill |
244 | 235 64 utimes sys_utimes | 244 | 235 common utimes sys_utimes |
245 | 236 64 vserver | 245 | 236 64 vserver |
246 | 237 64 mbind sys_mbind | 246 | 237 common mbind sys_mbind |
247 | 238 64 set_mempolicy sys_set_mempolicy | 247 | 238 common set_mempolicy sys_set_mempolicy |
248 | 239 64 get_mempolicy sys_get_mempolicy | 248 | 239 common get_mempolicy sys_get_mempolicy |
249 | 240 64 mq_open sys_mq_open | 249 | 240 common mq_open sys_mq_open |
250 | 241 64 mq_unlink sys_mq_unlink | 250 | 241 common mq_unlink sys_mq_unlink |
251 | 242 64 mq_timedsend sys_mq_timedsend | 251 | 242 common mq_timedsend sys_mq_timedsend |
252 | 243 64 mq_timedreceive sys_mq_timedreceive | 252 | 243 common mq_timedreceive sys_mq_timedreceive |
253 | 244 64 mq_notify sys_mq_notify | 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 | 246 64 kexec_load sys_kexec_load | 255 | 246 64 kexec_load sys_kexec_load |
256 | 247 64 waitid sys_waitid | 256 | 247 64 waitid sys_waitid |
257 | 248 64 add_key sys_add_key | 257 | 248 common add_key sys_add_key |
258 | 249 64 request_key sys_request_key | 258 | 249 common request_key sys_request_key |
259 | 250 64 keyctl sys_keyctl | 259 | 250 common keyctl sys_keyctl |
260 | 251 64 ioprio_set sys_ioprio_set | 260 | 251 common ioprio_set sys_ioprio_set |
261 | 252 64 ioprio_get sys_ioprio_get | 261 | 252 common ioprio_get sys_ioprio_get |
262 | 253 64 inotify_init sys_inotify_init | 262 | 253 common inotify_init sys_inotify_init |
263 | 254 64 inotify_add_watch sys_inotify_add_watch | 263 | 254 common inotify_add_watch sys_inotify_add_watch |
264 | 255 64 inotify_rm_watch sys_inotify_rm_watch | 264 | 255 common inotify_rm_watch sys_inotify_rm_watch |
265 | 256 64 migrate_pages sys_migrate_pages | 265 | 256 common migrate_pages sys_migrate_pages |
266 | 257 64 openat sys_openat | 266 | 257 common openat sys_openat |
267 | 258 64 mkdirat sys_mkdirat | 267 | 258 common mkdirat sys_mkdirat |
268 | 259 64 mknodat sys_mknodat | 268 | 259 common mknodat sys_mknodat |
269 | 260 64 fchownat sys_fchownat | 269 | 260 common fchownat sys_fchownat |
270 | 261 64 futimesat sys_futimesat | 270 | 261 common futimesat sys_futimesat |
271 | 262 64 newfstatat sys_newfstatat | 271 | 262 common newfstatat sys_newfstatat |
272 | 263 64 unlinkat sys_unlinkat | 272 | 263 common unlinkat sys_unlinkat |
273 | 264 64 renameat sys_renameat | 273 | 264 common renameat sys_renameat |
274 | 265 64 linkat sys_linkat | 274 | 265 common linkat sys_linkat |
275 | 266 64 symlinkat sys_symlinkat | 275 | 266 common symlinkat sys_symlinkat |
276 | 267 64 readlinkat sys_readlinkat | 276 | 267 common readlinkat sys_readlinkat |
277 | 268 64 fchmodat sys_fchmodat | 277 | 268 common fchmodat sys_fchmodat |
278 | 269 64 faccessat sys_faccessat | 278 | 269 common faccessat sys_faccessat |
279 | 270 64 pselect6 sys_pselect6 | 279 | 270 common pselect6 sys_pselect6 |
280 | 271 64 ppoll sys_ppoll | 280 | 271 common ppoll sys_ppoll |
281 | 272 64 unshare sys_unshare | 281 | 272 common unshare sys_unshare |
282 | 273 64 set_robust_list sys_set_robust_list | 282 | 273 64 set_robust_list sys_set_robust_list |
283 | 274 64 get_robust_list sys_get_robust_list | 283 | 274 64 get_robust_list sys_get_robust_list |
284 | 275 64 splice sys_splice | 284 | 275 common splice sys_splice |
285 | 276 64 tee sys_tee | 285 | 276 common tee sys_tee |
286 | 277 64 sync_file_range sys_sync_file_range | 286 | 277 common sync_file_range sys_sync_file_range |
287 | 278 64 vmsplice sys_vmsplice | 287 | 278 64 vmsplice sys_vmsplice |
288 | 279 64 move_pages sys_move_pages | 288 | 279 64 move_pages sys_move_pages |
289 | 280 64 utimensat sys_utimensat | 289 | 280 common utimensat sys_utimensat |
290 | 281 64 epoll_pwait sys_epoll_pwait | 290 | 281 common epoll_pwait sys_epoll_pwait |
291 | 282 64 signalfd sys_signalfd | 291 | 282 common signalfd sys_signalfd |
292 | 283 64 timerfd_create sys_timerfd_create | 292 | 283 common timerfd_create sys_timerfd_create |
293 | 284 64 eventfd sys_eventfd | 293 | 284 common eventfd sys_eventfd |
294 | 285 64 fallocate sys_fallocate | 294 | 285 common fallocate sys_fallocate |
295 | 286 64 timerfd_settime sys_timerfd_settime | 295 | 286 common timerfd_settime sys_timerfd_settime |
296 | 287 64 timerfd_gettime sys_timerfd_gettime | 296 | 287 common timerfd_gettime sys_timerfd_gettime |
297 | 288 64 accept4 sys_accept4 | 297 | 288 common accept4 sys_accept4 |
298 | 289 64 signalfd4 sys_signalfd4 | 298 | 289 common signalfd4 sys_signalfd4 |
299 | 290 64 eventfd2 sys_eventfd2 | 299 | 290 common eventfd2 sys_eventfd2 |
300 | 291 64 epoll_create1 sys_epoll_create1 | 300 | 291 common epoll_create1 sys_epoll_create1 |
301 | 292 64 dup3 sys_dup3 | 301 | 292 common dup3 sys_dup3 |
302 | 293 64 pipe2 sys_pipe2 | 302 | 293 common pipe2 sys_pipe2 |
303 | 294 64 inotify_init1 sys_inotify_init1 | 303 | 294 common inotify_init1 sys_inotify_init1 |
304 | 295 64 preadv sys_preadv | 304 | 295 64 preadv sys_preadv |
305 | 296 64 pwritev sys_pwritev | 305 | 296 64 pwritev sys_pwritev |
306 | 297 64 rt_tgsigqueueinfo sys_rt_tgsigqueueinfo | 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 | 299 64 recvmmsg sys_recvmmsg | 308 | 299 64 recvmmsg sys_recvmmsg |
309 | 300 64 fanotify_init sys_fanotify_init | 309 | 300 common fanotify_init sys_fanotify_init |
310 | 301 64 fanotify_mark sys_fanotify_mark | 310 | 301 common fanotify_mark sys_fanotify_mark |
311 | 302 64 prlimit64 sys_prlimit64 | 311 | 302 common prlimit64 sys_prlimit64 |
312 | 303 64 name_to_handle_at sys_name_to_handle_at | 312 | 303 common name_to_handle_at sys_name_to_handle_at |
313 | 304 64 open_by_handle_at sys_open_by_handle_at | 313 | 304 common open_by_handle_at sys_open_by_handle_at |
314 | 305 64 clock_adjtime sys_clock_adjtime | 314 | 305 common clock_adjtime sys_clock_adjtime |
315 | 306 64 syncfs sys_syncfs | 315 | 306 common syncfs sys_syncfs |
316 | 307 64 sendmmsg sys_sendmmsg | 316 | 307 64 sendmmsg sys_sendmmsg |
317 | 308 64 setns sys_setns | 317 | 308 common setns sys_setns |
318 | 309 64 getcpu sys_getcpu | 318 | 309 common getcpu sys_getcpu |
319 | 310 64 process_vm_readv sys_process_vm_readv | 319 | 310 64 process_vm_readv sys_process_vm_readv |
320 | 311 64 process_vm_writev sys_process_vm_writev | 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 | ||
diff --git a/arch/x86/um/sys_call_table_64.c b/arch/x86/um/sys_call_table_64.c index fe626c3ba01b..9924776f4265 100644 --- a/arch/x86/um/sys_call_table_64.c +++ b/arch/x86/um/sys_call_table_64.c | |||
@@ -35,6 +35,9 @@ | |||
35 | #define stub_sigaltstack sys_sigaltstack | 35 | #define stub_sigaltstack sys_sigaltstack |
36 | #define stub_rt_sigreturn sys_rt_sigreturn | 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 | #define __SYSCALL_64(nr, sym, compat) extern asmlinkage void sym(void) ; | 41 | #define __SYSCALL_64(nr, sym, compat) extern asmlinkage void sym(void) ; |
39 | #include <asm/syscalls_64.h> | 42 | #include <asm/syscalls_64.h> |
40 | 43 | ||
diff --git a/arch/x86/um/user-offsets.c b/arch/x86/um/user-offsets.c index 5edf4f4bbf53..ce7e3607a870 100644 --- a/arch/x86/um/user-offsets.c +++ b/arch/x86/um/user-offsets.c | |||
@@ -15,6 +15,8 @@ static char syscalls[] = { | |||
15 | }; | 15 | }; |
16 | #else | 16 | #else |
17 | #define __SYSCALL_64(nr, sym, compat) [nr] = 1, | 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 | static char syscalls[] = { | 20 | static char syscalls[] = { |
19 | #include <asm/syscalls_64.h> | 21 | #include <asm/syscalls_64.h> |
20 | }; | 22 | }; |
diff --git a/arch/x86/vdso/.gitignore b/arch/x86/vdso/.gitignore index 60274d5746e1..3282874bc61d 100644 --- a/arch/x86/vdso/.gitignore +++ b/arch/x86/vdso/.gitignore | |||
@@ -1,5 +1,7 @@ | |||
1 | vdso.lds | 1 | vdso.lds |
2 | vdso-syms.lds | 2 | vdso-syms.lds |
3 | vdsox32.lds | ||
4 | vdsox32-syms.lds | ||
3 | vdso32-syms.lds | 5 | vdso32-syms.lds |
4 | vdso32-syscall-syms.lds | 6 | vdso32-syscall-syms.lds |
5 | vdso32-sysenter-syms.lds | 7 | vdso32-sysenter-syms.lds |
diff --git a/arch/x86/vdso/Makefile b/arch/x86/vdso/Makefile index 5d179502a52c..fd14be1d1472 100644 --- a/arch/x86/vdso/Makefile +++ b/arch/x86/vdso/Makefile | |||
@@ -3,21 +3,29 @@ | |||
3 | # | 3 | # |
4 | 4 | ||
5 | VDSO64-$(CONFIG_X86_64) := y | 5 | VDSO64-$(CONFIG_X86_64) := y |
6 | VDSOX32-$(CONFIG_X86_X32_ABI) := y | ||
6 | VDSO32-$(CONFIG_X86_32) := y | 7 | VDSO32-$(CONFIG_X86_32) := y |
7 | VDSO32-$(CONFIG_COMPAT) := y | 8 | VDSO32-$(CONFIG_COMPAT) := y |
8 | 9 | ||
9 | vdso-install-$(VDSO64-y) += vdso.so | 10 | vdso-install-$(VDSO64-y) += vdso.so |
11 | vdso-install-$(VDSOX32-y) += vdsox32.so | ||
10 | vdso-install-$(VDSO32-y) += $(vdso32-images) | 12 | vdso-install-$(VDSO32-y) += $(vdso32-images) |
11 | 13 | ||
12 | 14 | ||
13 | # files to link into the vdso | 15 | # files to link into the vdso |
14 | vobjs-y := vdso-note.o vclock_gettime.o vgetcpu.o | 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 | # files to link into kernel | 23 | # files to link into kernel |
17 | obj-$(VDSO64-y) += vma.o vdso.o | 24 | obj-$(VDSO64-y) += vma.o vdso.o |
25 | obj-$(VDSOX32-y) += vdsox32.o | ||
18 | obj-$(VDSO32-y) += vdso32.o vdso32-setup.o | 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 | $(obj)/vdso.o: $(obj)/vdso.so | 30 | $(obj)/vdso.o: $(obj)/vdso.so |
23 | 31 | ||
@@ -73,6 +81,42 @@ $(obj)/%-syms.lds: $(obj)/%.so.dbg FORCE | |||
73 | $(call if_changed,vdsosym) | 81 | $(call if_changed,vdsosym) |
74 | 82 | ||
75 | # | 83 | # |
84 | # X32 processes use x32 vDSO to access 64bit kernel data. | ||
85 | # | ||
86 | # Build x32 vDSO image: | ||
87 | # 1. Compile x32 vDSO as 64bit. | ||
88 | # 2. Convert object files to x32. | ||
89 | # 3. Build x32 VDSO image with x32 objects, which contains 64bit codes | ||
90 | # so that it can reach 64bit address space with 64bit pointers. | ||
91 | # | ||
92 | |||
93 | targets += vdsox32-syms.lds | ||
94 | obj-$(VDSOX32-y) += vdsox32-syms.lds | ||
95 | |||
96 | CPPFLAGS_vdsox32.lds = $(CPPFLAGS_vdso.lds) | ||
97 | VDSO_LDFLAGS_vdsox32.lds = -Wl,-m,elf32_x86_64 \ | ||
98 | -Wl,-soname=linux-vdso.so.1 \ | ||
99 | -Wl,-z,max-page-size=4096 \ | ||
100 | -Wl,-z,common-page-size=4096 | ||
101 | |||
102 | vobjx32s-y := $(vobj64s:.o=-x32.o) | ||
103 | vobjx32s := $(foreach F,$(vobjx32s-y),$(obj)/$F) | ||
104 | |||
105 | # Convert 64bit object file to x32 for x32 vDSO. | ||
106 | quiet_cmd_x32 = X32 $@ | ||
107 | cmd_x32 = $(OBJCOPY) -O elf32-x86-64 $< $@ | ||
108 | |||
109 | $(obj)/%-x32.o: $(obj)/%.o FORCE | ||
110 | $(call if_changed,x32) | ||
111 | |||
112 | targets += vdsox32.so vdsox32.so.dbg vdsox32.lds $(vobjx32s-y) | ||
113 | |||
114 | $(obj)/vdsox32.o: $(src)/vdsox32.S $(obj)/vdsox32.so | ||
115 | |||
116 | $(obj)/vdsox32.so.dbg: $(src)/vdsox32.lds $(vobjx32s) FORCE | ||
117 | $(call if_changed,vdso) | ||
118 | |||
119 | # | ||
76 | # Build multiple 32-bit vDSO images to choose from at boot time. | 120 | # Build multiple 32-bit vDSO images to choose from at boot time. |
77 | # | 121 | # |
78 | obj-$(VDSO32-y) += vdso32-syms.lds | 122 | obj-$(VDSO32-y) += vdso32-syms.lds |
diff --git a/arch/x86/vdso/vdso32-setup.c b/arch/x86/vdso/vdso32-setup.c index a944020fa859..66e6d9359826 100644 --- a/arch/x86/vdso/vdso32-setup.c +++ b/arch/x86/vdso/vdso32-setup.c | |||
@@ -311,6 +311,11 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) | |||
311 | int ret = 0; | 311 | int ret = 0; |
312 | bool compat; | 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 | if (vdso_enabled == VDSO_DISABLED) | 319 | if (vdso_enabled == VDSO_DISABLED) |
315 | return 0; | 320 | return 0; |
316 | 321 | ||
diff --git a/arch/x86/vdso/vdsox32.S b/arch/x86/vdso/vdsox32.S new file mode 100644 index 000000000000..d6b9a7f42a8a --- /dev/null +++ b/arch/x86/vdso/vdsox32.S | |||
@@ -0,0 +1,22 @@ | |||
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 | ||
diff --git a/arch/x86/vdso/vdsox32.lds.S b/arch/x86/vdso/vdsox32.lds.S new file mode 100644 index 000000000000..62272aa2ae0a --- /dev/null +++ b/arch/x86/vdso/vdsox32.lds.S | |||
@@ -0,0 +1,28 @@ | |||
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; | ||
diff --git a/arch/x86/vdso/vma.c b/arch/x86/vdso/vma.c index 17e18279649f..00aaf047b39f 100644 --- a/arch/x86/vdso/vma.c +++ b/arch/x86/vdso/vma.c | |||
@@ -24,7 +24,44 @@ extern unsigned short vdso_sync_cpuid; | |||
24 | extern struct page *vdso_pages[]; | 24 | extern struct page *vdso_pages[]; |
25 | static unsigned vdso_size; | 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 | Elf64_Ehdr *hdr = vdso; | 66 | Elf64_Ehdr *hdr = vdso; |
30 | Elf64_Shdr *sechdrs, *alt_sec = 0; | 67 | Elf64_Shdr *sechdrs, *alt_sec = 0; |
@@ -47,7 +84,7 @@ static void __init patch_vdso(void *vdso, size_t len) | |||
47 | } | 84 | } |
48 | 85 | ||
49 | /* If we get here, it's probably a bug. */ | 86 | /* If we get here, it's probably a bug. */ |
50 | pr_warning("patch_vdso: .altinstructions not found\n"); | 87 | pr_warning("patch_vdso64: .altinstructions not found\n"); |
51 | return; /* nothing to patch */ | 88 | return; /* nothing to patch */ |
52 | 89 | ||
53 | found: | 90 | found: |
@@ -60,12 +97,20 @@ static int __init init_vdso(void) | |||
60 | int npages = (vdso_end - vdso_start + PAGE_SIZE - 1) / PAGE_SIZE; | 97 | int npages = (vdso_end - vdso_start + PAGE_SIZE - 1) / PAGE_SIZE; |
61 | int i; | 98 | int i; |
62 | 99 | ||
63 | patch_vdso(vdso_start, vdso_end - vdso_start); | 100 | patch_vdso64(vdso_start, vdso_end - vdso_start); |
64 | 101 | ||
65 | vdso_size = npages << PAGE_SHIFT; | 102 | vdso_size = npages << PAGE_SHIFT; |
66 | for (i = 0; i < npages; i++) | 103 | for (i = 0; i < npages; i++) |
67 | vdso_pages[i] = virt_to_page(vdso_start + i*PAGE_SIZE); | 104 | vdso_pages[i] = virt_to_page(vdso_start + i*PAGE_SIZE); |
68 | 105 | ||
106 | #ifdef CONFIG_X86_X32_ABI | ||
107 | patch_vdsox32(vdsox32_start, vdsox32_end - vdsox32_start); | ||
108 | npages = (vdsox32_end - vdsox32_start + PAGE_SIZE - 1) / PAGE_SIZE; | ||
109 | vdsox32_size = npages << PAGE_SHIFT; | ||
110 | for (i = 0; i < npages; i++) | ||
111 | vdsox32_pages[i] = virt_to_page(vdsox32_start + i*PAGE_SIZE); | ||
112 | #endif | ||
113 | |||
69 | return 0; | 114 | return 0; |
70 | } | 115 | } |
71 | subsys_initcall(init_vdso); | 116 | subsys_initcall(init_vdso); |
@@ -103,7 +148,10 @@ static unsigned long vdso_addr(unsigned long start, unsigned len) | |||
103 | 148 | ||
104 | /* Setup a VMA at program startup for the vsyscall page. | 149 | /* Setup a VMA at program startup for the vsyscall page. |
105 | Not called for compat tasks */ | 150 | Not called for compat tasks */ |
106 | int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) | 151 | static int setup_additional_pages(struct linux_binprm *bprm, |
152 | int uses_interp, | ||
153 | struct page **pages, | ||
154 | unsigned size) | ||
107 | { | 155 | { |
108 | struct mm_struct *mm = current->mm; | 156 | struct mm_struct *mm = current->mm; |
109 | unsigned long addr; | 157 | unsigned long addr; |
@@ -113,8 +161,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) | |||
113 | return 0; | 161 | return 0; |
114 | 162 | ||
115 | down_write(&mm->mmap_sem); | 163 | down_write(&mm->mmap_sem); |
116 | addr = vdso_addr(mm->start_stack, vdso_size); | 164 | addr = vdso_addr(mm->start_stack, size); |
117 | addr = get_unmapped_area(NULL, addr, vdso_size, 0, 0); | 165 | addr = get_unmapped_area(NULL, addr, size, 0, 0); |
118 | if (IS_ERR_VALUE(addr)) { | 166 | if (IS_ERR_VALUE(addr)) { |
119 | ret = addr; | 167 | ret = addr; |
120 | goto up_fail; | 168 | goto up_fail; |
@@ -122,10 +170,10 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) | |||
122 | 170 | ||
123 | current->mm->context.vdso = (void *)addr; | 171 | current->mm->context.vdso = (void *)addr; |
124 | 172 | ||
125 | ret = install_special_mapping(mm, addr, vdso_size, | 173 | ret = install_special_mapping(mm, addr, size, |
126 | VM_READ|VM_EXEC| | 174 | VM_READ|VM_EXEC| |
127 | VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC, | 175 | VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC, |
128 | vdso_pages); | 176 | pages); |
129 | if (ret) { | 177 | if (ret) { |
130 | current->mm->context.vdso = NULL; | 178 | current->mm->context.vdso = NULL; |
131 | goto up_fail; | 179 | goto up_fail; |
@@ -136,6 +184,20 @@ up_fail: | |||
136 | return ret; | 184 | return ret; |
137 | } | 185 | } |
138 | 186 | ||
187 | int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) | ||
188 | { | ||
189 | return setup_additional_pages(bprm, uses_interp, vdso_pages, | ||
190 | vdso_size); | ||
191 | } | ||
192 | |||
193 | #ifdef CONFIG_X86_X32_ABI | ||
194 | int x32_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) | ||
195 | { | ||
196 | return setup_additional_pages(bprm, uses_interp, vdsox32_pages, | ||
197 | vdsox32_size); | ||
198 | } | ||
199 | #endif | ||
200 | |||
139 | static __init int vdso_setup(char *s) | 201 | static __init int vdso_setup(char *s) |
140 | { | 202 | { |
141 | vdso_enabled = simple_strtoul(s, NULL, 0); | 203 | vdso_enabled = simple_strtoul(s, NULL, 0); |
diff --git a/arch/xtensa/include/asm/posix_types.h b/arch/xtensa/include/asm/posix_types.h index 6b2190c35882..6e96be0d02d3 100644 --- a/arch/xtensa/include/asm/posix_types.h +++ b/arch/xtensa/include/asm/posix_types.h | |||
@@ -19,104 +19,21 @@ | |||
19 | * assume GCC is being used. | 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 | typedef unsigned short __kernel_ipc_pid_t; | 22 | typedef unsigned short __kernel_ipc_pid_t; |
28 | typedef unsigned int __kernel_uid_t; | 23 | #define __kernel_ipc_pid_t __kernel_ipc_pid_t |
29 | typedef unsigned int __kernel_gid_t; | 24 | |
30 | typedef unsigned int __kernel_size_t; | 25 | typedef unsigned int __kernel_size_t; |
31 | typedef int __kernel_ssize_t; | 26 | typedef int __kernel_ssize_t; |
32 | typedef long __kernel_ptrdiff_t; | 27 | typedef long __kernel_ptrdiff_t; |
33 | typedef long __kernel_time_t; | 28 | #define __kernel_size_t __kernel_size_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; | ||
44 | 29 | ||
45 | typedef unsigned short __kernel_old_uid_t; | 30 | typedef unsigned short __kernel_old_uid_t; |
46 | typedef unsigned short __kernel_old_gid_t; | 31 | typedef unsigned short __kernel_old_gid_t; |
47 | typedef unsigned short __kernel_old_dev_t; | 32 | #define __kernel_old_uid_t __kernel_old_uid_t |
48 | |||
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 | #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 | 33 | ||
67 | #if defined(__KERNEL__) | 34 | typedef unsigned short __kernel_old_dev_t; |
68 | /* With GNU C, use inline functions instead so args are evaluated only once: */ | 35 | #define __kernel_old_dev_t __kernel_old_dev_t |
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 | 36 | ||
104 | if (__builtin_constant_p(__FDSET_LONGS)) { | 37 | #include <asm-generic/posix_types.h> |
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 | 38 | ||
120 | #endif /* defined(__KERNEL__) */ | ||
121 | #endif /* __GNUC__ */ | ||
122 | #endif /* _XTENSA_POSIX_TYPES_H */ | 39 | #endif /* _XTENSA_POSIX_TYPES_H */ |
diff --git a/drivers/char/lp.c b/drivers/char/lp.c index 0fbf1a776b52..a741e418b456 100644 --- a/drivers/char/lp.c +++ b/drivers/char/lp.c | |||
@@ -705,16 +705,13 @@ static long lp_compat_ioctl(struct file *file, unsigned int cmd, | |||
705 | { | 705 | { |
706 | unsigned int minor; | 706 | unsigned int minor; |
707 | struct timeval par_timeout; | 707 | struct timeval par_timeout; |
708 | struct compat_timeval __user *tc; | ||
709 | int ret; | 708 | int ret; |
710 | 709 | ||
711 | minor = iminor(file->f_path.dentry->d_inode); | 710 | minor = iminor(file->f_path.dentry->d_inode); |
712 | mutex_lock(&lp_mutex); | 711 | mutex_lock(&lp_mutex); |
713 | switch (cmd) { | 712 | switch (cmd) { |
714 | case LPSETTIMEOUT: | 713 | case LPSETTIMEOUT: |
715 | tc = compat_ptr(arg); | 714 | if (compat_get_timeval(&par_timeout, compat_ptr(arg))) { |
716 | if (get_user(par_timeout.tv_sec, &tc->tv_sec) || | ||
717 | get_user(par_timeout.tv_usec, &tc->tv_usec)) { | ||
718 | ret = -EFAULT; | 715 | ret = -EFAULT; |
719 | break; | 716 | break; |
720 | } | 717 | } |
diff --git a/drivers/input/input-compat.c b/drivers/input/input-compat.c index e46a86776a6b..64ca7113ff28 100644 --- a/drivers/input/input-compat.c +++ b/drivers/input/input-compat.c | |||
@@ -17,7 +17,7 @@ | |||
17 | int input_event_from_user(const char __user *buffer, | 17 | int input_event_from_user(const char __user *buffer, |
18 | struct input_event *event) | 18 | struct input_event *event) |
19 | { | 19 | { |
20 | if (INPUT_COMPAT_TEST) { | 20 | if (INPUT_COMPAT_TEST && !COMPAT_USE_64BIT_TIME) { |
21 | struct input_event_compat compat_event; | 21 | struct input_event_compat compat_event; |
22 | 22 | ||
23 | if (copy_from_user(&compat_event, buffer, | 23 | if (copy_from_user(&compat_event, buffer, |
@@ -41,7 +41,7 @@ int input_event_from_user(const char __user *buffer, | |||
41 | int input_event_to_user(char __user *buffer, | 41 | int input_event_to_user(char __user *buffer, |
42 | const struct input_event *event) | 42 | const struct input_event *event) |
43 | { | 43 | { |
44 | if (INPUT_COMPAT_TEST) { | 44 | if (INPUT_COMPAT_TEST && !COMPAT_USE_64BIT_TIME) { |
45 | struct input_event_compat compat_event; | 45 | struct input_event_compat compat_event; |
46 | 46 | ||
47 | compat_event.time.tv_sec = event->time.tv_sec; | 47 | compat_event.time.tv_sec = event->time.tv_sec; |
diff --git a/drivers/input/input-compat.h b/drivers/input/input-compat.h index 22be27b424de..148f66fe3205 100644 --- a/drivers/input/input-compat.h +++ b/drivers/input/input-compat.h | |||
@@ -67,7 +67,7 @@ struct ff_effect_compat { | |||
67 | 67 | ||
68 | static inline size_t input_event_size(void) | 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 | sizeof(struct input_event_compat) : sizeof(struct input_event); | 71 | sizeof(struct input_event_compat) : sizeof(struct input_event); |
72 | } | 72 | } |
73 | 73 | ||
diff --git a/drivers/staging/android/binder.c b/drivers/staging/android/binder.c index 59e095362c81..c2832124bb3e 100644 --- a/drivers/staging/android/binder.c +++ b/drivers/staging/android/binder.c | |||
@@ -381,8 +381,7 @@ int task_get_unused_fd_flags(struct binder_proc *proc, int flags) | |||
381 | 381 | ||
382 | repeat: | 382 | repeat: |
383 | fdt = files_fdtable(files); | 383 | fdt = files_fdtable(files); |
384 | fd = find_next_zero_bit(fdt->open_fds->fds_bits, fdt->max_fds, | 384 | fd = find_next_zero_bit(fdt->open_fds, fdt->max_fds, files->next_fd); |
385 | files->next_fd); | ||
386 | 385 | ||
387 | /* | 386 | /* |
388 | * N.B. For clone tasks sharing a files structure, this test | 387 | * N.B. For clone tasks sharing a files structure, this test |
@@ -410,11 +409,11 @@ repeat: | |||
410 | goto repeat; | 409 | goto repeat; |
411 | } | 410 | } |
412 | 411 | ||
413 | FD_SET(fd, fdt->open_fds); | 412 | __set_open_fd(fd, fdt); |
414 | if (flags & O_CLOEXEC) | 413 | if (flags & O_CLOEXEC) |
415 | FD_SET(fd, fdt->close_on_exec); | 414 | __set_close_on_exec(fd, fdt); |
416 | else | 415 | else |
417 | FD_CLR(fd, fdt->close_on_exec); | 416 | __clear_close_on_exec(fd, fdt); |
418 | files->next_fd = fd + 1; | 417 | files->next_fd = fd + 1; |
419 | #if 1 | 418 | #if 1 |
420 | /* Sanity check */ | 419 | /* Sanity check */ |
@@ -455,7 +454,7 @@ static void task_fd_install( | |||
455 | static void __put_unused_fd(struct files_struct *files, unsigned int fd) | 454 | static void __put_unused_fd(struct files_struct *files, unsigned int fd) |
456 | { | 455 | { |
457 | struct fdtable *fdt = files_fdtable(files); | 456 | struct fdtable *fdt = files_fdtable(files); |
458 | __FD_CLR(fd, fdt->open_fds); | 457 | __clear_open_fd(fd, fdt); |
459 | if (fd < files->next_fd) | 458 | if (fd < files->next_fd) |
460 | files->next_fd = fd; | 459 | files->next_fd = fd; |
461 | } | 460 | } |
@@ -481,7 +480,7 @@ static long task_close_fd(struct binder_proc *proc, unsigned int fd) | |||
481 | if (!filp) | 480 | if (!filp) |
482 | goto out_unlock; | 481 | goto out_unlock; |
483 | rcu_assign_pointer(fdt->fd[fd], NULL); | 482 | rcu_assign_pointer(fdt->fd[fd], NULL); |
484 | FD_CLR(fd, fdt->close_on_exec); | 483 | __clear_close_on_exec(fd, fdt); |
485 | __put_unused_fd(files, fd); | 484 | __put_unused_fd(files, fd); |
486 | spin_unlock(&files->file_lock); | 485 | spin_unlock(&files->file_lock); |
487 | retval = filp_close(filp, files); | 486 | retval = filp_close(filp, files); |
diff --git a/fs/autofs4/dev-ioctl.c b/fs/autofs4/dev-ioctl.c index 85f1fcdb30e7..9dacb8586701 100644 --- a/fs/autofs4/dev-ioctl.c +++ b/fs/autofs4/dev-ioctl.c | |||
@@ -230,7 +230,7 @@ static void autofs_dev_ioctl_fd_install(unsigned int fd, struct file *file) | |||
230 | fdt = files_fdtable(files); | 230 | fdt = files_fdtable(files); |
231 | BUG_ON(fdt->fd[fd] != NULL); | 231 | BUG_ON(fdt->fd[fd] != NULL); |
232 | rcu_assign_pointer(fdt->fd[fd], file); | 232 | rcu_assign_pointer(fdt->fd[fd], file); |
233 | FD_SET(fd, fdt->close_on_exec); | 233 | __set_close_on_exec(fd, fdt); |
234 | spin_unlock(&files->file_lock); | 234 | spin_unlock(&files->file_lock); |
235 | } | 235 | } |
236 | 236 | ||
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 7d7ff206cdcb..48ffb3dc610a 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c | |||
@@ -1415,6 +1415,22 @@ static void do_thread_regset_writeback(struct task_struct *task, | |||
1415 | regset->writeback(task, regset, 1); | 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 | static int fill_thread_core_info(struct elf_thread_core_info *t, | 1434 | static int fill_thread_core_info(struct elf_thread_core_info *t, |
1419 | const struct user_regset_view *view, | 1435 | const struct user_regset_view *view, |
1420 | long signr, size_t *total) | 1436 | long signr, size_t *total) |
@@ -1429,11 +1445,11 @@ static int fill_thread_core_info(struct elf_thread_core_info *t, | |||
1429 | */ | 1445 | */ |
1430 | fill_prstatus(&t->prstatus, t->task, signr); | 1446 | fill_prstatus(&t->prstatus, t->task, signr); |
1431 | (void) view->regsets[0].get(t->task, &view->regsets[0], | 1447 | (void) view->regsets[0].get(t->task, &view->regsets[0], |
1432 | 0, sizeof(t->prstatus.pr_reg), | 1448 | 0, PR_REG_SIZE(t->prstatus.pr_reg), |
1433 | &t->prstatus.pr_reg, NULL); | 1449 | PR_REG_PTR(&t->prstatus), NULL); |
1434 | 1450 | ||
1435 | fill_note(&t->notes[0], "CORE", NT_PRSTATUS, | 1451 | fill_note(&t->notes[0], "CORE", NT_PRSTATUS, |
1436 | sizeof(t->prstatus), &t->prstatus); | 1452 | PRSTATUS_SIZE(t->prstatus), &t->prstatus); |
1437 | *total += notesize(&t->notes[0]); | 1453 | *total += notesize(&t->notes[0]); |
1438 | 1454 | ||
1439 | do_thread_regset_writeback(t->task, &view->regsets[0]); | 1455 | do_thread_regset_writeback(t->task, &view->regsets[0]); |
@@ -1463,7 +1479,7 @@ static int fill_thread_core_info(struct elf_thread_core_info *t, | |||
1463 | regset->core_note_type, | 1479 | regset->core_note_type, |
1464 | size, data); | 1480 | size, data); |
1465 | else { | 1481 | else { |
1466 | t->prstatus.pr_fpvalid = 1; | 1482 | SET_PR_FPVALID(&t->prstatus, 1); |
1467 | fill_note(&t->notes[i], "CORE", | 1483 | fill_note(&t->notes[i], "CORE", |
1468 | NT_PRFPREG, size, data); | 1484 | NT_PRFPREG, size, data); |
1469 | } | 1485 | } |
diff --git a/fs/compat.c b/fs/compat.c index 14483a715bbb..f2944ace7a7b 100644 --- a/fs/compat.c +++ b/fs/compat.c | |||
@@ -1170,10 +1170,9 @@ compat_sys_readv(unsigned long fd, const struct compat_iovec __user *vec, | |||
1170 | } | 1170 | } |
1171 | 1171 | ||
1172 | asmlinkage ssize_t | 1172 | asmlinkage ssize_t |
1173 | compat_sys_preadv(unsigned long fd, const struct compat_iovec __user *vec, | 1173 | compat_sys_preadv64(unsigned long fd, const struct compat_iovec __user *vec, |
1174 | unsigned long vlen, u32 pos_low, u32 pos_high) | 1174 | unsigned long vlen, loff_t pos) |
1175 | { | 1175 | { |
1176 | loff_t pos = ((loff_t)pos_high << 32) | pos_low; | ||
1177 | struct file *file; | 1176 | struct file *file; |
1178 | int fput_needed; | 1177 | int fput_needed; |
1179 | ssize_t ret; | 1178 | ssize_t ret; |
@@ -1190,6 +1189,14 @@ compat_sys_preadv(unsigned long fd, const struct compat_iovec __user *vec, | |||
1190 | return ret; | 1189 | return ret; |
1191 | } | 1190 | } |
1192 | 1191 | ||
1192 | asmlinkage ssize_t | ||
1193 | compat_sys_preadv(unsigned long fd, const struct compat_iovec __user *vec, | ||
1194 | unsigned long vlen, u32 pos_low, u32 pos_high) | ||
1195 | { | ||
1196 | loff_t pos = ((loff_t)pos_high << 32) | pos_low; | ||
1197 | return compat_sys_preadv64(fd, vec, vlen, pos); | ||
1198 | } | ||
1199 | |||
1193 | static size_t compat_writev(struct file *file, | 1200 | static size_t compat_writev(struct file *file, |
1194 | const struct compat_iovec __user *vec, | 1201 | const struct compat_iovec __user *vec, |
1195 | unsigned long vlen, loff_t *pos) | 1202 | unsigned long vlen, loff_t *pos) |
@@ -1229,10 +1236,9 @@ compat_sys_writev(unsigned long fd, const struct compat_iovec __user *vec, | |||
1229 | } | 1236 | } |
1230 | 1237 | ||
1231 | asmlinkage ssize_t | 1238 | asmlinkage ssize_t |
1232 | compat_sys_pwritev(unsigned long fd, const struct compat_iovec __user *vec, | 1239 | compat_sys_pwritev64(unsigned long fd, const struct compat_iovec __user *vec, |
1233 | unsigned long vlen, u32 pos_low, u32 pos_high) | 1240 | unsigned long vlen, loff_t pos) |
1234 | { | 1241 | { |
1235 | loff_t pos = ((loff_t)pos_high << 32) | pos_low; | ||
1236 | struct file *file; | 1242 | struct file *file; |
1237 | int fput_needed; | 1243 | int fput_needed; |
1238 | ssize_t ret; | 1244 | ssize_t ret; |
@@ -1249,6 +1255,14 @@ compat_sys_pwritev(unsigned long fd, const struct compat_iovec __user *vec, | |||
1249 | return ret; | 1255 | return ret; |
1250 | } | 1256 | } |
1251 | 1257 | ||
1258 | asmlinkage ssize_t | ||
1259 | compat_sys_pwritev(unsigned long fd, const struct compat_iovec __user *vec, | ||
1260 | unsigned long vlen, u32 pos_low, u32 pos_high) | ||
1261 | { | ||
1262 | loff_t pos = ((loff_t)pos_high << 32) | pos_low; | ||
1263 | return compat_sys_pwritev64(fd, vec, vlen, pos); | ||
1264 | } | ||
1265 | |||
1252 | asmlinkage long | 1266 | asmlinkage long |
1253 | compat_sys_vmsplice(int fd, const struct compat_iovec __user *iov32, | 1267 | compat_sys_vmsplice(int fd, const struct compat_iovec __user *iov32, |
1254 | unsigned int nr_segs, unsigned int flags) | 1268 | unsigned int nr_segs, unsigned int flags) |
@@ -1028,10 +1028,10 @@ static void flush_old_files(struct files_struct * files) | |||
1028 | fdt = files_fdtable(files); | 1028 | fdt = files_fdtable(files); |
1029 | if (i >= fdt->max_fds) | 1029 | if (i >= fdt->max_fds) |
1030 | break; | 1030 | break; |
1031 | set = fdt->close_on_exec->fds_bits[j]; | 1031 | set = fdt->close_on_exec[j]; |
1032 | if (!set) | 1032 | if (!set) |
1033 | continue; | 1033 | continue; |
1034 | fdt->close_on_exec->fds_bits[j] = 0; | 1034 | fdt->close_on_exec[j] = 0; |
1035 | spin_unlock(&files->file_lock); | 1035 | spin_unlock(&files->file_lock); |
1036 | for ( ; set ; i++,set >>= 1) { | 1036 | for ( ; set ; i++,set >>= 1) { |
1037 | if (set & 1) { | 1037 | if (set & 1) { |
@@ -2067,8 +2067,8 @@ static int umh_pipe_setup(struct subprocess_info *info, struct cred *new) | |||
2067 | fd_install(0, rp); | 2067 | fd_install(0, rp); |
2068 | spin_lock(&cf->file_lock); | 2068 | spin_lock(&cf->file_lock); |
2069 | fdt = files_fdtable(cf); | 2069 | fdt = files_fdtable(cf); |
2070 | FD_SET(0, fdt->open_fds); | 2070 | __set_open_fd(0, fdt); |
2071 | FD_CLR(0, fdt->close_on_exec); | 2071 | __clear_close_on_exec(0, fdt); |
2072 | spin_unlock(&cf->file_lock); | 2072 | spin_unlock(&cf->file_lock); |
2073 | 2073 | ||
2074 | /* and disallow core files too */ | 2074 | /* and disallow core files too */ |
diff --git a/fs/fcntl.c b/fs/fcntl.c index 22764c7c8382..75e7c1f3a080 100644 --- a/fs/fcntl.c +++ b/fs/fcntl.c | |||
@@ -32,20 +32,20 @@ void set_close_on_exec(unsigned int fd, int flag) | |||
32 | spin_lock(&files->file_lock); | 32 | spin_lock(&files->file_lock); |
33 | fdt = files_fdtable(files); | 33 | fdt = files_fdtable(files); |
34 | if (flag) | 34 | if (flag) |
35 | FD_SET(fd, fdt->close_on_exec); | 35 | __set_close_on_exec(fd, fdt); |
36 | else | 36 | else |
37 | FD_CLR(fd, fdt->close_on_exec); | 37 | __clear_close_on_exec(fd, fdt); |
38 | spin_unlock(&files->file_lock); | 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 | struct files_struct *files = current->files; | 43 | struct files_struct *files = current->files; |
44 | struct fdtable *fdt; | 44 | struct fdtable *fdt; |
45 | int res; | 45 | bool res; |
46 | rcu_read_lock(); | 46 | rcu_read_lock(); |
47 | fdt = files_fdtable(files); | 47 | fdt = files_fdtable(files); |
48 | res = FD_ISSET(fd, fdt->close_on_exec); | 48 | res = close_on_exec(fd, fdt); |
49 | rcu_read_unlock(); | 49 | rcu_read_unlock(); |
50 | return res; | 50 | return res; |
51 | } | 51 | } |
@@ -90,15 +90,15 @@ SYSCALL_DEFINE3(dup3, unsigned int, oldfd, unsigned int, newfd, int, flags) | |||
90 | err = -EBUSY; | 90 | err = -EBUSY; |
91 | fdt = files_fdtable(files); | 91 | fdt = files_fdtable(files); |
92 | tofree = fdt->fd[newfd]; | 92 | tofree = fdt->fd[newfd]; |
93 | if (!tofree && FD_ISSET(newfd, fdt->open_fds)) | 93 | if (!tofree && fd_is_open(newfd, fdt)) |
94 | goto out_unlock; | 94 | goto out_unlock; |
95 | get_file(file); | 95 | get_file(file); |
96 | rcu_assign_pointer(fdt->fd[newfd], file); | 96 | rcu_assign_pointer(fdt->fd[newfd], file); |
97 | FD_SET(newfd, fdt->open_fds); | 97 | __set_open_fd(newfd, fdt); |
98 | if (flags & O_CLOEXEC) | 98 | if (flags & O_CLOEXEC) |
99 | FD_SET(newfd, fdt->close_on_exec); | 99 | __set_close_on_exec(newfd, fdt); |
100 | else | 100 | else |
101 | FD_CLR(newfd, fdt->close_on_exec); | 101 | __clear_close_on_exec(newfd, fdt); |
102 | spin_unlock(&files->file_lock); | 102 | spin_unlock(&files->file_lock); |
103 | 103 | ||
104 | if (tofree) | 104 | if (tofree) |
@@ -40,7 +40,7 @@ int sysctl_nr_open_max = 1024 * 1024; /* raised later */ | |||
40 | */ | 40 | */ |
41 | static DEFINE_PER_CPU(struct fdtable_defer, fdtable_defer_list); | 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 | * Very large allocations can stress page reclaim, so fall back to | 46 | * Very large allocations can stress page reclaim, so fall back to |
@@ -142,7 +142,7 @@ static void copy_fdtable(struct fdtable *nfdt, struct fdtable *ofdt) | |||
142 | static struct fdtable * alloc_fdtable(unsigned int nr) | 142 | static struct fdtable * alloc_fdtable(unsigned int nr) |
143 | { | 143 | { |
144 | struct fdtable *fdt; | 144 | struct fdtable *fdt; |
145 | char *data; | 145 | void *data; |
146 | 146 | ||
147 | /* | 147 | /* |
148 | * Figure out how many fds we actually want to support in this fdtable. | 148 | * Figure out how many fds we actually want to support in this fdtable. |
@@ -172,14 +172,15 @@ static struct fdtable * alloc_fdtable(unsigned int nr) | |||
172 | data = alloc_fdmem(nr * sizeof(struct file *)); | 172 | data = alloc_fdmem(nr * sizeof(struct file *)); |
173 | if (!data) | 173 | if (!data) |
174 | goto out_fdt; | 174 | goto out_fdt; |
175 | fdt->fd = (struct file **)data; | 175 | fdt->fd = data; |
176 | data = alloc_fdmem(max_t(unsigned int, | 176 | |
177 | data = alloc_fdmem(max_t(size_t, | ||
177 | 2 * nr / BITS_PER_BYTE, L1_CACHE_BYTES)); | 178 | 2 * nr / BITS_PER_BYTE, L1_CACHE_BYTES)); |
178 | if (!data) | 179 | if (!data) |
179 | goto out_arr; | 180 | goto out_arr; |
180 | fdt->open_fds = (fd_set *)data; | 181 | fdt->open_fds = data; |
181 | data += nr / BITS_PER_BYTE; | 182 | data += nr / BITS_PER_BYTE; |
182 | fdt->close_on_exec = (fd_set *)data; | 183 | fdt->close_on_exec = data; |
183 | fdt->next = NULL; | 184 | fdt->next = NULL; |
184 | 185 | ||
185 | return fdt; | 186 | return fdt; |
@@ -275,11 +276,11 @@ static int count_open_files(struct fdtable *fdt) | |||
275 | int i; | 276 | int i; |
276 | 277 | ||
277 | /* Find the last open fd */ | 278 | /* Find the last open fd */ |
278 | for (i = size/(8*sizeof(long)); i > 0; ) { | 279 | for (i = size / BITS_PER_LONG; i > 0; ) { |
279 | if (fdt->open_fds->fds_bits[--i]) | 280 | if (fdt->open_fds[--i]) |
280 | break; | 281 | break; |
281 | } | 282 | } |
282 | i = (i+1) * 8 * sizeof(long); | 283 | i = (i + 1) * BITS_PER_LONG; |
283 | return i; | 284 | return i; |
284 | } | 285 | } |
285 | 286 | ||
@@ -306,8 +307,8 @@ struct files_struct *dup_fd(struct files_struct *oldf, int *errorp) | |||
306 | newf->next_fd = 0; | 307 | newf->next_fd = 0; |
307 | new_fdt = &newf->fdtab; | 308 | new_fdt = &newf->fdtab; |
308 | new_fdt->max_fds = NR_OPEN_DEFAULT; | 309 | new_fdt->max_fds = NR_OPEN_DEFAULT; |
309 | new_fdt->close_on_exec = (fd_set *)&newf->close_on_exec_init; | 310 | new_fdt->close_on_exec = newf->close_on_exec_init; |
310 | new_fdt->open_fds = (fd_set *)&newf->open_fds_init; | 311 | new_fdt->open_fds = newf->open_fds_init; |
311 | new_fdt->fd = &newf->fd_array[0]; | 312 | new_fdt->fd = &newf->fd_array[0]; |
312 | new_fdt->next = NULL; | 313 | new_fdt->next = NULL; |
313 | 314 | ||
@@ -350,10 +351,8 @@ struct files_struct *dup_fd(struct files_struct *oldf, int *errorp) | |||
350 | old_fds = old_fdt->fd; | 351 | old_fds = old_fdt->fd; |
351 | new_fds = new_fdt->fd; | 352 | new_fds = new_fdt->fd; |
352 | 353 | ||
353 | memcpy(new_fdt->open_fds->fds_bits, | 354 | memcpy(new_fdt->open_fds, old_fdt->open_fds, open_files / 8); |
354 | old_fdt->open_fds->fds_bits, open_files/8); | 355 | memcpy(new_fdt->close_on_exec, old_fdt->close_on_exec, open_files / 8); |
355 | memcpy(new_fdt->close_on_exec->fds_bits, | ||
356 | old_fdt->close_on_exec->fds_bits, open_files/8); | ||
357 | 356 | ||
358 | for (i = open_files; i != 0; i--) { | 357 | for (i = open_files; i != 0; i--) { |
359 | struct file *f = *old_fds++; | 358 | struct file *f = *old_fds++; |
@@ -366,7 +365,7 @@ struct files_struct *dup_fd(struct files_struct *oldf, int *errorp) | |||
366 | * is partway through open(). So make sure that this | 365 | * is partway through open(). So make sure that this |
367 | * fd is available to the new process. | 366 | * fd is available to the new process. |
368 | */ | 367 | */ |
369 | FD_CLR(open_files - i, new_fdt->open_fds); | 368 | __clear_open_fd(open_files - i, new_fdt); |
370 | } | 369 | } |
371 | rcu_assign_pointer(*new_fds++, f); | 370 | rcu_assign_pointer(*new_fds++, f); |
372 | } | 371 | } |
@@ -379,11 +378,11 @@ struct files_struct *dup_fd(struct files_struct *oldf, int *errorp) | |||
379 | memset(new_fds, 0, size); | 378 | memset(new_fds, 0, size); |
380 | 379 | ||
381 | if (new_fdt->max_fds > open_files) { | 380 | if (new_fdt->max_fds > open_files) { |
382 | int left = (new_fdt->max_fds-open_files)/8; | 381 | int left = (new_fdt->max_fds - open_files) / 8; |
383 | int start = open_files / (8 * sizeof(unsigned long)); | 382 | int start = open_files / BITS_PER_LONG; |
384 | 383 | ||
385 | memset(&new_fdt->open_fds->fds_bits[start], 0, left); | 384 | memset(&new_fdt->open_fds[start], 0, left); |
386 | memset(&new_fdt->close_on_exec->fds_bits[start], 0, left); | 385 | memset(&new_fdt->close_on_exec[start], 0, left); |
387 | } | 386 | } |
388 | 387 | ||
389 | rcu_assign_pointer(newf->fdt, new_fdt); | 388 | rcu_assign_pointer(newf->fdt, new_fdt); |
@@ -419,8 +418,8 @@ struct files_struct init_files = { | |||
419 | .fdtab = { | 418 | .fdtab = { |
420 | .max_fds = NR_OPEN_DEFAULT, | 419 | .max_fds = NR_OPEN_DEFAULT, |
421 | .fd = &init_files.fd_array[0], | 420 | .fd = &init_files.fd_array[0], |
422 | .close_on_exec = (fd_set *)&init_files.close_on_exec_init, | 421 | .close_on_exec = init_files.close_on_exec_init, |
423 | .open_fds = (fd_set *)&init_files.open_fds_init, | 422 | .open_fds = init_files.open_fds_init, |
424 | }, | 423 | }, |
425 | .file_lock = __SPIN_LOCK_UNLOCKED(init_task.file_lock), | 424 | .file_lock = __SPIN_LOCK_UNLOCKED(init_task.file_lock), |
426 | }; | 425 | }; |
@@ -443,8 +442,7 @@ repeat: | |||
443 | fd = files->next_fd; | 442 | fd = files->next_fd; |
444 | 443 | ||
445 | if (fd < fdt->max_fds) | 444 | if (fd < fdt->max_fds) |
446 | fd = find_next_zero_bit(fdt->open_fds->fds_bits, | 445 | fd = find_next_zero_bit(fdt->open_fds, fdt->max_fds, fd); |
447 | fdt->max_fds, fd); | ||
448 | 446 | ||
449 | error = expand_files(files, fd); | 447 | error = expand_files(files, fd); |
450 | if (error < 0) | 448 | if (error < 0) |
@@ -460,11 +458,11 @@ repeat: | |||
460 | if (start <= files->next_fd) | 458 | if (start <= files->next_fd) |
461 | files->next_fd = fd + 1; | 459 | files->next_fd = fd + 1; |
462 | 460 | ||
463 | FD_SET(fd, fdt->open_fds); | 461 | __set_open_fd(fd, fdt); |
464 | if (flags & O_CLOEXEC) | 462 | if (flags & O_CLOEXEC) |
465 | FD_SET(fd, fdt->close_on_exec); | 463 | __set_close_on_exec(fd, fdt); |
466 | else | 464 | else |
467 | FD_CLR(fd, fdt->close_on_exec); | 465 | __clear_close_on_exec(fd, fdt); |
468 | error = fd; | 466 | error = fd; |
469 | #if 1 | 467 | #if 1 |
470 | /* Sanity check */ | 468 | /* Sanity check */ |
@@ -836,7 +836,7 @@ EXPORT_SYMBOL(dentry_open); | |||
836 | static void __put_unused_fd(struct files_struct *files, unsigned int fd) | 836 | static void __put_unused_fd(struct files_struct *files, unsigned int fd) |
837 | { | 837 | { |
838 | struct fdtable *fdt = files_fdtable(files); | 838 | struct fdtable *fdt = files_fdtable(files); |
839 | __FD_CLR(fd, fdt->open_fds); | 839 | __clear_open_fd(fd, fdt); |
840 | if (fd < files->next_fd) | 840 | if (fd < files->next_fd) |
841 | files->next_fd = fd; | 841 | files->next_fd = fd; |
842 | } | 842 | } |
@@ -1080,7 +1080,7 @@ SYSCALL_DEFINE1(close, unsigned int, fd) | |||
1080 | if (!filp) | 1080 | if (!filp) |
1081 | goto out_unlock; | 1081 | goto out_unlock; |
1082 | rcu_assign_pointer(fdt->fd[fd], NULL); | 1082 | rcu_assign_pointer(fdt->fd[fd], NULL); |
1083 | FD_CLR(fd, fdt->close_on_exec); | 1083 | __clear_close_on_exec(fd, fdt); |
1084 | __put_unused_fd(files, fd); | 1084 | __put_unused_fd(files, fd); |
1085 | spin_unlock(&files->file_lock); | 1085 | spin_unlock(&files->file_lock); |
1086 | retval = filp_close(filp, files); | 1086 | retval = filp_close(filp, files); |
diff --git a/fs/proc/base.c b/fs/proc/base.c index 3b42c1418f31..1c8b280146d7 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -1753,7 +1753,7 @@ static int proc_fd_info(struct inode *inode, struct path *path, char *info) | |||
1753 | 1753 | ||
1754 | fdt = files_fdtable(files); | 1754 | fdt = files_fdtable(files); |
1755 | f_flags = file->f_flags & ~O_CLOEXEC; | 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 | f_flags |= O_CLOEXEC; | 1757 | f_flags |= O_CLOEXEC; |
1758 | 1758 | ||
1759 | if (path) { | 1759 | if (path) { |
diff --git a/fs/select.c b/fs/select.c index 6fb8943d580b..17d33d09fc16 100644 --- a/fs/select.c +++ b/fs/select.c | |||
@@ -348,7 +348,7 @@ static int max_select_fd(unsigned long n, fd_set_bits *fds) | |||
348 | set = ~(~0UL << (n & (__NFDBITS-1))); | 348 | set = ~(~0UL << (n & (__NFDBITS-1))); |
349 | n /= __NFDBITS; | 349 | n /= __NFDBITS; |
350 | fdt = files_fdtable(current->files); | 350 | fdt = files_fdtable(current->files); |
351 | open_fds = fdt->open_fds->fds_bits+n; | 351 | open_fds = fdt->open_fds + n; |
352 | max = 0; | 352 | max = 0; |
353 | if (set) { | 353 | if (set) { |
354 | set &= BITS(fds, n); | 354 | set &= BITS(fds, n); |
diff --git a/include/asm-generic/posix_types.h b/include/asm-generic/posix_types.h index 3dab00860e71..91d44bd4dde3 100644 --- a/include/asm-generic/posix_types.h +++ b/include/asm-generic/posix_types.h | |||
@@ -10,8 +10,13 @@ | |||
10 | * architectures, so that you can override them. | 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 | #ifndef __kernel_ino_t | 18 | #ifndef __kernel_ino_t |
14 | typedef unsigned long __kernel_ino_t; | 19 | typedef __kernel_ulong_t __kernel_ino_t; |
15 | #endif | 20 | #endif |
16 | 21 | ||
17 | #ifndef __kernel_mode_t | 22 | #ifndef __kernel_mode_t |
@@ -19,7 +24,7 @@ typedef unsigned int __kernel_mode_t; | |||
19 | #endif | 24 | #endif |
20 | 25 | ||
21 | #ifndef __kernel_nlink_t | 26 | #ifndef __kernel_nlink_t |
22 | typedef unsigned long __kernel_nlink_t; | 27 | typedef __kernel_ulong_t __kernel_nlink_t; |
23 | #endif | 28 | #endif |
24 | 29 | ||
25 | #ifndef __kernel_pid_t | 30 | #ifndef __kernel_pid_t |
@@ -36,7 +41,7 @@ typedef unsigned int __kernel_gid_t; | |||
36 | #endif | 41 | #endif |
37 | 42 | ||
38 | #ifndef __kernel_suseconds_t | 43 | #ifndef __kernel_suseconds_t |
39 | typedef long __kernel_suseconds_t; | 44 | typedef __kernel_long_t __kernel_suseconds_t; |
40 | #endif | 45 | #endif |
41 | 46 | ||
42 | #ifndef __kernel_daddr_t | 47 | #ifndef __kernel_daddr_t |
@@ -44,8 +49,8 @@ typedef int __kernel_daddr_t; | |||
44 | #endif | 49 | #endif |
45 | 50 | ||
46 | #ifndef __kernel_uid32_t | 51 | #ifndef __kernel_uid32_t |
47 | typedef __kernel_uid_t __kernel_uid32_t; | 52 | typedef unsigned int __kernel_uid32_t; |
48 | typedef __kernel_gid_t __kernel_gid32_t; | 53 | typedef unsigned int __kernel_gid32_t; |
49 | #endif | 54 | #endif |
50 | 55 | ||
51 | #ifndef __kernel_old_uid_t | 56 | #ifndef __kernel_old_uid_t |
@@ -67,99 +72,29 @@ typedef unsigned int __kernel_size_t; | |||
67 | typedef int __kernel_ssize_t; | 72 | typedef int __kernel_ssize_t; |
68 | typedef int __kernel_ptrdiff_t; | 73 | typedef int __kernel_ptrdiff_t; |
69 | #else | 74 | #else |
70 | typedef unsigned long __kernel_size_t; | 75 | typedef __kernel_ulong_t __kernel_size_t; |
71 | typedef long __kernel_ssize_t; | 76 | typedef __kernel_long_t __kernel_ssize_t; |
72 | typedef long __kernel_ptrdiff_t; | 77 | typedef __kernel_long_t __kernel_ptrdiff_t; |
73 | #endif | 78 | #endif |
74 | #endif | 79 | #endif |
75 | 80 | ||
81 | #ifndef __kernel_fsid_t | ||
82 | typedef struct { | ||
83 | int val[2]; | ||
84 | } __kernel_fsid_t; | ||
85 | #endif | ||
86 | |||
76 | /* | 87 | /* |
77 | * anything below here should be completely generic | 88 | * anything below here should be completely generic |
78 | */ | 89 | */ |
79 | typedef long __kernel_off_t; | 90 | typedef __kernel_long_t __kernel_off_t; |
80 | typedef long long __kernel_loff_t; | 91 | typedef long long __kernel_loff_t; |
81 | typedef long __kernel_time_t; | 92 | typedef __kernel_long_t __kernel_time_t; |
82 | typedef long __kernel_clock_t; | 93 | typedef __kernel_long_t __kernel_clock_t; |
83 | typedef int __kernel_timer_t; | 94 | typedef int __kernel_timer_t; |
84 | typedef int __kernel_clockid_t; | 95 | typedef int __kernel_clockid_t; |
85 | typedef char * __kernel_caddr_t; | 96 | typedef char * __kernel_caddr_t; |
86 | typedef unsigned short __kernel_uid16_t; | 97 | typedef unsigned short __kernel_uid16_t; |
87 | typedef unsigned short __kernel_gid16_t; | 98 | typedef unsigned short __kernel_gid16_t; |
88 | 99 | ||
89 | typedef struct { | ||
90 | int val[2]; | ||
91 | } __kernel_fsid_t; | ||
92 | |||
93 | #ifdef __KERNEL__ | ||
94 | |||
95 | #undef __FD_SET | ||
96 | static inline void __FD_SET(unsigned long __fd, __kernel_fd_set *__fdsetp) | ||
97 | { | ||
98 | unsigned long __tmp = __fd / __NFDBITS; | ||
99 | unsigned long __rem = __fd % __NFDBITS; | ||
100 | __fdsetp->fds_bits[__tmp] |= (1UL<<__rem); | ||
101 | } | ||
102 | |||
103 | #undef __FD_CLR | ||
104 | static inline void __FD_CLR(unsigned long __fd, __kernel_fd_set *__fdsetp) | ||
105 | { | ||
106 | unsigned long __tmp = __fd / __NFDBITS; | ||
107 | unsigned long __rem = __fd % __NFDBITS; | ||
108 | __fdsetp->fds_bits[__tmp] &= ~(1UL<<__rem); | ||
109 | } | ||
110 | |||
111 | #undef __FD_ISSET | ||
112 | static inline int __FD_ISSET(unsigned long __fd, const __kernel_fd_set *__p) | ||
113 | { | ||
114 | unsigned long __tmp = __fd / __NFDBITS; | ||
115 | unsigned long __rem = __fd % __NFDBITS; | ||
116 | return (__p->fds_bits[__tmp] & (1UL<<__rem)) != 0; | ||
117 | } | ||
118 | |||
119 | /* | ||
120 | * This will unroll the loop for the normal constant case (8 ints, | ||
121 | * for a 256-bit fd_set) | ||
122 | */ | ||
123 | #undef __FD_ZERO | ||
124 | static inline void __FD_ZERO(__kernel_fd_set *__p) | ||
125 | { | ||
126 | unsigned long *__tmp = __p->fds_bits; | ||
127 | int __i; | ||
128 | |||
129 | if (__builtin_constant_p(__FDSET_LONGS)) { | ||
130 | switch (__FDSET_LONGS) { | ||
131 | case 16: | ||
132 | __tmp[ 0] = 0; __tmp[ 1] = 0; | ||
133 | __tmp[ 2] = 0; __tmp[ 3] = 0; | ||
134 | __tmp[ 4] = 0; __tmp[ 5] = 0; | ||
135 | __tmp[ 6] = 0; __tmp[ 7] = 0; | ||
136 | __tmp[ 8] = 0; __tmp[ 9] = 0; | ||
137 | __tmp[10] = 0; __tmp[11] = 0; | ||
138 | __tmp[12] = 0; __tmp[13] = 0; | ||
139 | __tmp[14] = 0; __tmp[15] = 0; | ||
140 | return; | ||
141 | |||
142 | case 8: | ||
143 | __tmp[ 0] = 0; __tmp[ 1] = 0; | ||
144 | __tmp[ 2] = 0; __tmp[ 3] = 0; | ||
145 | __tmp[ 4] = 0; __tmp[ 5] = 0; | ||
146 | __tmp[ 6] = 0; __tmp[ 7] = 0; | ||
147 | return; | ||
148 | |||
149 | case 4: | ||
150 | __tmp[ 0] = 0; __tmp[ 1] = 0; | ||
151 | __tmp[ 2] = 0; __tmp[ 3] = 0; | ||
152 | return; | ||
153 | } | ||
154 | } | ||
155 | __i = __FDSET_LONGS; | ||
156 | while (__i) { | ||
157 | __i--; | ||
158 | *__tmp = 0; | ||
159 | __tmp++; | ||
160 | } | ||
161 | } | ||
162 | |||
163 | #endif /* __KERNEL__ */ | ||
164 | |||
165 | #endif /* __ASM_GENERIC_POSIX_TYPES_H */ | 100 | #endif /* __ASM_GENERIC_POSIX_TYPES_H */ |
diff --git a/include/linux/Kbuild b/include/linux/Kbuild index a25555381097..a4b5da2b83f5 100644 --- a/include/linux/Kbuild +++ b/include/linux/Kbuild | |||
@@ -357,6 +357,7 @@ header-y += suspend_ioctls.h | |||
357 | header-y += swab.h | 357 | header-y += swab.h |
358 | header-y += synclink.h | 358 | header-y += synclink.h |
359 | header-y += sysctl.h | 359 | header-y += sysctl.h |
360 | header-y += sysinfo.h | ||
360 | header-y += taskstats.h | 361 | header-y += taskstats.h |
361 | header-y += tcp.h | 362 | header-y += tcp.h |
362 | header-y += telephony.h | 363 | header-y += telephony.h |
diff --git a/include/linux/aio_abi.h b/include/linux/aio_abi.h index 2c8731664180..86fa7a71336a 100644 --- a/include/linux/aio_abi.h +++ b/include/linux/aio_abi.h | |||
@@ -30,7 +30,7 @@ | |||
30 | #include <linux/types.h> | 30 | #include <linux/types.h> |
31 | #include <asm/byteorder.h> | 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 | enum { | 35 | enum { |
36 | IOCB_CMD_PREAD = 0, | 36 | IOCB_CMD_PREAD = 0, |
diff --git a/include/linux/compat.h b/include/linux/compat.h index 35c2dbf2448a..5d46217f84ad 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h | |||
@@ -19,6 +19,10 @@ | |||
19 | #include <asm/siginfo.h> | 19 | #include <asm/siginfo.h> |
20 | #include <asm/signal.h> | 20 | #include <asm/signal.h> |
21 | 21 | ||
22 | #ifndef COMPAT_USE_64BIT_TIME | ||
23 | #define COMPAT_USE_64BIT_TIME 0 | ||
24 | #endif | ||
25 | |||
22 | #define compat_jiffies_to_clock_t(x) \ | 26 | #define compat_jiffies_to_clock_t(x) \ |
23 | (((unsigned long)(x) * COMPAT_USER_HZ) / HZ) | 27 | (((unsigned long)(x) * COMPAT_USER_HZ) / HZ) |
24 | 28 | ||
@@ -83,10 +87,26 @@ typedef struct { | |||
83 | compat_sigset_word sig[_COMPAT_NSIG_WORDS]; | 87 | compat_sigset_word sig[_COMPAT_NSIG_WORDS]; |
84 | } compat_sigset_t; | 88 | } compat_sigset_t; |
85 | 89 | ||
90 | /* | ||
91 | * These functions operate strictly on struct compat_time* | ||
92 | */ | ||
86 | extern int get_compat_timespec(struct timespec *, | 93 | extern int get_compat_timespec(struct timespec *, |
87 | const struct compat_timespec __user *); | 94 | const struct compat_timespec __user *); |
88 | extern int put_compat_timespec(const struct timespec *, | 95 | extern int put_compat_timespec(const struct timespec *, |
89 | struct compat_timespec __user *); | 96 | struct compat_timespec __user *); |
97 | extern int get_compat_timeval(struct timeval *, | ||
98 | const struct compat_timeval __user *); | ||
99 | extern int put_compat_timeval(const struct timeval *, | ||
100 | struct compat_timeval __user *); | ||
101 | /* | ||
102 | * These functions operate on 32- or 64-bit specs depending on | ||
103 | * COMPAT_USE_64BIT_TIME, hence the void user pointer arguments and the | ||
104 | * naming as compat_get/put_ rather than get/put_compat_. | ||
105 | */ | ||
106 | extern int compat_get_timespec(struct timespec *, const void __user *); | ||
107 | extern int compat_put_timespec(const struct timespec *, void __user *); | ||
108 | extern int compat_get_timeval(struct timeval *, const void __user *); | ||
109 | extern int compat_put_timeval(const struct timeval *, void __user *); | ||
90 | 110 | ||
91 | struct compat_iovec { | 111 | struct compat_iovec { |
92 | compat_uptr_t iov_base; | 112 | compat_uptr_t iov_base; |
diff --git a/include/linux/fdtable.h b/include/linux/fdtable.h index 82163c4b32c9..158a41eed314 100644 --- a/include/linux/fdtable.h +++ b/include/linux/fdtable.h | |||
@@ -21,23 +21,45 @@ | |||
21 | */ | 21 | */ |
22 | #define NR_OPEN_DEFAULT BITS_PER_LONG | 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 | struct fdtable { | 24 | struct fdtable { |
33 | unsigned int max_fds; | 25 | unsigned int max_fds; |
34 | struct file __rcu **fd; /* current fd array */ | 26 | struct file __rcu **fd; /* current fd array */ |
35 | fd_set *close_on_exec; | 27 | unsigned long *close_on_exec; |
36 | fd_set *open_fds; | 28 | unsigned long *open_fds; |
37 | struct rcu_head rcu; | 29 | struct rcu_head rcu; |
38 | struct fdtable *next; | 30 | struct fdtable *next; |
39 | }; | 31 | }; |
40 | 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 | } | ||
62 | |||
41 | /* | 63 | /* |
42 | * Open file table structure | 64 | * Open file table structure |
43 | */ | 65 | */ |
@@ -53,8 +75,8 @@ struct files_struct { | |||
53 | */ | 75 | */ |
54 | spinlock_t file_lock ____cacheline_aligned_in_smp; | 76 | spinlock_t file_lock ____cacheline_aligned_in_smp; |
55 | int next_fd; | 77 | int next_fd; |
56 | struct embedded_fd_set close_on_exec_init; | 78 | unsigned long close_on_exec_init[1]; |
57 | struct embedded_fd_set open_fds_init; | 79 | unsigned long open_fds_init[1]; |
58 | struct file __rcu * fd_array[NR_OPEN_DEFAULT]; | 80 | struct file __rcu * fd_array[NR_OPEN_DEFAULT]; |
59 | }; | 81 | }; |
60 | 82 | ||
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 5db52d0ff1d4..a5375e7f3fea 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef _LINUX_KERNEL_H | 1 | #ifndef _LINUX_KERNEL_H |
2 | #define _LINUX_KERNEL_H | 2 | #define _LINUX_KERNEL_H |
3 | 3 | ||
4 | #include <linux/sysinfo.h> | ||
5 | |||
4 | /* | 6 | /* |
5 | * 'kernel.h' contains some often-used function prototypes etc | 7 | * 'kernel.h' contains some often-used function prototypes etc |
6 | */ | 8 | */ |
@@ -698,27 +700,8 @@ static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { } | |||
698 | # define REBUILD_DUE_TO_FTRACE_MCOUNT_RECORD | 700 | # define REBUILD_DUE_TO_FTRACE_MCOUNT_RECORD |
699 | #endif | 701 | #endif |
700 | 702 | ||
701 | struct sysinfo; | ||
702 | extern int do_sysinfo(struct sysinfo *info); | 703 | extern int do_sysinfo(struct sysinfo *info); |
703 | 704 | ||
704 | #endif /* __KERNEL__ */ | 705 | #endif /* __KERNEL__ */ |
705 | 706 | ||
706 | #define SI_LOAD_SHIFT 16 | ||
707 | struct sysinfo { | ||
708 | long uptime; /* Seconds since boot */ | ||
709 | unsigned long loads[3]; /* 1, 5, and 15 minute load averages */ | ||
710 | unsigned long totalram; /* Total usable main memory size */ | ||
711 | unsigned long freeram; /* Available memory size */ | ||
712 | unsigned long sharedram; /* Amount of shared memory */ | ||
713 | unsigned long bufferram; /* Memory used by buffers */ | ||
714 | unsigned long totalswap; /* Total swap space size */ | ||
715 | unsigned long freeswap; /* swap space still available */ | ||
716 | unsigned short procs; /* Number of current processes */ | ||
717 | unsigned short pad; /* explicit padding for m68k */ | ||
718 | unsigned long totalhigh; /* Total high memory size */ | ||
719 | unsigned long freehigh; /* Available high memory size */ | ||
720 | unsigned int mem_unit; /* Memory unit size in bytes */ | ||
721 | char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding: libc5 uses this.. */ | ||
722 | }; | ||
723 | |||
724 | #endif | 707 | #endif |
diff --git a/include/linux/sysinfo.h b/include/linux/sysinfo.h new file mode 100644 index 000000000000..934335a22522 --- /dev/null +++ b/include/linux/sysinfo.h | |||
@@ -0,0 +1,24 @@ | |||
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 */ | ||
diff --git a/include/linux/time.h b/include/linux/time.h index 97734e9409c6..33a92ead4d88 100644 --- a/include/linux/time.h +++ b/include/linux/time.h | |||
@@ -255,6 +255,7 @@ static __always_inline void timespec_add_ns(struct timespec *a, u64 ns) | |||
255 | a->tv_sec += __iter_div_u64_rem(a->tv_nsec + ns, NSEC_PER_SEC, &ns); | 255 | a->tv_sec += __iter_div_u64_rem(a->tv_nsec + ns, NSEC_PER_SEC, &ns); |
256 | a->tv_nsec = ns; | 256 | a->tv_nsec = ns; |
257 | } | 257 | } |
258 | |||
258 | #endif /* __KERNEL__ */ | 259 | #endif /* __KERNEL__ */ |
259 | 260 | ||
260 | #define NFDBITS __NFDBITS | 261 | #define NFDBITS __NFDBITS |
diff --git a/kernel/compat.c b/kernel/compat.c index f346cedfe24d..74ff8498809a 100644 --- a/kernel/compat.c +++ b/kernel/compat.c | |||
@@ -31,11 +31,10 @@ | |||
31 | #include <asm/uaccess.h> | 31 | #include <asm/uaccess.h> |
32 | 32 | ||
33 | /* | 33 | /* |
34 | * Note that the native side is already converted to a timespec, because | 34 | * Get/set struct timeval with struct timespec on the native side |
35 | * that's what we want anyway. | ||
36 | */ | 35 | */ |
37 | static int compat_get_timeval(struct timespec *o, | 36 | static int compat_get_timeval_convert(struct timespec *o, |
38 | struct compat_timeval __user *i) | 37 | struct compat_timeval __user *i) |
39 | { | 38 | { |
40 | long usec; | 39 | long usec; |
41 | 40 | ||
@@ -46,8 +45,8 @@ static int compat_get_timeval(struct timespec *o, | |||
46 | return 0; | 45 | return 0; |
47 | } | 46 | } |
48 | 47 | ||
49 | static int compat_put_timeval(struct compat_timeval __user *o, | 48 | static int compat_put_timeval_convert(struct compat_timeval __user *o, |
50 | struct timeval *i) | 49 | struct timeval *i) |
51 | { | 50 | { |
52 | return (put_user(i->tv_sec, &o->tv_sec) || | 51 | return (put_user(i->tv_sec, &o->tv_sec) || |
53 | put_user(i->tv_usec, &o->tv_usec)) ? -EFAULT : 0; | 52 | put_user(i->tv_usec, &o->tv_usec)) ? -EFAULT : 0; |
@@ -117,7 +116,7 @@ asmlinkage long compat_sys_gettimeofday(struct compat_timeval __user *tv, | |||
117 | if (tv) { | 116 | if (tv) { |
118 | struct timeval ktv; | 117 | struct timeval ktv; |
119 | do_gettimeofday(&ktv); | 118 | do_gettimeofday(&ktv); |
120 | if (compat_put_timeval(tv, &ktv)) | 119 | if (compat_put_timeval_convert(tv, &ktv)) |
121 | return -EFAULT; | 120 | return -EFAULT; |
122 | } | 121 | } |
123 | if (tz) { | 122 | if (tz) { |
@@ -135,7 +134,7 @@ asmlinkage long compat_sys_settimeofday(struct compat_timeval __user *tv, | |||
135 | struct timezone ktz; | 134 | struct timezone ktz; |
136 | 135 | ||
137 | if (tv) { | 136 | if (tv) { |
138 | if (compat_get_timeval(&kts, tv)) | 137 | if (compat_get_timeval_convert(&kts, tv)) |
139 | return -EFAULT; | 138 | return -EFAULT; |
140 | } | 139 | } |
141 | if (tz) { | 140 | if (tz) { |
@@ -146,12 +145,29 @@ asmlinkage long compat_sys_settimeofday(struct compat_timeval __user *tv, | |||
146 | return do_sys_settimeofday(tv ? &kts : NULL, tz ? &ktz : NULL); | 145 | return do_sys_settimeofday(tv ? &kts : NULL, tz ? &ktz : NULL); |
147 | } | 146 | } |
148 | 147 | ||
148 | int get_compat_timeval(struct timeval *tv, const struct compat_timeval __user *ctv) | ||
149 | { | ||
150 | return (!access_ok(VERIFY_READ, ctv, sizeof(*ctv)) || | ||
151 | __get_user(tv->tv_sec, &ctv->tv_sec) || | ||
152 | __get_user(tv->tv_usec, &ctv->tv_usec)) ? -EFAULT : 0; | ||
153 | } | ||
154 | EXPORT_SYMBOL_GPL(get_compat_timeval); | ||
155 | |||
156 | int put_compat_timeval(const struct timeval *tv, struct compat_timeval __user *ctv) | ||
157 | { | ||
158 | return (!access_ok(VERIFY_WRITE, ctv, sizeof(*ctv)) || | ||
159 | __put_user(tv->tv_sec, &ctv->tv_sec) || | ||
160 | __put_user(tv->tv_usec, &ctv->tv_usec)) ? -EFAULT : 0; | ||
161 | } | ||
162 | EXPORT_SYMBOL_GPL(put_compat_timeval); | ||
163 | |||
149 | int get_compat_timespec(struct timespec *ts, const struct compat_timespec __user *cts) | 164 | int get_compat_timespec(struct timespec *ts, const struct compat_timespec __user *cts) |
150 | { | 165 | { |
151 | return (!access_ok(VERIFY_READ, cts, sizeof(*cts)) || | 166 | return (!access_ok(VERIFY_READ, cts, sizeof(*cts)) || |
152 | __get_user(ts->tv_sec, &cts->tv_sec) || | 167 | __get_user(ts->tv_sec, &cts->tv_sec) || |
153 | __get_user(ts->tv_nsec, &cts->tv_nsec)) ? -EFAULT : 0; | 168 | __get_user(ts->tv_nsec, &cts->tv_nsec)) ? -EFAULT : 0; |
154 | } | 169 | } |
170 | EXPORT_SYMBOL_GPL(get_compat_timespec); | ||
155 | 171 | ||
156 | int put_compat_timespec(const struct timespec *ts, struct compat_timespec __user *cts) | 172 | int put_compat_timespec(const struct timespec *ts, struct compat_timespec __user *cts) |
157 | { | 173 | { |
@@ -161,6 +177,42 @@ int put_compat_timespec(const struct timespec *ts, struct compat_timespec __user | |||
161 | } | 177 | } |
162 | EXPORT_SYMBOL_GPL(put_compat_timespec); | 178 | EXPORT_SYMBOL_GPL(put_compat_timespec); |
163 | 179 | ||
180 | int compat_get_timeval(struct timeval *tv, const void __user *utv) | ||
181 | { | ||
182 | if (COMPAT_USE_64BIT_TIME) | ||
183 | return copy_from_user(tv, utv, sizeof *tv) ? -EFAULT : 0; | ||
184 | else | ||
185 | return get_compat_timeval(tv, utv); | ||
186 | } | ||
187 | EXPORT_SYMBOL_GPL(compat_get_timeval); | ||
188 | |||
189 | int compat_put_timeval(const struct timeval *tv, void __user *utv) | ||
190 | { | ||
191 | if (COMPAT_USE_64BIT_TIME) | ||
192 | return copy_to_user(utv, tv, sizeof *tv) ? -EFAULT : 0; | ||
193 | else | ||
194 | return put_compat_timeval(tv, utv); | ||
195 | } | ||
196 | EXPORT_SYMBOL_GPL(compat_put_timeval); | ||
197 | |||
198 | int compat_get_timespec(struct timespec *ts, const void __user *uts) | ||
199 | { | ||
200 | if (COMPAT_USE_64BIT_TIME) | ||
201 | return copy_from_user(ts, uts, sizeof *ts) ? -EFAULT : 0; | ||
202 | else | ||
203 | return get_compat_timespec(ts, uts); | ||
204 | } | ||
205 | EXPORT_SYMBOL_GPL(compat_get_timespec); | ||
206 | |||
207 | int compat_put_timespec(const struct timespec *ts, void __user *uts) | ||
208 | { | ||
209 | if (COMPAT_USE_64BIT_TIME) | ||
210 | return copy_to_user(uts, ts, sizeof *ts) ? -EFAULT : 0; | ||
211 | else | ||
212 | return put_compat_timespec(ts, uts); | ||
213 | } | ||
214 | EXPORT_SYMBOL_GPL(compat_put_timespec); | ||
215 | |||
164 | static long compat_nanosleep_restart(struct restart_block *restart) | 216 | static long compat_nanosleep_restart(struct restart_block *restart) |
165 | { | 217 | { |
166 | struct compat_timespec __user *rmtp; | 218 | struct compat_timespec __user *rmtp; |
diff --git a/kernel/exit.c b/kernel/exit.c index 3db1909faed9..d8bd3b425fa7 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
@@ -474,7 +474,7 @@ static void close_files(struct files_struct * files) | |||
474 | i = j * __NFDBITS; | 474 | i = j * __NFDBITS; |
475 | if (i >= fdt->max_fds) | 475 | if (i >= fdt->max_fds) |
476 | break; | 476 | break; |
477 | set = fdt->open_fds->fds_bits[j++]; | 477 | set = fdt->open_fds[j++]; |
478 | while (set) { | 478 | while (set) { |
479 | if (set & 1) { | 479 | if (set & 1) { |
480 | struct file * file = xchg(&fdt->fd[i], NULL); | 480 | struct file * file = xchg(&fdt->fd[i], NULL); |
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index 49142612916e..5914623f426a 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c | |||
@@ -733,7 +733,8 @@ static inline void hci_sock_cmsg(struct sock *sk, struct msghdr *msg, struct sk_ | |||
733 | data = &tv; | 733 | data = &tv; |
734 | len = sizeof(tv); | 734 | len = sizeof(tv); |
735 | #ifdef CONFIG_COMPAT | 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 | ctv.tv_sec = tv.tv_sec; | 738 | ctv.tv_sec = tv.tv_sec; |
738 | ctv.tv_usec = tv.tv_usec; | 739 | ctv.tv_usec = tv.tv_usec; |
739 | data = &ctv; | 740 | data = &ctv; |
diff --git a/net/compat.c b/net/compat.c index 64b4515a64e6..e055708b8ec9 100644 --- a/net/compat.c +++ b/net/compat.c | |||
@@ -219,8 +219,6 @@ Efault: | |||
219 | 219 | ||
220 | int put_cmsg_compat(struct msghdr *kmsg, int level, int type, int len, void *data) | 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 | struct compat_cmsghdr __user *cm = (struct compat_cmsghdr __user *) kmsg->msg_control; | 222 | struct compat_cmsghdr __user *cm = (struct compat_cmsghdr __user *) kmsg->msg_control; |
225 | struct compat_cmsghdr cmhdr; | 223 | struct compat_cmsghdr cmhdr; |
226 | int cmlen; | 224 | int cmlen; |
@@ -230,24 +228,28 @@ int put_cmsg_compat(struct msghdr *kmsg, int level, int type, int len, void *dat | |||
230 | return 0; /* XXX: return error? check spec. */ | 228 | return 0; /* XXX: return error? check spec. */ |
231 | } | 229 | } |
232 | 230 | ||
233 | if (level == SOL_SOCKET && type == SCM_TIMESTAMP) { | 231 | if (!COMPAT_USE_64BIT_TIME) { |
234 | struct timeval *tv = (struct timeval *)data; | 232 | struct compat_timeval ctv; |
235 | ctv.tv_sec = tv->tv_sec; | 233 | struct compat_timespec cts[3]; |
236 | ctv.tv_usec = tv->tv_usec; | 234 | if (level == SOL_SOCKET && type == SCM_TIMESTAMP) { |
237 | data = &ctv; | 235 | struct timeval *tv = (struct timeval *)data; |
238 | len = sizeof(ctv); | 236 | ctv.tv_sec = tv->tv_sec; |
239 | } | 237 | ctv.tv_usec = tv->tv_usec; |
240 | if (level == SOL_SOCKET && | 238 | data = &ctv; |
241 | (type == SCM_TIMESTAMPNS || type == SCM_TIMESTAMPING)) { | 239 | len = sizeof(ctv); |
242 | int count = type == SCM_TIMESTAMPNS ? 1 : 3; | 240 | } |
243 | int i; | 241 | if (level == SOL_SOCKET && |
244 | struct timespec *ts = (struct timespec *)data; | 242 | (type == SCM_TIMESTAMPNS || type == SCM_TIMESTAMPING)) { |
245 | for (i = 0; i < count; i++) { | 243 | int count = type == SCM_TIMESTAMPNS ? 1 : 3; |
246 | cts[i].tv_sec = ts[i].tv_sec; | 244 | int i; |
247 | cts[i].tv_nsec = ts[i].tv_nsec; | 245 | struct timespec *ts = (struct timespec *)data; |
246 | for (i = 0; i < count; i++) { | ||
247 | cts[i].tv_sec = ts[i].tv_sec; | ||
248 | cts[i].tv_nsec = ts[i].tv_nsec; | ||
249 | } | ||
250 | data = &cts; | ||
251 | len = sizeof(cts[0]) * count; | ||
248 | } | 252 | } |
249 | data = &cts; | ||
250 | len = sizeof(cts[0]) * count; | ||
251 | } | 253 | } |
252 | 254 | ||
253 | cmlen = CMSG_COMPAT_LEN(len); | 255 | cmlen = CMSG_COMPAT_LEN(len); |
@@ -454,11 +456,15 @@ static int compat_sock_getsockopt(struct socket *sock, int level, int optname, | |||
454 | 456 | ||
455 | int compat_sock_get_timestamp(struct sock *sk, struct timeval __user *userstamp) | 457 | int compat_sock_get_timestamp(struct sock *sk, struct timeval __user *userstamp) |
456 | { | 458 | { |
457 | struct compat_timeval __user *ctv = | 459 | struct compat_timeval __user *ctv; |
458 | (struct compat_timeval __user *) userstamp; | 460 | int err; |
459 | int err = -ENOENT; | ||
460 | struct timeval tv; | 461 | struct timeval tv; |
461 | 462 | ||
463 | if (COMPAT_USE_64BIT_TIME) | ||
464 | return sock_get_timestamp(sk, userstamp); | ||
465 | |||
466 | ctv = (struct compat_timeval __user *) userstamp; | ||
467 | err = -ENOENT; | ||
462 | if (!sock_flag(sk, SOCK_TIMESTAMP)) | 468 | if (!sock_flag(sk, SOCK_TIMESTAMP)) |
463 | sock_enable_timestamp(sk, SOCK_TIMESTAMP); | 469 | sock_enable_timestamp(sk, SOCK_TIMESTAMP); |
464 | tv = ktime_to_timeval(sk->sk_stamp); | 470 | tv = ktime_to_timeval(sk->sk_stamp); |
@@ -478,11 +484,15 @@ EXPORT_SYMBOL(compat_sock_get_timestamp); | |||
478 | 484 | ||
479 | int compat_sock_get_timestampns(struct sock *sk, struct timespec __user *userstamp) | 485 | int compat_sock_get_timestampns(struct sock *sk, struct timespec __user *userstamp) |
480 | { | 486 | { |
481 | struct compat_timespec __user *ctv = | 487 | struct compat_timespec __user *ctv; |
482 | (struct compat_timespec __user *) userstamp; | 488 | int err; |
483 | int err = -ENOENT; | ||
484 | struct timespec ts; | 489 | struct timespec ts; |
485 | 490 | ||
491 | if (COMPAT_USE_64BIT_TIME) | ||
492 | return sock_get_timestampns (sk, userstamp); | ||
493 | |||
494 | ctv = (struct compat_timespec __user *) userstamp; | ||
495 | err = -ENOENT; | ||
486 | if (!sock_flag(sk, SOCK_TIMESTAMP)) | 496 | if (!sock_flag(sk, SOCK_TIMESTAMP)) |
487 | sock_enable_timestamp(sk, SOCK_TIMESTAMP); | 497 | sock_enable_timestamp(sk, SOCK_TIMESTAMP); |
488 | ts = ktime_to_timespec(sk->sk_stamp); | 498 | ts = ktime_to_timespec(sk->sk_stamp); |
@@ -767,6 +777,11 @@ asmlinkage long compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg, | |||
767 | int datagrams; | 777 | int datagrams; |
768 | struct timespec ktspec; | 778 | struct timespec ktspec; |
769 | 779 | ||
780 | if (COMPAT_USE_64BIT_TIME) | ||
781 | return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen, | ||
782 | flags | MSG_CMSG_COMPAT, | ||
783 | (struct timespec *) timeout); | ||
784 | |||
770 | if (timeout == NULL) | 785 | if (timeout == NULL) |
771 | return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen, | 786 | return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen, |
772 | flags | MSG_CMSG_COMPAT, NULL); | 787 | flags | MSG_CMSG_COMPAT, NULL); |
diff --git a/net/socket.c b/net/socket.c index 12a48d846223..484cc6953fc6 100644 --- a/net/socket.c +++ b/net/socket.c | |||
@@ -2592,7 +2592,7 @@ void socket_seq_show(struct seq_file *seq) | |||
2592 | 2592 | ||
2593 | #ifdef CONFIG_COMPAT | 2593 | #ifdef CONFIG_COMPAT |
2594 | static int do_siocgstamp(struct net *net, struct socket *sock, | 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 | mm_segment_t old_fs = get_fs(); | 2597 | mm_segment_t old_fs = get_fs(); |
2598 | struct timeval ktv; | 2598 | struct timeval ktv; |
@@ -2601,15 +2601,14 @@ static int do_siocgstamp(struct net *net, struct socket *sock, | |||
2601 | set_fs(KERNEL_DS); | 2601 | set_fs(KERNEL_DS); |
2602 | err = sock_do_ioctl(net, sock, cmd, (unsigned long)&ktv); | 2602 | err = sock_do_ioctl(net, sock, cmd, (unsigned long)&ktv); |
2603 | set_fs(old_fs); | 2603 | set_fs(old_fs); |
2604 | if (!err) { | 2604 | if (!err) |
2605 | err = put_user(ktv.tv_sec, &up->tv_sec); | 2605 | err = compat_put_timeval(up, &ktv); |
2606 | err |= __put_user(ktv.tv_usec, &up->tv_usec); | 2606 | |
2607 | } | ||
2608 | return err; | 2607 | return err; |
2609 | } | 2608 | } |
2610 | 2609 | ||
2611 | static int do_siocgstampns(struct net *net, struct socket *sock, | 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 | mm_segment_t old_fs = get_fs(); | 2613 | mm_segment_t old_fs = get_fs(); |
2615 | struct timespec kts; | 2614 | struct timespec kts; |
@@ -2618,10 +2617,9 @@ static int do_siocgstampns(struct net *net, struct socket *sock, | |||
2618 | set_fs(KERNEL_DS); | 2617 | set_fs(KERNEL_DS); |
2619 | err = sock_do_ioctl(net, sock, cmd, (unsigned long)&kts); | 2618 | err = sock_do_ioctl(net, sock, cmd, (unsigned long)&kts); |
2620 | set_fs(old_fs); | 2619 | set_fs(old_fs); |
2621 | if (!err) { | 2620 | if (!err) |
2622 | err = put_user(kts.tv_sec, &up->tv_sec); | 2621 | err = compat_put_timespec(up, &kts); |
2623 | err |= __put_user(kts.tv_nsec, &up->tv_nsec); | 2622 | |
2624 | } | ||
2625 | return err; | 2623 | return err; |
2626 | } | 2624 | } |
2627 | 2625 | ||
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 304929909375..15c6c567468b 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
@@ -2147,7 +2147,7 @@ static inline void flush_unauthorized_files(const struct cred *cred, | |||
2147 | fdt = files_fdtable(files); | 2147 | fdt = files_fdtable(files); |
2148 | if (i >= fdt->max_fds) | 2148 | if (i >= fdt->max_fds) |
2149 | break; | 2149 | break; |
2150 | set = fdt->open_fds->fds_bits[j]; | 2150 | set = fdt->open_fds[j]; |
2151 | if (!set) | 2151 | if (!set) |
2152 | continue; | 2152 | continue; |
2153 | spin_unlock(&files->file_lock); | 2153 | spin_unlock(&files->file_lock); |