11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * This file is subject to the terms and conditions of the GNU General Public 31da177e4SLinus Torvalds * License. See the file "COPYING" in the main directory of this archive 41da177e4SLinus Torvalds * for more details. 51da177e4SLinus Torvalds * 61da177e4SLinus Torvalds * Copyright (C) 1995, 1996, 1997, 2000, 2001, 05 by Ralf Baechle 71da177e4SLinus Torvalds * Copyright (C) 1999, 2000 Silicon Graphics, Inc. 81da177e4SLinus Torvalds * Copyright (C) 2001 MIPS Technologies, Inc. 91da177e4SLinus Torvalds */ 103c37026dSRalf Baechle #include <linux/config.h> 111da177e4SLinus Torvalds #include <linux/a.out.h> 12a9415644SRandy Dunlap #include <linux/capability.h> 131da177e4SLinus Torvalds #include <linux/errno.h> 141da177e4SLinus Torvalds #include <linux/linkage.h> 151da177e4SLinus Torvalds #include <linux/mm.h> 161da177e4SLinus Torvalds #include <linux/smp.h> 171da177e4SLinus Torvalds #include <linux/smp_lock.h> 181da177e4SLinus Torvalds #include <linux/mman.h> 191da177e4SLinus Torvalds #include <linux/ptrace.h> 201da177e4SLinus Torvalds #include <linux/sched.h> 211da177e4SLinus Torvalds #include <linux/string.h> 221da177e4SLinus Torvalds #include <linux/syscalls.h> 231da177e4SLinus Torvalds #include <linux/file.h> 241da177e4SLinus Torvalds #include <linux/slab.h> 251da177e4SLinus Torvalds #include <linux/utsname.h> 261da177e4SLinus Torvalds #include <linux/unistd.h> 271da177e4SLinus Torvalds #include <linux/sem.h> 281da177e4SLinus Torvalds #include <linux/msg.h> 291da177e4SLinus Torvalds #include <linux/shm.h> 301da177e4SLinus Torvalds #include <linux/compiler.h> 319ff77c46SRalf Baechle #include <linux/module.h> 321da177e4SLinus Torvalds 331da177e4SLinus Torvalds #include <asm/branch.h> 341da177e4SLinus Torvalds #include <asm/cachectl.h> 351da177e4SLinus Torvalds #include <asm/cacheflush.h> 361da177e4SLinus Torvalds #include <asm/ipc.h> 37048eb582SSam Ravnborg #include <asm/asm-offsets.h> 381da177e4SLinus Torvalds #include <asm/signal.h> 391da177e4SLinus Torvalds #include <asm/sim.h> 401da177e4SLinus Torvalds #include <asm/shmparam.h> 411da177e4SLinus Torvalds #include <asm/sysmips.h> 421da177e4SLinus Torvalds #include <asm/uaccess.h> 431da177e4SLinus Torvalds 441da177e4SLinus Torvalds asmlinkage int sys_pipe(nabi_no_regargs volatile struct pt_regs regs) 451da177e4SLinus Torvalds { 461da177e4SLinus Torvalds int fd[2]; 471da177e4SLinus Torvalds int error, res; 481da177e4SLinus Torvalds 491da177e4SLinus Torvalds error = do_pipe(fd); 501da177e4SLinus Torvalds if (error) { 511da177e4SLinus Torvalds res = error; 521da177e4SLinus Torvalds goto out; 531da177e4SLinus Torvalds } 541da177e4SLinus Torvalds regs.regs[3] = fd[1]; 551da177e4SLinus Torvalds res = fd[0]; 561da177e4SLinus Torvalds out: 571da177e4SLinus Torvalds return res; 581da177e4SLinus Torvalds } 591da177e4SLinus Torvalds 601da177e4SLinus Torvalds unsigned long shm_align_mask = PAGE_SIZE - 1; /* Sane caches */ 611da177e4SLinus Torvalds 629ff77c46SRalf Baechle EXPORT_SYMBOL(shm_align_mask); 639ff77c46SRalf Baechle 641da177e4SLinus Torvalds #define COLOUR_ALIGN(addr,pgoff) \ 651da177e4SLinus Torvalds ((((addr) + shm_align_mask) & ~shm_align_mask) + \ 661da177e4SLinus Torvalds (((pgoff) << PAGE_SHIFT) & shm_align_mask)) 671da177e4SLinus Torvalds 681da177e4SLinus Torvalds unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, 691da177e4SLinus Torvalds unsigned long len, unsigned long pgoff, unsigned long flags) 701da177e4SLinus Torvalds { 711da177e4SLinus Torvalds struct vm_area_struct * vmm; 721da177e4SLinus Torvalds int do_color_align; 731da177e4SLinus Torvalds unsigned long task_size; 741da177e4SLinus Torvalds 751da177e4SLinus Torvalds task_size = STACK_TOP; 761da177e4SLinus Torvalds 771da177e4SLinus Torvalds if (flags & MAP_FIXED) { 781da177e4SLinus Torvalds /* 791da177e4SLinus Torvalds * We do not accept a shared mapping if it would violate 801da177e4SLinus Torvalds * cache aliasing constraints. 811da177e4SLinus Torvalds */ 821da177e4SLinus Torvalds if ((flags & MAP_SHARED) && (addr & shm_align_mask)) 831da177e4SLinus Torvalds return -EINVAL; 841da177e4SLinus Torvalds return addr; 851da177e4SLinus Torvalds } 861da177e4SLinus Torvalds 871da177e4SLinus Torvalds if (len > task_size) 881da177e4SLinus Torvalds return -ENOMEM; 891da177e4SLinus Torvalds do_color_align = 0; 901da177e4SLinus Torvalds if (filp || (flags & MAP_SHARED)) 911da177e4SLinus Torvalds do_color_align = 1; 921da177e4SLinus Torvalds if (addr) { 931da177e4SLinus Torvalds if (do_color_align) 941da177e4SLinus Torvalds addr = COLOUR_ALIGN(addr, pgoff); 951da177e4SLinus Torvalds else 961da177e4SLinus Torvalds addr = PAGE_ALIGN(addr); 971da177e4SLinus Torvalds vmm = find_vma(current->mm, addr); 981da177e4SLinus Torvalds if (task_size - len >= addr && 991da177e4SLinus Torvalds (!vmm || addr + len <= vmm->vm_start)) 1001da177e4SLinus Torvalds return addr; 1011da177e4SLinus Torvalds } 1021da177e4SLinus Torvalds addr = TASK_UNMAPPED_BASE; 1031da177e4SLinus Torvalds if (do_color_align) 1041da177e4SLinus Torvalds addr = COLOUR_ALIGN(addr, pgoff); 1051da177e4SLinus Torvalds else 1061da177e4SLinus Torvalds addr = PAGE_ALIGN(addr); 1071da177e4SLinus Torvalds 1081da177e4SLinus Torvalds for (vmm = find_vma(current->mm, addr); ; vmm = vmm->vm_next) { 1091da177e4SLinus Torvalds /* At this point: (!vmm || addr < vmm->vm_end). */ 1101da177e4SLinus Torvalds if (task_size - len < addr) 1111da177e4SLinus Torvalds return -ENOMEM; 1121da177e4SLinus Torvalds if (!vmm || addr + len <= vmm->vm_start) 1131da177e4SLinus Torvalds return addr; 1141da177e4SLinus Torvalds addr = vmm->vm_end; 1151da177e4SLinus Torvalds if (do_color_align) 1161da177e4SLinus Torvalds addr = COLOUR_ALIGN(addr, pgoff); 1171da177e4SLinus Torvalds } 1181da177e4SLinus Torvalds } 1191da177e4SLinus Torvalds 1201da177e4SLinus Torvalds /* common code for old and new mmaps */ 1211da177e4SLinus Torvalds static inline unsigned long 1221da177e4SLinus Torvalds do_mmap2(unsigned long addr, unsigned long len, unsigned long prot, 1231da177e4SLinus Torvalds unsigned long flags, unsigned long fd, unsigned long pgoff) 1241da177e4SLinus Torvalds { 1251da177e4SLinus Torvalds unsigned long error = -EBADF; 1261da177e4SLinus Torvalds struct file * file = NULL; 1271da177e4SLinus Torvalds 1281da177e4SLinus Torvalds flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); 1291da177e4SLinus Torvalds if (!(flags & MAP_ANONYMOUS)) { 1301da177e4SLinus Torvalds file = fget(fd); 1311da177e4SLinus Torvalds if (!file) 1321da177e4SLinus Torvalds goto out; 1331da177e4SLinus Torvalds } 1341da177e4SLinus Torvalds 1351da177e4SLinus Torvalds down_write(¤t->mm->mmap_sem); 1361da177e4SLinus Torvalds error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); 1371da177e4SLinus Torvalds up_write(¤t->mm->mmap_sem); 1381da177e4SLinus Torvalds 1391da177e4SLinus Torvalds if (file) 1401da177e4SLinus Torvalds fput(file); 1411da177e4SLinus Torvalds out: 1421da177e4SLinus Torvalds return error; 1431da177e4SLinus Torvalds } 1441da177e4SLinus Torvalds 1451da177e4SLinus Torvalds asmlinkage unsigned long 1461da177e4SLinus Torvalds old_mmap(unsigned long addr, unsigned long len, int prot, 1471da177e4SLinus Torvalds int flags, int fd, off_t offset) 1481da177e4SLinus Torvalds { 1491da177e4SLinus Torvalds unsigned long result; 1501da177e4SLinus Torvalds 1511da177e4SLinus Torvalds result = -EINVAL; 1521da177e4SLinus Torvalds if (offset & ~PAGE_MASK) 1531da177e4SLinus Torvalds goto out; 1541da177e4SLinus Torvalds 1551da177e4SLinus Torvalds result = do_mmap2(addr, len, prot, flags, fd, offset >> PAGE_SHIFT); 1561da177e4SLinus Torvalds 1571da177e4SLinus Torvalds out: 1581da177e4SLinus Torvalds return result; 1591da177e4SLinus Torvalds } 1601da177e4SLinus Torvalds 1611da177e4SLinus Torvalds asmlinkage unsigned long 1621da177e4SLinus Torvalds sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot, 1631da177e4SLinus Torvalds unsigned long flags, unsigned long fd, unsigned long pgoff) 1641da177e4SLinus Torvalds { 1651da177e4SLinus Torvalds return do_mmap2(addr, len, prot, flags, fd, pgoff); 1661da177e4SLinus Torvalds } 1671da177e4SLinus Torvalds 1681da177e4SLinus Torvalds save_static_function(sys_fork); 1691da177e4SLinus Torvalds __attribute_used__ noinline static int 1701da177e4SLinus Torvalds _sys_fork(nabi_no_regargs struct pt_regs regs) 1711da177e4SLinus Torvalds { 1721da177e4SLinus Torvalds return do_fork(SIGCHLD, regs.regs[29], ®s, 0, NULL, NULL); 1731da177e4SLinus Torvalds } 1741da177e4SLinus Torvalds 1751da177e4SLinus Torvalds save_static_function(sys_clone); 1761da177e4SLinus Torvalds __attribute_used__ noinline static int 1771da177e4SLinus Torvalds _sys_clone(nabi_no_regargs struct pt_regs regs) 1781da177e4SLinus Torvalds { 1791da177e4SLinus Torvalds unsigned long clone_flags; 1801da177e4SLinus Torvalds unsigned long newsp; 1813c37026dSRalf Baechle int __user *parent_tidptr, *child_tidptr; 1821da177e4SLinus Torvalds 1831da177e4SLinus Torvalds clone_flags = regs.regs[4]; 1841da177e4SLinus Torvalds newsp = regs.regs[5]; 1851da177e4SLinus Torvalds if (!newsp) 1861da177e4SLinus Torvalds newsp = regs.regs[29]; 1873c37026dSRalf Baechle parent_tidptr = (int __user *) regs.regs[6]; 1883c37026dSRalf Baechle #ifdef CONFIG_32BIT 1893c37026dSRalf Baechle /* We need to fetch the fifth argument off the stack. */ 1903c37026dSRalf Baechle child_tidptr = NULL; 1913c37026dSRalf Baechle if (clone_flags & (CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID)) { 1923c37026dSRalf Baechle int __user *__user *usp = (int __user *__user *) regs.regs[29]; 1933c37026dSRalf Baechle if (regs.regs[2] == __NR_syscall) { 1943c37026dSRalf Baechle if (get_user (child_tidptr, &usp[5])) 1953c37026dSRalf Baechle return -EFAULT; 1963c37026dSRalf Baechle } 1973c37026dSRalf Baechle else if (get_user (child_tidptr, &usp[4])) 1983c37026dSRalf Baechle return -EFAULT; 1993c37026dSRalf Baechle } 2003c37026dSRalf Baechle #else 2013c37026dSRalf Baechle child_tidptr = (int __user *) regs.regs[8]; 2023c37026dSRalf Baechle #endif 2031da177e4SLinus Torvalds return do_fork(clone_flags, newsp, ®s, 0, 2041da177e4SLinus Torvalds parent_tidptr, child_tidptr); 2051da177e4SLinus Torvalds } 2061da177e4SLinus Torvalds 2071da177e4SLinus Torvalds /* 2081da177e4SLinus Torvalds * sys_execve() executes a new program. 2091da177e4SLinus Torvalds */ 2101da177e4SLinus Torvalds asmlinkage int sys_execve(nabi_no_regargs struct pt_regs regs) 2111da177e4SLinus Torvalds { 2121da177e4SLinus Torvalds int error; 2131da177e4SLinus Torvalds char * filename; 2141da177e4SLinus Torvalds 2151da177e4SLinus Torvalds filename = getname((char *) (long)regs.regs[4]); 2161da177e4SLinus Torvalds error = PTR_ERR(filename); 2171da177e4SLinus Torvalds if (IS_ERR(filename)) 2181da177e4SLinus Torvalds goto out; 2191da177e4SLinus Torvalds error = do_execve(filename, (char **) (long)regs.regs[5], 2201da177e4SLinus Torvalds (char **) (long)regs.regs[6], ®s); 2211da177e4SLinus Torvalds putname(filename); 2221da177e4SLinus Torvalds 2231da177e4SLinus Torvalds out: 2241da177e4SLinus Torvalds return error; 2251da177e4SLinus Torvalds } 2261da177e4SLinus Torvalds 2271da177e4SLinus Torvalds /* 2281da177e4SLinus Torvalds * Compacrapability ... 2291da177e4SLinus Torvalds */ 2301da177e4SLinus Torvalds asmlinkage int sys_uname(struct old_utsname * name) 2311da177e4SLinus Torvalds { 2321da177e4SLinus Torvalds if (name && !copy_to_user(name, &system_utsname, sizeof (*name))) 2331da177e4SLinus Torvalds return 0; 2341da177e4SLinus Torvalds return -EFAULT; 2351da177e4SLinus Torvalds } 2361da177e4SLinus Torvalds 2371da177e4SLinus Torvalds /* 2381da177e4SLinus Torvalds * Compacrapability ... 2391da177e4SLinus Torvalds */ 2401da177e4SLinus Torvalds asmlinkage int sys_olduname(struct oldold_utsname * name) 2411da177e4SLinus Torvalds { 2421da177e4SLinus Torvalds int error; 2431da177e4SLinus Torvalds 2441da177e4SLinus Torvalds if (!name) 2451da177e4SLinus Torvalds return -EFAULT; 2461da177e4SLinus Torvalds if (!access_ok(VERIFY_WRITE,name,sizeof(struct oldold_utsname))) 2471da177e4SLinus Torvalds return -EFAULT; 2481da177e4SLinus Torvalds 2491da177e4SLinus Torvalds error = __copy_to_user(&name->sysname,&system_utsname.sysname,__OLD_UTS_LEN); 2501da177e4SLinus Torvalds error -= __put_user(0,name->sysname+__OLD_UTS_LEN); 2511da177e4SLinus Torvalds error -= __copy_to_user(&name->nodename,&system_utsname.nodename,__OLD_UTS_LEN); 2521da177e4SLinus Torvalds error -= __put_user(0,name->nodename+__OLD_UTS_LEN); 2531da177e4SLinus Torvalds error -= __copy_to_user(&name->release,&system_utsname.release,__OLD_UTS_LEN); 2541da177e4SLinus Torvalds error -= __put_user(0,name->release+__OLD_UTS_LEN); 2551da177e4SLinus Torvalds error -= __copy_to_user(&name->version,&system_utsname.version,__OLD_UTS_LEN); 2561da177e4SLinus Torvalds error -= __put_user(0,name->version+__OLD_UTS_LEN); 2571da177e4SLinus Torvalds error -= __copy_to_user(&name->machine,&system_utsname.machine,__OLD_UTS_LEN); 2581da177e4SLinus Torvalds error = __put_user(0,name->machine+__OLD_UTS_LEN); 2591da177e4SLinus Torvalds error = error ? -EFAULT : 0; 2601da177e4SLinus Torvalds 2611da177e4SLinus Torvalds return error; 2621da177e4SLinus Torvalds } 2631da177e4SLinus Torvalds 2643c37026dSRalf Baechle void sys_set_thread_area(unsigned long addr) 2653c37026dSRalf Baechle { 266*dc8f6029SAl Viro struct thread_info *ti = task_thread_info(current); 2673c37026dSRalf Baechle 2683c37026dSRalf Baechle ti->tp_value = addr; 2693c37026dSRalf Baechle 2703c37026dSRalf Baechle /* If some future MIPS implementation has this register in hardware, 2713c37026dSRalf Baechle * we will need to update it here (and in context switches). */ 2723c37026dSRalf Baechle } 2733c37026dSRalf Baechle 2741da177e4SLinus Torvalds asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3) 2751da177e4SLinus Torvalds { 2761da177e4SLinus Torvalds int tmp, len; 2771da177e4SLinus Torvalds char *name; 2781da177e4SLinus Torvalds 2791da177e4SLinus Torvalds switch(cmd) { 2801da177e4SLinus Torvalds case SETNAME: { 2811da177e4SLinus Torvalds char nodename[__NEW_UTS_LEN + 1]; 2821da177e4SLinus Torvalds 2831da177e4SLinus Torvalds if (!capable(CAP_SYS_ADMIN)) 2841da177e4SLinus Torvalds return -EPERM; 2851da177e4SLinus Torvalds 2861da177e4SLinus Torvalds name = (char *) arg1; 2871da177e4SLinus Torvalds 2881da177e4SLinus Torvalds len = strncpy_from_user(nodename, name, __NEW_UTS_LEN); 2891da177e4SLinus Torvalds if (len < 0) 2901da177e4SLinus Torvalds return -EFAULT; 2911da177e4SLinus Torvalds 2921da177e4SLinus Torvalds down_write(&uts_sem); 2931da177e4SLinus Torvalds strncpy(system_utsname.nodename, nodename, len); 2941da177e4SLinus Torvalds nodename[__NEW_UTS_LEN] = '\0'; 2951da177e4SLinus Torvalds strlcpy(system_utsname.nodename, nodename, 2961da177e4SLinus Torvalds sizeof(system_utsname.nodename)); 2971da177e4SLinus Torvalds up_write(&uts_sem); 2981da177e4SLinus Torvalds return 0; 2991da177e4SLinus Torvalds } 3001da177e4SLinus Torvalds 3011da177e4SLinus Torvalds case MIPS_ATOMIC_SET: 3021da177e4SLinus Torvalds printk(KERN_CRIT "How did I get here?\n"); 3031da177e4SLinus Torvalds return -EINVAL; 3041da177e4SLinus Torvalds 3051da177e4SLinus Torvalds case MIPS_FIXADE: 3061da177e4SLinus Torvalds tmp = current->thread.mflags & ~3; 3071da177e4SLinus Torvalds current->thread.mflags = tmp | (arg1 & 3); 3081da177e4SLinus Torvalds return 0; 3091da177e4SLinus Torvalds 3101da177e4SLinus Torvalds case FLUSH_CACHE: 3111da177e4SLinus Torvalds __flush_cache_all(); 3121da177e4SLinus Torvalds return 0; 3131da177e4SLinus Torvalds 3141da177e4SLinus Torvalds case MIPS_RDNVRAM: 3151da177e4SLinus Torvalds return -EIO; 3161da177e4SLinus Torvalds } 3171da177e4SLinus Torvalds 3181da177e4SLinus Torvalds return -EINVAL; 3191da177e4SLinus Torvalds } 3201da177e4SLinus Torvalds 3211da177e4SLinus Torvalds /* 3221da177e4SLinus Torvalds * sys_ipc() is the de-multiplexer for the SysV IPC calls.. 3231da177e4SLinus Torvalds * 3241da177e4SLinus Torvalds * This is really horribly ugly. 3251da177e4SLinus Torvalds */ 3261da177e4SLinus Torvalds asmlinkage int sys_ipc (uint call, int first, int second, 3271da177e4SLinus Torvalds unsigned long third, void *ptr, long fifth) 3281da177e4SLinus Torvalds { 3291da177e4SLinus Torvalds int version, ret; 3301da177e4SLinus Torvalds 3311da177e4SLinus Torvalds version = call >> 16; /* hack for backward compatibility */ 3321da177e4SLinus Torvalds call &= 0xffff; 3331da177e4SLinus Torvalds 3341da177e4SLinus Torvalds switch (call) { 3351da177e4SLinus Torvalds case SEMOP: 3361da177e4SLinus Torvalds return sys_semtimedop (first, (struct sembuf *)ptr, second, 3371da177e4SLinus Torvalds NULL); 3381da177e4SLinus Torvalds case SEMTIMEDOP: 3391da177e4SLinus Torvalds return sys_semtimedop (first, (struct sembuf *)ptr, second, 3401da177e4SLinus Torvalds (const struct timespec __user *)fifth); 3411da177e4SLinus Torvalds case SEMGET: 3421da177e4SLinus Torvalds return sys_semget (first, second, third); 3431da177e4SLinus Torvalds case SEMCTL: { 3441da177e4SLinus Torvalds union semun fourth; 3451da177e4SLinus Torvalds if (!ptr) 3461da177e4SLinus Torvalds return -EINVAL; 3471da177e4SLinus Torvalds if (get_user(fourth.__pad, (void **) ptr)) 3481da177e4SLinus Torvalds return -EFAULT; 3491da177e4SLinus Torvalds return sys_semctl (first, second, third, fourth); 3501da177e4SLinus Torvalds } 3511da177e4SLinus Torvalds 3521da177e4SLinus Torvalds case MSGSND: 3531da177e4SLinus Torvalds return sys_msgsnd (first, (struct msgbuf *) ptr, 3541da177e4SLinus Torvalds second, third); 3551da177e4SLinus Torvalds case MSGRCV: 3561da177e4SLinus Torvalds switch (version) { 3571da177e4SLinus Torvalds case 0: { 3581da177e4SLinus Torvalds struct ipc_kludge tmp; 3591da177e4SLinus Torvalds if (!ptr) 3601da177e4SLinus Torvalds return -EINVAL; 3611da177e4SLinus Torvalds 3621da177e4SLinus Torvalds if (copy_from_user(&tmp, 3631da177e4SLinus Torvalds (struct ipc_kludge *) ptr, 3641da177e4SLinus Torvalds sizeof (tmp))) 3651da177e4SLinus Torvalds return -EFAULT; 3661da177e4SLinus Torvalds return sys_msgrcv (first, tmp.msgp, second, 3671da177e4SLinus Torvalds tmp.msgtyp, third); 3681da177e4SLinus Torvalds } 3691da177e4SLinus Torvalds default: 3701da177e4SLinus Torvalds return sys_msgrcv (first, 3711da177e4SLinus Torvalds (struct msgbuf *) ptr, 3721da177e4SLinus Torvalds second, fifth, third); 3731da177e4SLinus Torvalds } 3741da177e4SLinus Torvalds case MSGGET: 3751da177e4SLinus Torvalds return sys_msgget ((key_t) first, second); 3761da177e4SLinus Torvalds case MSGCTL: 3771da177e4SLinus Torvalds return sys_msgctl (first, second, (struct msqid_ds *) ptr); 3781da177e4SLinus Torvalds 3791da177e4SLinus Torvalds case SHMAT: 3801da177e4SLinus Torvalds switch (version) { 3811da177e4SLinus Torvalds default: { 3821da177e4SLinus Torvalds ulong raddr; 3831da177e4SLinus Torvalds ret = do_shmat (first, (char *) ptr, second, &raddr); 3841da177e4SLinus Torvalds if (ret) 3851da177e4SLinus Torvalds return ret; 3861da177e4SLinus Torvalds return put_user (raddr, (ulong *) third); 3871da177e4SLinus Torvalds } 3881da177e4SLinus Torvalds case 1: /* iBCS2 emulator entry point */ 3891da177e4SLinus Torvalds if (!segment_eq(get_fs(), get_ds())) 3901da177e4SLinus Torvalds return -EINVAL; 3911da177e4SLinus Torvalds return do_shmat (first, (char *) ptr, second, (ulong *) third); 3921da177e4SLinus Torvalds } 3931da177e4SLinus Torvalds case SHMDT: 3941da177e4SLinus Torvalds return sys_shmdt ((char *)ptr); 3951da177e4SLinus Torvalds case SHMGET: 3961da177e4SLinus Torvalds return sys_shmget (first, second, third); 3971da177e4SLinus Torvalds case SHMCTL: 3981da177e4SLinus Torvalds return sys_shmctl (first, second, 3991da177e4SLinus Torvalds (struct shmid_ds *) ptr); 4001da177e4SLinus Torvalds default: 4011da177e4SLinus Torvalds return -ENOSYS; 4021da177e4SLinus Torvalds } 4031da177e4SLinus Torvalds } 4041da177e4SLinus Torvalds 4051da177e4SLinus Torvalds /* 4061da177e4SLinus Torvalds * No implemented yet ... 4071da177e4SLinus Torvalds */ 4081da177e4SLinus Torvalds asmlinkage int sys_cachectl(char *addr, int nbytes, int op) 4091da177e4SLinus Torvalds { 4101da177e4SLinus Torvalds return -ENOSYS; 4111da177e4SLinus Torvalds } 4121da177e4SLinus Torvalds 4131da177e4SLinus Torvalds /* 4141da177e4SLinus Torvalds * If we ever come here the user sp is bad. Zap the process right away. 4151da177e4SLinus Torvalds * Due to the bad stack signaling wouldn't work. 4161da177e4SLinus Torvalds */ 4171da177e4SLinus Torvalds asmlinkage void bad_stack(void) 4181da177e4SLinus Torvalds { 4191da177e4SLinus Torvalds do_exit(SIGSEGV); 4201da177e4SLinus Torvalds } 421