patch-1.3.48 linux/arch/mips/kernel/sysmips.c
Next file: linux/arch/mips/kernel/time.c
Previous file: linux/arch/mips/kernel/syscalls.h
Back to the patch index
Back to the overall index
- Lines: 106
- Date:
Wed Dec 13 12:39:44 1995
- Orig file:
v1.3.47/linux/arch/mips/kernel/sysmips.c
- Orig date:
Thu Jan 1 02:00:00 1970
diff -u --recursive --new-file v1.3.47/linux/arch/mips/kernel/sysmips.c linux/arch/mips/kernel/sysmips.c
@@ -0,0 +1,105 @@
+/*
+ * 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 by Ralf Baechle
+ */
+#include <linux/errno.h>
+#include <linux/linkage.h>
+#include <linux/mm.h>
+#include <linux/sched.h>
+#include <linux/string.h>
+#include <linux/utsname.h>
+
+#include <asm/cachectl.h>
+#include <asm/segment.h>
+#include <asm/sysmips.h>
+
+static inline size_t
+strnlen_user(const char *s, size_t count)
+{
+ return strnlen(s, count);
+}
+
+/*
+ * 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, 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, len, retval = -EINVAL;
+
+ switch(cmd)
+ {
+ case SETNAME:
+ if (!suser())
+ return -EPERM;
+ name = (char *) arg1;
+ len = get_max_hostname((unsigned long)name);
+ if (retval < 0)
+ return len;
+ len = strnlen_user(name, retval);
+ if (len == 0 || len > __NEW_UTS_LEN)
+ return -EINVAL;
+ memcpy_fromfs(system_utsname.nodename, name, len);
+ system_utsname.nodename[len] = '\0';
+ return 0;
+ case MIPS_ATOMIC_SET:
+ p = (int *) arg1;
+ retval = verify_area(VERIFY_WRITE, p, sizeof(*p));
+ if(retval)
+ return -EINVAL;
+ save_flags(flags);
+ cli();
+ retval = *p;
+ *p = arg2;
+ restore_flags(flags);
+ return retval;
+ case MIPS_FIXADE:
+ if (arg1)
+ current->tss.mflags |= MF_FIXADE;
+ else
+ current->tss.mflags |= MF_FIXADE;
+ retval = 0;
+ break;
+ case FLUSH_CACHE:
+ sys_cacheflush(0, ~0, BCACHE);
+ break;
+ }
+
+ return retval;
+}
+
+/*
+ * No implemented yet ...
+ */
+asmlinkage int
+sys_cachectl(char *addr, int nbytes, int op)
+{
+ return -ENOSYS;
+}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov
with Sam's (original) version of this