diff options
| author | Kyle McMartin <kyle@parisc-linux.org> | 2007-02-10 04:46:00 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-02-11 13:51:32 -0500 |
| commit | d4d23add3abcd18d8021b99f230df608ccb2f007 (patch) | |
| tree | 756c5a7d21a9f5a25f10bfcec40c01aecc596c2f | |
| parent | 72fd4a35a824331d7a0f4168d7576502d95d34b3 (diff) | |
[PATCH] Common compat_sys_sysinfo
I noticed that almost all architectures implemented exactly the same
sys32_sysinfo... except parisc, where a bug was to be found in handling of
the uptime. So let's remove a whole whack of code for fun and profit.
Cribbed compat_sys_sysinfo from x86_64's implementation, since I figured it
would be the best tested.
This patch incorporates Arnd's suggestion of not using set_fs/get_fs, but
instead extracting out the common code from sys_sysinfo.
Cc: Christoph Hellwig <hch@infradead.org>
Cc: <linux-arch@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -rw-r--r-- | arch/ia64/ia32/ia32_entry.S | 2 | ||||
| -rw-r--r-- | arch/ia64/ia32/sys_ia32.c | 68 | ||||
| -rw-r--r-- | arch/mips/kernel/linux32.c | 44 | ||||
| -rw-r--r-- | arch/mips/kernel/scall64-n32.S | 2 | ||||
| -rw-r--r-- | arch/mips/kernel/scall64-o32.S | 2 | ||||
| -rw-r--r-- | arch/parisc/kernel/sys_parisc32.c | 64 | ||||
| -rw-r--r-- | arch/parisc/kernel/syscall_table.S | 2 | ||||
| -rw-r--r-- | arch/powerpc/kernel/sys_ppc32.c | 67 | ||||
| -rw-r--r-- | arch/s390/kernel/compat_linux.c | 45 | ||||
| -rw-r--r-- | arch/s390/kernel/compat_wrapper.S | 6 | ||||
| -rw-r--r-- | arch/s390/kernel/syscalls.S | 2 | ||||
| -rw-r--r-- | arch/sparc64/kernel/sys_sparc32.c | 64 | ||||
| -rw-r--r-- | arch/sparc64/kernel/systbls.S | 2 | ||||
| -rw-r--r-- | arch/x86_64/ia32/ia32entry.S | 2 | ||||
| -rw-r--r-- | arch/x86_64/ia32/sys_ia32.c | 66 | ||||
| -rw-r--r-- | include/linux/kernel.h | 3 | ||||
| -rw-r--r-- | kernel/compat.c | 66 | ||||
| -rw-r--r-- | kernel/timer.c | 58 |
18 files changed, 112 insertions, 453 deletions
diff --git a/arch/ia64/ia32/ia32_entry.S b/arch/ia64/ia32/ia32_entry.S index a32cd59b81ed..687e5fdc9683 100644 --- a/arch/ia64/ia32/ia32_entry.S +++ b/arch/ia64/ia32/ia32_entry.S | |||
| @@ -326,7 +326,7 @@ ia32_syscall_table: | |||
| 326 | data8 sys_ni_syscall | 326 | data8 sys_ni_syscall |
| 327 | data8 compat_sys_wait4 | 327 | data8 compat_sys_wait4 |
| 328 | data8 sys_swapoff /* 115 */ | 328 | data8 sys_swapoff /* 115 */ |
| 329 | data8 sys32_sysinfo | 329 | data8 compat_sys_sysinfo |
| 330 | data8 sys32_ipc | 330 | data8 sys32_ipc |
| 331 | data8 sys_fsync | 331 | data8 sys_fsync |
| 332 | data8 sys32_sigreturn | 332 | data8 sys32_sigreturn |
diff --git a/arch/ia64/ia32/sys_ia32.c b/arch/ia64/ia32/sys_ia32.c index 957681c39ad9..d430d36ae49d 100644 --- a/arch/ia64/ia32/sys_ia32.c +++ b/arch/ia64/ia32/sys_ia32.c | |||
| @@ -2209,74 +2209,6 @@ sys32_fstat64 (unsigned int fd, struct stat64 __user *statbuf) | |||
| 2209 | return ret; | 2209 | return ret; |
| 2210 | } | 2210 | } |
| 2211 | 2211 | ||
| 2212 | struct sysinfo32 { | ||
| 2213 | s32 uptime; | ||
| 2214 | u32 loads[3]; | ||
| 2215 | u32 totalram; | ||
| 2216 | u32 freeram; | ||
| 2217 | u32 sharedram; | ||
| 2218 | u32 bufferram; | ||
| 2219 | u32 totalswap; | ||
| 2220 | u32 freeswap; | ||
| 2221 | u16 procs; | ||
| 2222 | u16 pad; | ||
| 2223 | u32 totalhigh; | ||
| 2224 | u32 freehigh; | ||
| 2225 | u32 mem_unit; | ||
| 2226 | char _f[8]; | ||
| 2227 | }; | ||
| 2228 | |||
| 2229 | asmlinkage long | ||
| 2230 | sys32_sysinfo (struct sysinfo32 __user *info) | ||
| 2231 | { | ||
| 2232 | struct sysinfo s; | ||
| 2233 | long ret, err; | ||
| 2234 | int bitcount = 0; | ||
| 2235 | mm_segment_t old_fs = get_fs(); | ||
| 2236 | |||
| 2237 | set_fs(KERNEL_DS); | ||
| 2238 | ret = sys_sysinfo((struct sysinfo __user *) &s); | ||
| 2239 | set_fs(old_fs); | ||
| 2240 | /* Check to see if any memory value is too large for 32-bit and | ||
| 2241 | * scale down if needed. | ||
| 2242 | */ | ||
| 2243 | if ((s.totalram >> 32) || (s.totalswap >> 32)) { | ||
| 2244 | while (s.mem_unit < PAGE_SIZE) { | ||
| 2245 | s.mem_unit <<= 1; | ||
| 2246 | bitcount++; | ||
| 2247 | } | ||
| 2248 | s.totalram >>= bitcount; | ||
| 2249 | s.freeram >>= bitcount; | ||
| 2250 | s.sharedram >>= bitcount; | ||
| 2251 | s.bufferram >>= bitcount; | ||
| 2252 | s.totalswap >>= bitcount; | ||
| 2253 | s.freeswap >>= bitcount; | ||
| 2254 | s.totalhigh >>= bitcount; | ||
| 2255 | s.freehigh >>= bitcount; | ||
| 2256 | } | ||
| 2257 | |||
| 2258 | if (!access_ok(VERIFY_WRITE, info, sizeof(*info))) | ||
| 2259 | return -EFAULT; | ||
| 2260 | |||
| 2261 | err = __put_user(s.uptime, &info->uptime); | ||
| 2262 | err |= __put_user(s.loads[0], &info->loads[0]); | ||
| 2263 | err |= __put_user(s.loads[1], &info->loads[1]); | ||
| 2264 | err |= __put_user(s.loads[2], &info->loads[2]); | ||
| 2265 | err |= __put_user(s.totalram, &info->totalram); | ||
| 2266 | err |= __put_user(s.freeram, &info->freeram); | ||
| 2267 | err |= __put_user(s.sharedram, &info->sharedram); | ||
| 2268 | err |= __put_user(s.bufferram, &info->bufferram); | ||
| 2269 | err |= __put_user(s.totalswap, &info->totalswap); | ||
| 2270 | err |= __put_user(s.freeswap, &info->freeswap); | ||
| 2271 | err |= __put_user(s.procs, &info->procs); | ||
| 2272 | err |= __put_user (s.totalhigh, &info->totalhigh); | ||
| 2273 | err |= __put_user (s.freehigh, &info->freehigh); | ||
| 2274 | err |= __put_user (s.mem_unit, &info->mem_unit); | ||
| 2275 | if (err) | ||
| 2276 | return -EFAULT; | ||
| 2277 | return ret; | ||
| 2278 | } | ||
| 2279 | |||
| 2280 | asmlinkage long | 2212 | asmlinkage long |
| 2281 | sys32_sched_rr_get_interval (pid_t pid, struct compat_timespec __user *interval) | 2213 | sys32_sched_rr_get_interval (pid_t pid, struct compat_timespec __user *interval) |
| 2282 | { | 2214 | { |
diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c index 0b8ce59429a8..ca7ad78f4def 100644 --- a/arch/mips/kernel/linux32.c +++ b/arch/mips/kernel/linux32.c | |||
| @@ -193,50 +193,6 @@ sysn32_waitid(int which, compat_pid_t pid, | |||
| 193 | return ret; | 193 | return ret; |
| 194 | } | 194 | } |
| 195 | 195 | ||
| 196 | struct sysinfo32 { | ||
| 197 | s32 uptime; | ||
| 198 | u32 loads[3]; | ||
| 199 | u32 totalram; | ||
| 200 | u32 freeram; | ||
| 201 | u32 sharedram; | ||
| 202 | u32 bufferram; | ||
| 203 | u32 totalswap; | ||
| 204 | u32 freeswap; | ||
| 205 | u16 procs; | ||
| 206 | u32 totalhigh; | ||
| 207 | u32 freehigh; | ||
| 208 | u32 mem_unit; | ||
| 209 | char _f[8]; | ||
| 210 | }; | ||
| 211 | |||
| 212 | asmlinkage int sys32_sysinfo(struct sysinfo32 __user *info) | ||
| 213 | { | ||
| 214 | struct sysinfo s; | ||
| 215 | int ret, err; | ||
| 216 | mm_segment_t old_fs = get_fs (); | ||
| 217 | |||
| 218 | set_fs (KERNEL_DS); | ||
| 219 | ret = sys_sysinfo((struct sysinfo __user *)&s); | ||
| 220 | set_fs (old_fs); | ||
| 221 | err = put_user (s.uptime, &info->uptime); | ||
| 222 | err |= __put_user (s.loads[0], &info->loads[0]); | ||
| 223 | err |= __put_user (s.loads[1], &info->loads[1]); | ||
| 224 | err |= __put_user (s.loads[2], &info->loads[2]); | ||
| 225 | err |= __put_user (s.totalram, &info->totalram); | ||
| 226 | err |= __put_user (s.freeram, &info->freeram); | ||
| 227 | err |= __put_user (s.sharedram, &info->sharedram); | ||
| 228 | err |= __put_user (s.bufferram, &info->bufferram); | ||
| 229 | err |= __put_user (s.totalswap, &info->totalswap); | ||
| 230 | err |= __put_user (s.freeswap, &info->freeswap); | ||
| 231 | err |= __put_user (s.procs, &info->procs); | ||
| 232 | err |= __put_user (s.totalhigh, &info->totalhigh); | ||
| 233 | err |= __put_user (s.freehigh, &info->freehigh); | ||
| 234 | err |= __put_user (s.mem_unit, &info->mem_unit); | ||
| 235 | if (err) | ||
| 236 | return -EFAULT; | ||
| 237 | return ret; | ||
| 238 | } | ||
| 239 | |||
| 240 | #define RLIM_INFINITY32 0x7fffffff | 196 | #define RLIM_INFINITY32 0x7fffffff |
| 241 | #define RESOURCE32(x) ((x > RLIM_INFINITY32) ? RLIM_INFINITY32 : x) | 197 | #define RESOURCE32(x) ((x > RLIM_INFINITY32) ? RLIM_INFINITY32 : x) |
| 242 | 198 | ||
diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index 39add2341aa2..ee8802b59758 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S | |||
| @@ -217,7 +217,7 @@ EXPORT(sysn32_call_table) | |||
| 217 | PTR sys32_gettimeofday | 217 | PTR sys32_gettimeofday |
| 218 | PTR compat_sys_getrlimit /* 6095 */ | 218 | PTR compat_sys_getrlimit /* 6095 */ |
| 219 | PTR compat_sys_getrusage | 219 | PTR compat_sys_getrusage |
| 220 | PTR sys32_sysinfo | 220 | PTR compat_sys_sysinfo |
| 221 | PTR compat_sys_times | 221 | PTR compat_sys_times |
| 222 | PTR sys32_ptrace | 222 | PTR sys32_ptrace |
| 223 | PTR sys_getuid /* 6100 */ | 223 | PTR sys_getuid /* 6100 */ |
diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S index c58b8e0105ea..c5f590ca99b0 100644 --- a/arch/mips/kernel/scall64-o32.S +++ b/arch/mips/kernel/scall64-o32.S | |||
| @@ -321,7 +321,7 @@ sys_call_table: | |||
| 321 | PTR sys_ni_syscall /* sys_vm86 */ | ||
