sysmips.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * MIPS specific syscalls
  3.  *
  4.  * This file is subject to the terms and conditions of the GNU General Public
  5.  * License.  See the file "COPYING" in the main directory of this archive
  6.  * for more details.
  7.  *
  8.  * Copyright (C) 1995, 1996, 1997, 2000 by Ralf Baechle
  9.  */
  10. #include <linux/config.h>
  11. #include <linux/errno.h>
  12. #include <linux/linkage.h>
  13. #include <linux/mm.h>
  14. #include <linux/smp.h>
  15. #include <linux/smp_lock.h>
  16. #include <linux/sched.h>
  17. #include <linux/string.h>
  18. #include <linux/utsname.h>
  19. #include <asm/cachectl.h>
  20. #include <asm/pgalloc.h>
  21. #include <asm/sysmips.h>
  22. #include <asm/uaccess.h>
  23. extern asmlinkage void syscall_trace(void);
  24. /*
  25.  * How long a hostname can we get from user space?
  26.  *  -EFAULT if invalid area or too long
  27.  *  0 if ok
  28.  *  >0 EFAULT after xx bytes
  29.  */
  30. static inline int
  31. get_max_hostname(unsigned long address)
  32. {
  33. struct vm_area_struct * vma;
  34. vma = find_vma(current->mm, address);
  35. if (!vma || vma->vm_start > address || !(vma->vm_flags & VM_READ))
  36. return -EFAULT;
  37. address = vma->vm_end - address;
  38. if (address > PAGE_SIZE)
  39. return 0;
  40. if (vma->vm_next && vma->vm_next->vm_start == vma->vm_end &&
  41.    (vma->vm_next->vm_flags & VM_READ))
  42. return 0;
  43. return address;
  44. }
  45. asmlinkage int
  46. sys_sysmips(int cmd, int arg1, int arg2, int arg3)
  47. {
  48. int *p;
  49. char *name;
  50. int tmp, len, retval, errno;
  51. switch(cmd) {
  52. case SETNAME: {
  53. char nodename[__NEW_UTS_LEN + 1];
  54. if (!capable(CAP_SYS_ADMIN))
  55. return -EPERM;
  56. name = (char *) arg1;
  57. len = strncpy_from_user(nodename, name, sizeof(nodename));
  58. if (len < 0) 
  59. return -EFAULT;
  60. down_write(&uts_sem);
  61. strncpy(system_utsname.nodename, name, len);
  62. up_write(&uts_sem);
  63. system_utsname.nodename[len] = ''; 
  64. return 0;
  65. }
  66. case MIPS_ATOMIC_SET: {
  67. #ifdef CONFIG_CPU_HAS_LLSC
  68. unsigned int tmp;
  69. p = (int *) arg1;
  70. errno = verify_area(VERIFY_WRITE, p, sizeof(*p));
  71. if (errno)
  72. return errno;
  73. errno = 0;
  74. __asm__(".settpushttt# sysmips(MIPS_ATOMIC, ...)nt"
  75. ".settmips2nt"
  76. ".settnoatnt"
  77. "1:tllt%0, %4nt"
  78. "movet$1, %3nt"
  79. "2:tsct$1, %1nt"
  80. "beqzt$1, 1bnt"
  81. ".settpopnt"
  82. ".sectiont.fixup,"ax"n"
  83. "3:tlit%2, 1ttt# errornt"
  84. ".previousnt"
  85. ".sectiont__ex_table,"a"nt"
  86. ".wordt1b, 3bnt"
  87. ".wordt2b, 3bnt"
  88. ".previousnt"
  89. : "=&r" (tmp), "=o" (* (u32 *) p), "=r" (errno)
  90. : "r" (arg2), "o" (* (u32 *) p), "2" (errno)
  91. : "$1");
  92. if (errno)
  93. return -EFAULT;
  94. /* We're skipping error handling etc.  */
  95. if (current->ptrace & PT_TRACESYS)
  96. syscall_trace();
  97. ((struct pt_regs *)&cmd)->regs[2] = tmp;
  98. ((struct pt_regs *)&cmd)->regs[7] = 0;
  99. __asm__ __volatile__(
  100. "movet$29, %0nt"
  101. "jto32_ret_from_sys_call"
  102. : /* No outputs */
  103. : "r" (&cmd));
  104. /* Unreached */
  105. #else
  106. printk("sys_sysmips(MIPS_ATOMIC_SET, ...) not ready for !CONFIG_CPU_HAS_LLSCn");
  107. #endif
  108. }
  109. case MIPS_FIXADE:
  110. tmp = current->thread.mflags & ~3;
  111. current->thread.mflags = tmp | (arg1 & 3);
  112. retval = 0;
  113. goto out;
  114. case FLUSH_CACHE:
  115. flush_cache_all();
  116. retval = 0;
  117. goto out;
  118. case MIPS_RDNVRAM:
  119. retval = -EIO;
  120. goto out;
  121. default:
  122. retval = -EINVAL;
  123. goto out;
  124. }
  125. out:
  126. return retval;
  127. }
  128. /*
  129.  * No implemented yet ...
  130.  */
  131. asmlinkage int
  132. sys_cachectl(char *addr, int nbytes, int op)
  133. {
  134. return -ENOSYS;
  135. }
  136. asmlinkage int sys_pause(void)
  137. {
  138. current->state = TASK_INTERRUPTIBLE;
  139. schedule();
  140. return -ERESTARTNOHAND;
  141. }