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 */ 101da177e4SLinus Torvalds #include <linux/a.out.h> 111da177e4SLinus Torvalds #include <linux/errno.h> 121da177e4SLinus Torvalds #include <linux/linkage.h> 131da177e4SLinus Torvalds #include <linux/mm.h> 141da177e4SLinus Torvalds #include <linux/smp.h> 151da177e4SLinus Torvalds #include <linux/smp_lock.h> 161da177e4SLinus Torvalds #include <linux/mman.h> 171da177e4SLinus Torvalds #include <linux/ptrace.h> 181da177e4SLinus Torvalds #include <linux/sched.h> 191da177e4SLinus Torvalds #include <linux/string.h> 201da177e4SLinus Torvalds #include <linux/syscalls.h> 211da177e4SLinus Torvalds #include <linux/file.h> 221da177e4SLinus Torvalds #include <linux/slab.h> 231da177e4SLinus Torvalds #include <linux/utsname.h> 241da177e4SLinus Torvalds #include <linux/unistd.h> 251da177e4SLinus Torvalds #include <linux/sem.h> 261da177e4SLinus Torvalds #include <linux/msg.h> 271da177e4SLinus Torvalds #include <linux/shm.h> 281da177e4SLinus Torvalds #include <linux/compiler.h> 29*9ff77c46SRalf Baechle #include <linux/module.h> 301da177e4SLinus Torvalds 311da177e4SLinus Torvalds #include <asm/branch.h> 321da177e4SLinus Torvalds #include <asm/cachectl.h> 331da177e4SLinus Torvalds #include <asm/cacheflush.h> 341da177e4SLinus Torvalds #include <asm/ipc.h> 35048eb582SSam Ravnborg #include <asm/asm-offsets.h> 361da177e4SLinus Torvalds #include <asm/signal.h> 371da177e4SLinus Torvalds #include <asm/sim.h> 381da177e4SLinus Torvalds #include <asm/shmparam.h> 391da177e4SLinus Torvalds #include <asm/sysmips.h> 401da177e4SLinus Torvalds #include <asm/uaccess.h> 411da177e4SLinus Torvalds 421da177e4SLinus Torvalds asmlinkage int sys_pipe(nabi_no_regargs volatile struct pt_regs regs) 431da177e4SLinus Torvalds { 441da177e4SLinus Torvalds int fd[2]; 451da177e4SLinus Torvalds int error, res; 461da177e4SLinus Torvalds 471da177e4SLinus Torvalds error = do_pipe(fd); 481da177e4SLinus Torvalds if (error) { 491da177e4SLinus Torvalds res = error; 501da177e4SLinus Torvalds goto out; 511da177e4SLinus Torvalds } 521da177e4SLinus Torvalds regs.regs[3] = fd[1]; 531da177e4SLinus Torvalds res = fd[0]; 541da177e4SLinus Torvalds out: 551da177e4SLinus Torvalds return res; 561da177e4SLinus Torvalds } 571da177e4SLinus Torvalds 581da177e4SLinus Torvalds unsigned long shm_align_mask = PAGE_SIZE - 1; /* Sane caches */ 591da177e4SLinus Torvalds 60*9ff77c46SRalf Baechle EXPORT_SYMBOL(shm_align_mask); 61*9ff77c46SRalf Baechle 621da177e4SLinus Torvalds #define COLOUR_ALIGN(addr,pgoff) \ 631da177e4SLinus Torvalds ((((addr) + shm_align_mask) & ~shm_align_mask) + \ 641da177e4SLinus Torvalds (((pgoff) << PAGE_SHIFT) & shm_align_mask)) 651da177e4SLinus Torvalds 661da177e4SLinus Torvalds unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, 671da177e4SLinus Torvalds unsigned long len, unsigned long pgoff, unsigned long flags) 681da177e4SLinus Torvalds { 691da177e4SLinus Torvalds struct vm_area_struct * vmm; 701da177e4SLinus Torvalds int do_color_align; 711da177e4SLinus Torvalds unsigned long task_size; 721da177e4SLinus Torvalds 731da177e4SLinus Torvalds task_size = STACK_TOP; 741da177e4SLinus Torvalds 751da177e4SLinus Torvalds if (flags & MAP_FIXED) { 761da177e4SLinus Torvalds /* 771da177e4SLinus Torvalds * We do not accept a shared mapping if it would violate 781da177e4SLinus Torvalds * cache aliasing constraints. 791da177e4SLinus Torvalds */ 801da177e4SLinus Torvalds if ((flags & MAP_SHARED) && (addr & shm_align_mask)) 811da177e4SLinus Torvalds return -EINVAL; 821da177e4SLinus Torvalds return addr; 831da177e4SLinus Torvalds } 841da177e4SLinus Torvalds 851da177e4SLinus Torvalds if (len > task_size) 861da177e4SLinus Torvalds return -ENOMEM; 871da177e4SLinus Torvalds do_color_align = 0; 881da177e4SLinus Torvalds if (filp || (flags & MAP_SHARED)) 891da177e4SLinus Torvalds do_color_align = 1; 901da177e4SLinus Torvalds if (addr) { 911da177e4SLinus Torvalds if (do_color_align) 921da177e4SLinus Torvalds addr = COLOUR_ALIGN(addr, pgoff); 931da177e4SLinus Torvalds else 941da177e4SLinus Torvalds addr = PAGE_ALIGN(addr); 951da177e4SLinus Torvalds vmm = find_vma(current->mm, addr); 961da177e4SLinus Torvalds if (task_size - len >= addr && 971da177e4SLinus Torvalds (!vmm || addr + len <= vmm->vm_start)) 981da177e4SLinus Torvalds return addr; 991da177e4SLinus Torvalds } 1001da177e4SLinus Torvalds addr = TASK_UNMAPPED_BASE; 1011da177e4SLinus Torvalds if (do_color_align) 1021da177e4SLinus Torvalds addr = COLOUR_ALIGN(addr, pgoff); 1031da177e4SLinus Torvalds else 1041da177e4SLinus Torvalds addr = PAGE_ALIGN(addr); 1051da177e4SLinus Torvalds 1061da177e4SLinus Torvalds for (vmm = find_vma(current->mm, addr); ; vmm = vmm->vm_next) { 1071da177e4SLinus Torvalds /* At this point: (!vmm || addr < vmm->vm_end). */ 1081da177e4SLinus Torvalds if (task_size - len < addr) 1091da177e4SLinus Torvalds return -ENOMEM; 1101da177e4SLinus Torvalds if (!vmm || addr + len <= vmm->vm_start) 1111da177e4SLinus Torvalds return addr; 1121da177e4SLinus Torvalds addr = vmm->vm_end; 1131da177e4SLinus Torvalds if (do_color_align) 1141da177e4SLinus Torvalds addr = COLOUR_ALIGN(addr, pgoff); 1151da177e4SLinus Torvalds } 1161da177e4SLinus Torvalds } 1171da177e4SLinus Torvalds 1181da177e4SLinus Torvalds /* common code for old and new mmaps */ 1191da177e4SLinus Torvalds static inline unsigned long 1201da177e4SLinus Torvalds do_mmap2(unsigned long addr, unsigned long len, unsigned long prot, 1211da177e4SLinus Torvalds unsigned long flags, unsigned long fd, unsigned long pgoff) 1221da177e4SLinus Torvalds { 1231da177e4SLinus Torvalds unsigned long error = -EBADF; 1241da177e4SLinus Torvalds struct file * file = NULL; 1251da177e4SLinus Torvalds 1261da177e4SLinus Torvalds flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); 1271da177e4SLinus Torvalds if (!(flags & MAP_ANONYMOUS)) { 1281da177e4SLinus Torvalds file = fget(fd); 1291da177e4SLinus Torvalds if (!file) 1301da177e4SLinus Torvalds goto out; 1311da177e4SLinus Torvalds } 1321da177e4SLinus Torvalds 1331da177e4SLinus Torvalds down_write(¤t->mm->mmap_sem); 1341da177e4SLinus Torvalds error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); 1351da177e4SLinus Torvalds up_write(¤t->mm->mmap_sem); 1361da177e4SLinus Torvalds 1371da177e4SLinus Torvalds if (file) 1381da177e4SLinus Torvalds fput(file); 1391da177e4SLinus Torvalds out: 1401da177e4SLinus Torvalds return error; 1411da177e4SLinus Torvalds } 1421da177e4SLinus Torvalds 1431da177e4SLinus Torvalds asmlinkage unsigned long 1441da177e4SLinus Torvalds old_mmap(unsigned long addr, unsigned long len, int prot, 1451da177e4SLinus Torvalds int flags, int fd, off_t offset) 1461da177e4SLinus Torvalds { 1471da177e4SLinus Torvalds unsigned long result; 1481da177e4SLinus Torvalds 1491da177e4SLinus Torvalds result = -EINVAL; 1501da177e4SLinus Torvalds if (offset & ~PAGE_MASK) 1511da177e4SLinus Torvalds goto out; 1521da177e4SLinus Torvalds 1531da177e4SLinus Torvalds result = do_mmap2(addr, len, prot, flags, fd, offset >> PAGE_SHIFT); 1541da177e4SLinus Torvalds 1551da177e4SLinus Torvalds out: 1561da177e4SLinus Torvalds return result; 1571da177e4SLinus Torvalds } 1581da177e4SLinus Torvalds 1591da177e4SLinus Torvalds asmlinkage unsigned long 1601da177e4SLinus Torvalds sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot, 1611da177e4SLinus Torvalds unsigned long flags, unsigned long fd, unsigned long pgoff) 1621da177e4SLinus Torvalds { 1631da177e4SLinus Torvalds return do_mmap2(addr, len, prot, flags, fd, pgoff); 1641da177e4SLinus Torvalds } 1651da177e4SLinus Torvalds 1661da177e4SLinus Torvalds save_static_function(sys_fork); 1671da177e4SLinus Torvalds __attribute_used__ noinline static int 1681da177e4SLinus Torvalds _sys_fork(nabi_no_regargs struct pt_regs regs) 1691da177e4SLinus Torvalds { 1701da177e4SLinus Torvalds return do_fork(SIGCHLD, regs.regs[29], ®s, 0, NULL, NULL); 1711da177e4SLinus Torvalds } 1721da177e4SLinus Torvalds 1731da177e4SLinus Torvalds save_static_function(sys_clone); 1741da177e4SLinus Torvalds __attribute_used__ noinline static int 1751da177e4SLinus Torvalds _sys_clone(nabi_no_regargs struct pt_regs regs) 1761da177e4SLinus Torvalds { 1771da177e4SLinus Torvalds unsigned long clone_flags; 1781da177e4SLinus Torvalds unsigned long newsp; 1791da177e4SLinus Torvalds int *parent_tidptr, *child_tidptr; 1801da177e4SLinus Torvalds 1811da177e4SLinus Torvalds clone_flags = regs.regs[4]; 1821da177e4SLinus Torvalds newsp = regs.regs[5]; 1831da177e4SLinus Torvalds if (!newsp) 1841da177e4SLinus Torvalds newsp = regs.regs[29]; 1851da177e4SLinus Torvalds parent_tidptr = (int *) regs.regs[6]; 1861da177e4SLinus Torvalds child_tidptr = (int *) regs.regs[7]; 1871da177e4SLinus Torvalds return do_fork(clone_flags, newsp, ®s, 0, 1881da177e4SLinus Torvalds parent_tidptr, child_tidptr); 1891da177e4SLinus Torvalds } 1901da177e4SLinus Torvalds 1911da177e4SLinus Torvalds /* 1921da177e4SLinus Torvalds * sys_execve() executes a new program. 1931da177e4SLinus Torvalds */ 1941da177e4SLinus Torvalds asmlinkage int sys_execve(nabi_no_regargs struct pt_regs regs) 1951da177e4SLinus Torvalds { 1961da177e4SLinus Torvalds int error; 1971da177e4SLinus Torvalds char * filename; 1981da177e4SLinus Torvalds 1991da177e4SLinus Torvalds filename = getname((char *) (long)regs.regs[4]); 2001da177e4SLinus Torvalds error = PTR_ERR(filename); 2011da177e4SLinus Torvalds if (IS_ERR(filename)) 2021da177e4SLinus Torvalds goto out; 2031da177e4SLinus Torvalds error = do_execve(filename, (char **) (long)regs.regs[5], 2041da177e4SLinus Torvalds (char **) (long)regs.regs[6], ®s); 2051da177e4SLinus Torvalds putname(filename); 2061da177e4SLinus Torvalds 2071da177e4SLinus Torvalds out: 2081da177e4SLinus Torvalds return error; 2091da177e4SLinus Torvalds } 2101da177e4SLinus Torvalds 2111da177e4SLinus Torvalds /* 2121da177e4SLinus Torvalds * Compacrapability ... 2131da177e4SLinus Torvalds */ 2141da177e4SLinus Torvalds asmlinkage int sys_uname(struct old_utsname * name) 2151da177e4SLinus Torvalds { 2161da177e4SLinus Torvalds if (name && !copy_to_user(name, &system_utsname, sizeof (*name))) 2171da177e4SLinus Torvalds return 0; 2181da177e4SLinus Torvalds return -EFAULT; 2191da177e4SLinus Torvalds } 2201da177e4SLinus Torvalds 2211da177e4SLinus Torvalds /* 2221da177e4SLinus Torvalds * Compacrapability ... 2231da177e4SLinus Torvalds */ 2241da177e4SLinus Torvalds asmlinkage int sys_olduname(struct oldold_utsname * name) 2251da177e4SLinus Torvalds { 2261da177e4SLinus Torvalds int error; 2271da177e4SLinus Torvalds 2281da177e4SLinus Torvalds if (!name) 2291da177e4SLinus Torvalds return -EFAULT; 2301da177e4SLinus Torvalds if (!access_ok(VERIFY_WRITE,name,sizeof(struct oldold_utsname))) 2311da177e4SLinus Torvalds return -EFAULT; 2321da177e4SLinus Torvalds 2331da177e4SLinus Torvalds error = __copy_to_user(&name->sysname,&system_utsname.sysname,__OLD_UTS_LEN); 2341da177e4SLinus Torvalds error -= __put_user(0,name->sysname+__OLD_UTS_LEN); 2351da177e4SLinus Torvalds error -= __copy_to_user(&name->nodename,&system_utsname.nodename,__OLD_UTS_LEN); 2361da177e4SLinus Torvalds error -= __put_user(0,name->nodename+__OLD_UTS_LEN); 2371da177e4SLinus Torvalds error -= __copy_to_user(&name->release,&system_utsname.release,__OLD_UTS_LEN); 2381da177e4SLinus Torvalds error -= __put_user(0,name->release+__OLD_UTS_LEN); 2391da177e4SLinus Torvalds error -= __copy_to_user(&name->version,&system_utsname.version,__OLD_UTS_LEN); 2401da177e4SLinus Torvalds error -= __put_user(0,name->version+__OLD_UTS_LEN); 2411da177e4SLinus Torvalds error -= __copy_to_user(&name->machine,&system_utsname.machine,__OLD_UTS_LEN); 2421da177e4SLinus Torvalds error = __put_user(0,name->machine+__OLD_UTS_LEN); 2431da177e4SLinus Torvalds error = error ? -EFAULT : 0; 2441da177e4SLinus Torvalds 2451da177e4SLinus Torvalds return error; 2461da177e4SLinus Torvalds } 2471da177e4SLinus Torvalds 2481da177e4SLinus Torvalds asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3) 2491da177e4SLinus Torvalds { 2501da177e4SLinus Torvalds int tmp, len; 2511da177e4SLinus Torvalds char *name; 2521da177e4SLinus Torvalds 2531da177e4SLinus Torvalds switch(cmd) { 2541da177e4SLinus Torvalds case SETNAME: { 2551da177e4SLinus Torvalds char nodename[__NEW_UTS_LEN + 1]; 2561da177e4SLinus Torvalds 2571da177e4SLinus Torvalds if (!capable(CAP_SYS_ADMIN)) 2581da177e4SLinus Torvalds return -EPERM; 2591da177e4SLinus Torvalds 2601da177e4SLinus Torvalds name = (char *) arg1; 2611da177e4SLinus Torvalds 2621da177e4SLinus Torvalds len = strncpy_from_user(nodename, name, __NEW_UTS_LEN); 2631da177e4SLinus Torvalds if (len < 0) 2641da177e4SLinus Torvalds return -EFAULT; 2651da177e4SLinus Torvalds 2661da177e4SLinus Torvalds down_write(&uts_sem); 2671da177e4SLinus Torvalds strncpy(system_utsname.nodename, nodename, len); 2681da177e4SLinus Torvalds nodename[__NEW_UTS_LEN] = '\0'; 2691da177e4SLinus Torvalds strlcpy(system_utsname.nodename, nodename, 2701da177e4SLinus Torvalds sizeof(system_utsname.nodename)); 2711da177e4SLinus Torvalds up_write(&uts_sem); 2721da177e4SLinus Torvalds return 0; 2731da177e4SLinus Torvalds } 2741da177e4SLinus Torvalds 2751da177e4SLinus Torvalds case MIPS_ATOMIC_SET: 2761da177e4SLinus Torvalds printk(KERN_CRIT "How did I get here?\n"); 2771da177e4SLinus Torvalds return -EINVAL; 2781da177e4SLinus Torvalds 2791da177e4SLinus Torvalds case MIPS_FIXADE: 2801da177e4SLinus Torvalds tmp = current->thread.mflags & ~3; 2811da177e4SLinus Torvalds current->thread.mflags = tmp | (arg1 & 3); 2821da177e4SLinus Torvalds return 0; 2831da177e4SLinus Torvalds 2841da177e4SLinus Torvalds case FLUSH_CACHE: 2851da177e4SLinus Torvalds __flush_cache_all(); 2861da177e4SLinus Torvalds return 0; 2871da177e4SLinus Torvalds 2881da177e4SLinus Torvalds case MIPS_RDNVRAM: 2891da177e4SLinus Torvalds return -EIO; 2901da177e4SLinus Torvalds } 2911da177e4SLinus Torvalds 2921da177e4SLinus Torvalds return -EINVAL; 2931da177e4SLinus Torvalds } 2941da177e4SLinus Torvalds 2951da177e4SLinus Torvalds /* 2961da177e4SLinus Torvalds * sys_ipc() is the de-multiplexer for the SysV IPC calls.. 2971da177e4SLinus Torvalds * 2981da177e4SLinus Torvalds * This is really horribly ugly. 2991da177e4SLinus Torvalds */ 3001da177e4SLinus Torvalds asmlinkage int sys_ipc (uint call, int first, int second, 3011da177e4SLinus Torvalds unsigned long third, void *ptr, long fifth) 3021da177e4SLinus Torvalds { 3031da177e4SLinus Torvalds int version, ret; 3041da177e4SLinus Torvalds 3051da177e4SLinus Torvalds version = call >> 16; /* hack for backward compatibility */ 3061da177e4SLinus Torvalds call &= 0xffff; 3071da177e4SLinus Torvalds 3081da177e4SLinus Torvalds switch (call) { 3091da177e4SLinus Torvalds case SEMOP: 3101da177e4SLinus Torvalds return sys_semtimedop (first, (struct sembuf *)ptr, second, 3111da177e4SLinus Torvalds NULL); 3121da177e4SLinus Torvalds case SEMTIMEDOP: 3131da177e4SLinus Torvalds return sys_semtimedop (first, (struct sembuf *)ptr, second, 3141da177e4SLinus Torvalds (const struct timespec __user *)fifth); 3151da177e4SLinus Torvalds case SEMGET: 3161da177e4SLinus Torvalds return sys_semget (first, second, third); 3171da177e4SLinus Torvalds case SEMCTL: { 3181da177e4SLinus Torvalds union semun fourth; 3191da177e4SLinus Torvalds if (!ptr) 3201da177e4SLinus Torvalds return -EINVAL; 3211da177e4SLinus Torvalds if (get_user(fourth.__pad, (void **) ptr)) 3221da177e4SLinus Torvalds return -EFAULT; 3231da177e4SLinus Torvalds return sys_semctl (first, second, third, fourth); 3241da177e4SLinus Torvalds } 3251da177e4SLinus Torvalds 3261da177e4SLinus Torvalds case MSGSND: 3271da177e4SLinus Torvalds return sys_msgsnd (first, (struct msgbuf *) ptr, 3281da177e4SLinus Torvalds second, third); 3291da177e4SLinus Torvalds case MSGRCV: 3301da177e4SLinus Torvalds switch (version) { 3311da177e4SLinus Torvalds case 0: { 3321da177e4SLinus Torvalds struct ipc_kludge tmp; 3331da177e4SLinus Torvalds if (!ptr) 3341da177e4SLinus Torvalds return -EINVAL; 3351da177e4SLinus Torvalds 3361da177e4SLinus Torvalds if (copy_from_user(&tmp, 3371da177e4SLinus Torvalds (struct ipc_kludge *) ptr, 3381da177e4SLinus Torvalds sizeof (tmp))) 3391da177e4SLinus Torvalds return -EFAULT; 3401da177e4SLinus Torvalds return sys_msgrcv (first, tmp.msgp, second, 3411da177e4SLinus Torvalds tmp.msgtyp, third); 3421da177e4SLinus Torvalds } 3431da177e4SLinus Torvalds default: 3441da177e4SLinus Torvalds return sys_msgrcv (first, 3451da177e4SLinus Torvalds (struct msgbuf *) ptr, 3461da177e4SLinus Torvalds second, fifth, third); 3471da177e4SLinus Torvalds } 3481da177e4SLinus Torvalds case MSGGET: 3491da177e4SLinus Torvalds return sys_msgget ((key_t) first, second); 3501da177e4SLinus Torvalds case MSGCTL: 3511da177e4SLinus Torvalds return sys_msgctl (first, second, (struct msqid_ds *) ptr); 3521da177e4SLinus Torvalds 3531da177e4SLinus Torvalds case SHMAT: 3541da177e4SLinus Torvalds switch (version) { 3551da177e4SLinus Torvalds default: { 3561da177e4SLinus Torvalds ulong raddr; 3571da177e4SLinus Torvalds ret = do_shmat (first, (char *) ptr, second, &raddr); 3581da177e4SLinus Torvalds if (ret) 3591da177e4SLinus Torvalds return ret; 3601da177e4SLinus Torvalds return put_user (raddr, (ulong *) third); 3611da177e4SLinus Torvalds } 3621da177e4SLinus Torvalds case 1: /* iBCS2 emulator entry point */ 3631da177e4SLinus Torvalds if (!segment_eq(get_fs(), get_ds())) 3641da177e4SLinus Torvalds return -EINVAL; 3651da177e4SLinus Torvalds return do_shmat (first, (char *) ptr, second, (ulong *) third); 3661da177e4SLinus Torvalds } 3671da177e4SLinus Torvalds case SHMDT: 3681da177e4SLinus Torvalds return sys_shmdt ((char *)ptr); 3691da177e4SLinus Torvalds case SHMGET: 3701da177e4SLinus Torvalds return sys_shmget (first, second, third); 3711da177e4SLinus Torvalds case SHMCTL: 3721da177e4SLinus Torvalds return sys_shmctl (first, second, 3731da177e4SLinus Torvalds (struct shmid_ds *) ptr); 3741da177e4SLinus Torvalds default: 3751da177e4SLinus Torvalds return -ENOSYS; 3761da177e4SLinus Torvalds } 3771da177e4SLinus Torvalds } 3781da177e4SLinus Torvalds 3791da177e4SLinus Torvalds /* 3801da177e4SLinus Torvalds * No implemented yet ... 3811da177e4SLinus Torvalds */ 3821da177e4SLinus Torvalds asmlinkage int sys_cachectl(char *addr, int nbytes, int op) 3831da177e4SLinus Torvalds { 3841da177e4SLinus Torvalds return -ENOSYS; 3851da177e4SLinus Torvalds } 3861da177e4SLinus Torvalds 3871da177e4SLinus Torvalds /* 3881da177e4SLinus Torvalds * If we ever come here the user sp is bad. Zap the process right away. 3891da177e4SLinus Torvalds * Due to the bad stack signaling wouldn't work. 3901da177e4SLinus Torvalds */ 3911da177e4SLinus Torvalds asmlinkage void bad_stack(void) 3921da177e4SLinus Torvalds { 3931da177e4SLinus Torvalds do_exit(SIGSEGV); 3941da177e4SLinus Torvalds } 395