sysmips.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:2k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * This file is subject to the terms and conditions of the GNU General Public
  3.  * License.  See the file "COPYING" in the main directory of this archive
  4.  * for more details.
  5.  *
  6.  * Copyright (C) 1995, 1996, 1997, 2000, 2001 by Ralf Baechle
  7.  * Copyright (C) 2001 MIPS Technologies, Inc.
  8.  */
  9. #include <linux/errno.h>
  10. #include <linux/linkage.h>
  11. #include <linux/mm.h>
  12. #include <linux/smp.h>
  13. #include <linux/smp_lock.h>
  14. #include <linux/sched.h>
  15. #include <linux/string.h>
  16. #include <linux/utsname.h>
  17. #include <asm/cachectl.h>
  18. #include <asm/pgalloc.h>
  19. #include <asm/sysmips.h>
  20. #include <asm/uaccess.h>
  21. extern asmlinkage void syscall_trace(void);
  22. /*
  23.  * How long a hostname can we get from user space?
  24.  *  -EFAULT if invalid area or too long
  25.  *  0 if ok
  26.  *  >0 EFAULT after xx bytes
  27.  */
  28. static inline int
  29. get_max_hostname(unsigned long address)
  30. {
  31. struct vm_area_struct * vma;
  32. vma = find_vma(current->mm, address);
  33. if (!vma || vma->vm_start > address || !(vma->vm_flags & VM_READ))
  34. return -EFAULT;
  35. address = vma->vm_end - address;
  36. if (address > PAGE_SIZE)
  37. return 0;
  38. if (vma->vm_next && vma->vm_next->vm_start == vma->vm_end &&
  39.    (vma->vm_next->vm_flags & VM_READ))
  40. return 0;
  41. return address;
  42. }
  43. asmlinkage int
  44. _sys_sysmips(int cmd, int arg1, int arg2, int arg3)
  45. {
  46. char *name;
  47. int tmp, len, retval;
  48. switch(cmd) {
  49. case SETNAME: {
  50. char nodename[__NEW_UTS_LEN + 1];
  51. if (!capable(CAP_SYS_ADMIN))
  52. return -EPERM;
  53. name = (char *) arg1;
  54. len = strncpy_from_user(nodename, name, sizeof(nodename));
  55. if (len < 0)
  56. return -EFAULT;
  57. down_write(&uts_sem);
  58. strncpy(system_utsname.nodename, name, len);
  59. system_utsname.nodename[len] = '';
  60. up_write(&uts_sem);
  61. return 0;
  62. }
  63. case MIPS_ATOMIC_SET:
  64. printk(KERN_CRIT "How did I get here?n");
  65. retval = -EINVAL;
  66. goto out;
  67. case MIPS_FIXADE:
  68. tmp = current->thread.mflags & ~3;
  69. current->thread.mflags = tmp | (arg1 & 3);
  70. retval = 0;
  71. goto out;
  72. case FLUSH_CACHE:
  73. __flush_cache_all();
  74. retval = 0;
  75. goto out;
  76. case MIPS_RDNVRAM:
  77. retval = -EIO;
  78. goto out;
  79. default:
  80. retval = -EINVAL;
  81. goto out;
  82. }
  83. out:
  84. return retval;
  85. }
  86. /*
  87.  * No implemented yet ...
  88.  */
  89. asmlinkage int
  90. sys_cachectl(char *addr, int nbytes, int op)
  91. {
  92. return -ENOSYS;
  93. }
  94. asmlinkage int sys_pause(void)
  95. {
  96. current->state = TASK_INTERRUPTIBLE;
  97. schedule();
  98. return -ERESTARTNOHAND;
  99. }