]>
Commit | Line | Data |
---|---|---|
1da177e4 | 1 | /* |
1da177e4 LT |
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> | |
4e950f6f | 10 | #include <linux/fs.h> |
1da177e4 | 11 | #include <linux/smp.h> |
1da177e4 LT |
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> | |
cba4fbbf | 20 | #include <linux/ipc.h> |
1da177e4 | 21 | |
5b80fe8b PC |
22 | #include <linux/uaccess.h> |
23 | #include <linux/unistd.h> | |
1da177e4 | 24 | |
bbc1f698 JS |
25 | #include <asm/syscalls.h> |
26 | ||
1da177e4 LT |
27 | /* |
28 | * Old cruft | |
29 | */ | |
5b80fe8b | 30 | asmlinkage int sys_uname(struct old_utsname __user *name) |
1da177e4 LT |
31 | { |
32 | int err; | |
33 | if (!name) | |
34 | return -EFAULT; | |
35 | down_read(&uts_sem); | |
5b80fe8b | 36 | err = copy_to_user(name, utsname(), sizeof(*name)); |
1da177e4 | 37 | up_read(&uts_sem); |
5b80fe8b | 38 | return err? -EFAULT:0; |
1da177e4 LT |
39 | } |
40 | ||
5b80fe8b | 41 | asmlinkage int sys_olduname(struct oldold_utsname __user *name) |
1da177e4 LT |
42 | { |
43 | int error; | |
44 | ||
45 | if (!name) | |
46 | return -EFAULT; | |
5b80fe8b | 47 | if (!access_ok(VERIFY_WRITE, name, sizeof(struct oldold_utsname))) |
1da177e4 | 48 | return -EFAULT; |
5b80fe8b PC |
49 | |
50 | down_read(&uts_sem); | |
51 | ||
e9ff3990 SH |
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); | |
5b80fe8b | 67 | |
1da177e4 | 68 | up_read(&uts_sem); |
5b80fe8b | 69 | |
1da177e4 LT |
70 | error = error ? -EFAULT : 0; |
71 | ||
72 | return error; | |
73 | } | |
fe74290d AB |
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) | |
5b80fe8b | 85 | : "0" (__NR_execve), "ri" (filename), "c" (argv), "d" (envp) : "memory"); |
fe74290d AB |
86 | return __res; |
87 | } |