aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/syscalls.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/kernel/syscalls.c')
-rw-r--r--arch/powerpc/kernel/syscalls.c179
1 files changed, 1 insertions, 178 deletions
diff --git a/arch/powerpc/kernel/syscalls.c b/arch/powerpc/kernel/syscalls.c
index c04832c4a02e..f2496f2faecc 100644
--- a/arch/powerpc/kernel/syscalls.c
+++ b/arch/powerpc/kernel/syscalls.c
@@ -42,105 +42,10 @@
42#include <asm/time.h> 42#include <asm/time.h>
43#include <asm/unistd.h> 43#include <asm/unistd.h>
44 44
45/*
46 * sys_ipc() is the de-multiplexer for the SysV IPC calls..
47 *
48 * This is really horribly ugly.
49 */
50int sys_ipc(uint call, int first, unsigned long second, long third,
51 void __user *ptr, long fifth)
52{
53 int version, ret;
54
55 version = call >> 16; /* hack for backward compatibility */
56 call &= 0xffff;
57
58 ret = -ENOSYS;
59 switch (call) {
60 case SEMOP:
61 ret = sys_semtimedop(first, (struct sembuf __user *)ptr,
62 (unsigned)second, NULL);
63 break;
64 case SEMTIMEDOP:
65 ret = sys_semtimedop(first, (struct sembuf __user *)ptr,
66 (unsigned)second,
67 (const struct timespec __user *) fifth);
68 break;
69 case SEMGET:
70 ret = sys_semget (first, (int)second, third);
71 break;
72 case SEMCTL: {
73 union semun fourth;
74
75 ret = -EINVAL;
76 if (!ptr)
77 break;
78 if ((ret = get_user(fourth.__pad, (void __user * __user *)ptr)))
79 break;
80 ret = sys_semctl(first, (int)second, third, fourth);
81 break;
82 }
83 case MSGSND:
84 ret = sys_msgsnd(first, (struct msgbuf __user *)ptr,
85 (size_t)second, third);
86 break;
87 case MSGRCV:
88 switch (version) {
89 case 0: {
90 struct ipc_kludge tmp;
91
92 ret = -EINVAL;
93 if (!ptr)
94 break;
95 if ((ret = copy_from_user(&tmp,
96 (struct ipc_kludge __user *) ptr,
97 sizeof (tmp)) ? -EFAULT : 0))
98 break;
99 ret = sys_msgrcv(first, tmp.msgp, (size_t) second,
100 tmp.msgtyp, third);
101 break;
102 }
103 default:
104 ret = sys_msgrcv (first, (struct msgbuf __user *) ptr,
105 (size_t)second, fifth, third);
106 break;
107 }
108 break;
109 case MSGGET:
110 ret = sys_msgget((key_t)first, (int)second);
111 break;
112 case MSGCTL:
113 ret = sys_msgctl(first, (int)second,
114 (struct msqid_ds __user *)ptr);
115 break;
116 case SHMAT: {
117 ulong raddr;
118 ret = do_shmat(first, (char __user *)ptr, (int)second, &raddr);
119 if (ret)
120 break;
121 ret = put_user(raddr, (ulong __user *) third);
122 break;
123 }
124 case SHMDT:
125 ret = sys_shmdt((char __user *)ptr);
126 break;
127 case SHMGET:
128 ret = sys_shmget(first, (size_t)second, third);
129 break;
130 case SHMCTL:
131 ret = sys_shmctl(first, (int)second,
132 (struct shmid_ds __user *)ptr);
133 break;
134 }
135
136 return ret;
137}
138
139static inline unsigned long do_mmap2(unsigned long addr, size_t len, 45static inline unsigned long do_mmap2(unsigned long addr, size_t len,
140 unsigned long prot, unsigned long flags, 46 unsigned long prot, unsigned long flags,
141 unsigned long fd, unsigned long off, int shift) 47 unsigned long fd, unsigned long off, int shift)
142{ 48{
143 struct file * file = NULL;
144 unsigned long ret = -EINVAL; 49 unsigned long ret = -EINVAL;
145 50
146 if (!arch_validate_prot(prot)) 51 if (!arch_validate_prot(prot))
@@ -151,20 +56,8 @@ static inline unsigned long do_mmap2(unsigned long addr, size_t len,
151 goto out; 56 goto out;
152 off >>= shift; 57 off >>= shift;
153 } 58 }
154
155 ret = -EBADF;
156 if (!(flags & MAP_ANONYMOUS)) {
157 if (!(file = fget(fd)))
158 goto out;
159 }
160 59
161 flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); 60 ret = sys_mmap_pgoff(addr, len, prot, flags, fd, off);
162
163 down_write(&current->mm->mmap_sem);
164 ret = do_mmap_pgoff(file, addr, len, prot, flags, off);
165 up_write(&current->mm->mmap_sem);
166 if (file)
167 fput(file);
168out: 61out:
169 return ret; 62 return ret;
170} 63}
@@ -223,76 +116,6 @@ long ppc64_personality(unsigned long personality)
223} 116}
224#endif 117#endif
225 118
226#ifdef CONFIG_PPC64
227#define OVERRIDE_MACHINE (personality(current->personality) == PER_LINUX32)
228#else
229#define OVERRIDE_MACHINE 0
230#endif
231
232static inline int override_machine(char __user *mach)
233{
234 if (OVERRIDE_MACHINE) {
235 /* change ppc64 to ppc */
236 if (__put_user(0, mach+3) || __put_user(0, mach+4))
237 return -EFAULT;
238 }
239 return 0;
240}
241
242long ppc_newuname(struct new_utsname __user * name)
243{
244 int err = 0;
245
246 down_read(&uts_sem);
247 if (copy_to_user(name, utsname(), sizeof(*name)))
248 err = -EFAULT;
249 up_read(&uts_sem);
250 if (!err)
251 err = override_machine(name->machine);
252 return err;
253}
254
255int sys_uname(struct old_utsname __user *name)
256{
257 int err = 0;
258
259 down_read(&uts_sem);
260 if (copy_to_user(name, utsname(), sizeof(*name)))
261 err = -EFAULT;
262 up_read(&uts_sem);
263 if (!err)
264 err = override_machine(name->machine);
265 return err;
266}
267
268int sys_olduname(struct oldold_utsname __user *name)
269{
270 int error;
271
272 if (!access_ok(VERIFY_WRITE, name, sizeof(struct oldold_utsname)))
273 return -EFAULT;
274
275 down_read(&uts_sem);
276 error = __copy_to_user(&name->sysname, &utsname()->sysname,
277 __OLD_UTS_LEN);
278 error |= __put_user(0, name->sysname + __OLD_UTS_LEN);
279 error |= __copy_to_user(&name->nodename, &utsname()->nodename,
280 __OLD_UTS_LEN);
281 error |= __put_user(0, name->nodename + __OLD_UTS_LEN);
282 error |= __copy_to_user(&name->release, &utsname()->release,
283 __OLD_UTS_LEN);
284 error |= __put_user(0, name->release + __OLD_UTS_LEN);
285 error |= __copy_to_user(&name->version, &utsname()->version,
286 __OLD_UTS_LEN);
287 error |= __put_user(0, name->version + __OLD_UTS_LEN);
288 error |= __copy_to_user(&name->machine, &utsname()->machine,
289 __OLD_UTS_LEN);
290 error |= override_machine(name->machine);
291 up_read(&uts_sem);
292
293 return error? -EFAULT: 0;
294}
295
296long ppc_fadvise64_64(int fd, int advice, u32 offset_high, u32 offset_low, 119long ppc_fadvise64_64(int fd, int advice, u32 offset_high, u32 offset_low,
297 u32 len_high, u32 len_low) 120 u32 len_high, u32 len_low)
298{ 121{