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