| /* |
| * This file contains various random system calls that |
| * have a non-standard calling sequence on the Linux/i386 |
| * platform. |
| */ |
| |
| #include <linux/errno.h> |
| #include <linux/sched.h> |
| #include <linux/mm.h> |
| #include <linux/fs.h> |
| #include <linux/smp.h> |
| #include <linux/sem.h> |
| #include <linux/msg.h> |
| #include <linux/shm.h> |
| #include <linux/stat.h> |
| #include <linux/syscalls.h> |
| #include <linux/mman.h> |
| #include <linux/file.h> |
| #include <linux/utsname.h> |
| #include <linux/ipc.h> |
| |
| #include <linux/uaccess.h> |
| #include <linux/unistd.h> |
| |
| #include <asm/syscalls.h> |
| |
| /* |
| * Old cruft |
| */ |
| asmlinkage int sys_uname(struct old_utsname __user *name) |
| { |
| int err; |
| if (!name) |
| return -EFAULT; |
| down_read(&uts_sem); |
| err = copy_to_user(name, utsname(), sizeof(*name)); |
| up_read(&uts_sem); |
| return err? -EFAULT:0; |
| } |
| |
| asmlinkage int sys_olduname(struct oldold_utsname __user *name) |
| { |
| int error; |
| |
| if (!name) |
| return -EFAULT; |
| if (!access_ok(VERIFY_WRITE, name, sizeof(struct oldold_utsname))) |
| return -EFAULT; |
| |
| down_read(&uts_sem); |
| |
| error = __copy_to_user(&name->sysname, &utsname()->sysname, |
| __OLD_UTS_LEN); |
| error |= __put_user(0, name->sysname + __OLD_UTS_LEN); |
| error |= __copy_to_user(&name->nodename, &utsname()->nodename, |
| __OLD_UTS_LEN); |
| error |= __put_user(0, name->nodename + __OLD_UTS_LEN); |
| error |= __copy_to_user(&name->release, &utsname()->release, |
| __OLD_UTS_LEN); |
| error |= __put_user(0, name->release + __OLD_UTS_LEN); |
| error |= __copy_to_user(&name->version, &utsname()->version, |
| __OLD_UTS_LEN); |
| error |= __put_user(0, name->version + __OLD_UTS_LEN); |
| error |= __copy_to_user(&name->machine, &utsname()->machine, |
| __OLD_UTS_LEN); |
| error |= __put_user(0, name->machine + __OLD_UTS_LEN); |
| |
| up_read(&uts_sem); |
| |
| error = error ? -EFAULT : 0; |
| |
| return error; |
| } |
| |
| |
| /* |
| * Do a system call from kernel instead of calling sys_execve so we |
| * end up with proper pt_regs. |
| */ |
| int kernel_execve(const char *filename, char *const argv[], char *const envp[]) |
| { |
| long __res; |
| asm volatile ("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx" |
| : "=a" (__res) |
| : "0" (__NR_execve), "ri" (filename), "c" (argv), "d" (envp) : "memory"); |
| return __res; |
| } |