Add generic sys_ipc wrapper
[safe/jmp/linux-2.6] / arch / x86 / kernel / sys_i386_32.c
1 /*
2  * This file contains various random system calls that
3  * have a non-standard calling sequence on the Linux/i386
4  * platform.
5  */
6
7 #include <linux/errno.h>
8 #include <linux/sched.h>
9 #include <linux/mm.h>
10 #include <linux/fs.h>
11 #include <linux/smp.h>
12 #include <linux/sem.h>
13 #include <linux/msg.h>
14 #include <linux/shm.h>
15 #include <linux/stat.h>
16 #include <linux/syscalls.h>
17 #include <linux/mman.h>
18 #include <linux/file.h>
19 #include <linux/utsname.h>
20 #include <linux/ipc.h>
21
22 #include <linux/uaccess.h>
23 #include <linux/unistd.h>
24
25 #include <asm/syscalls.h>
26
27 /*
28  * Old cruft
29  */
30 asmlinkage int sys_uname(struct old_utsname __user *name)
31 {
32         int err;
33         if (!name)
34                 return -EFAULT;
35         down_read(&uts_sem);
36         err = copy_to_user(name, utsname(), sizeof(*name));
37         up_read(&uts_sem);
38         return err? -EFAULT:0;
39 }
40
41 asmlinkage int sys_olduname(struct oldold_utsname __user *name)
42 {
43         int error;
44
45         if (!name)
46                 return -EFAULT;
47         if (!access_ok(VERIFY_WRITE, name, sizeof(struct oldold_utsname)))
48                 return -EFAULT;
49
50         down_read(&uts_sem);
51
52         error = __copy_to_user(&name->sysname, &utsname()->sysname,
53                                __OLD_UTS_LEN);
54         error |= __put_user(0, name->sysname + __OLD_UTS_LEN);
55         error |= __copy_to_user(&name->nodename, &utsname()->nodename,
56                                 __OLD_UTS_LEN);
57         error |= __put_user(0, name->nodename + __OLD_UTS_LEN);
58         error |= __copy_to_user(&name->release, &utsname()->release,
59                                 __OLD_UTS_LEN);
60         error |= __put_user(0, name->release + __OLD_UTS_LEN);
61         error |= __copy_to_user(&name->version, &utsname()->version,
62                                 __OLD_UTS_LEN);
63         error |= __put_user(0, name->version + __OLD_UTS_LEN);
64         error |= __copy_to_user(&name->machine, &utsname()->machine,
65                                 __OLD_UTS_LEN);
66         error |= __put_user(0, name->machine + __OLD_UTS_LEN);
67
68         up_read(&uts_sem);
69
70         error = error ? -EFAULT : 0;
71
72         return error;
73 }
74
75
76 /*
77  * Do a system call from kernel instead of calling sys_execve so we
78  * end up with proper pt_regs.
79  */
80 int kernel_execve(const char *filename, char *const argv[], char *const envp[])
81 {
82         long __res;
83         asm volatile ("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx"
84         : "=a" (__res)
85         : "0" (__NR_execve), "ri" (filename), "c" (argv), "d" (envp) : "memory");
86         return __res;
87 }