Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | /* * MIPS specific syscalls * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. * * Copyright (C) 1995, 1996, 1997 by Ralf Baechle * * $Id: sysmips.c,v 1.3 1997/07/18 06:26:02 ralf Exp $ */ #include <linux/errno.h> #include <linux/linkage.h> #include <linux/mm.h> #include <linux/smp.h> #include <linux/smp_lock.h> #include <linux/sched.h> #include <linux/string.h> #include <linux/utsname.h> #include <asm/cachectl.h> #include <asm/pgtable.h> #include <asm/sysmips.h> #include <asm/uaccess.h> /* * How long a hostname can we get from user space? * -EFAULT if invalid area or too long * 0 if ok * >0 EFAULT after xx bytes */ static inline int get_max_hostname(unsigned long address) { struct vm_area_struct * vma; vma = find_vma(current->mm, address); if (!vma || vma->vm_start > address || !(vma->vm_flags & VM_READ)) return -EFAULT; address = vma->vm_end - address; if (address > PAGE_SIZE) return 0; if (vma->vm_next && vma->vm_next->vm_start == vma->vm_end && (vma->vm_next->vm_flags & VM_READ)) return 0; return address; } asmlinkage int sys_sysmips(int cmd, int arg1, int arg2, int arg3) { int *p; char *name; int flags, tmp, len, retval; lock_kernel(); switch(cmd) { case SETNAME: retval = -EPERM; if (!suser()) goto out; name = (char *) arg1; len = strlen_user(name); retval = len; if (len < 0) goto out; retval = -EINVAL; if (len == 0 || len > __NEW_UTS_LEN) goto out; copy_from_user(system_utsname.nodename, name, len); system_utsname.nodename[len] = '\0'; retval = 0; goto out; case MIPS_ATOMIC_SET: /* This is broken in case of page faults and SMP ... Risc/OS fauls after maximum 20 tries with EAGAIN. */ p = (int *) arg1; retval = verify_area(VERIFY_WRITE, p, sizeof(*p)); if (retval) goto out; save_and_cli(flags); retval = *p; *p = arg2; restore_flags(flags); goto out; case MIPS_FIXADE: tmp = current->tss.mflags & ~3; current->tss.mflags = tmp | (arg1 & 3); retval = 0; goto out; case FLUSH_CACHE: flush_cache_all(); retval = 0; goto out; case MIPS_RDNVRAM: retval = -EIO; goto out; default: retval = -EINVAL; goto out; } out: unlock_kernel(); return retval; } /* * No implemented yet ... */ asmlinkage int sys_cachectl(char *addr, int nbytes, int op) { return -ENOSYS; } |