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 /include/linux | |
| 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>
...
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/Kbuild | 1 | ||||
| -rw-r--r-- | include/linux/aio_abi.h | 2 | ||||
| -rw-r--r-- | include/linux/compat.h | 20 | ||||
| -rw-r--r-- | include/linux/fdtable.h | 46 | ||||
| -rw-r--r-- | include/linux/kernel.h | 21 | ||||
| -rw-r--r-- | include/linux/sysinfo.h | 24 | ||||
| -rw-r--r-- | include/linux/time.h | 1 |
7 files changed, 83 insertions, 32 deletions
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 |
