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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/include/asm-arm/proc-armv/uaccess.h
  3.  *
  4.  * This program is free software; you can redistribute it and/or modify
  5.  * it under the terms of the GNU General Public License version 2 as
  6.  * published by the Free Software Foundation.
  7.  */
  8. #include <asm/arch/memory.h>
  9. #include <asm/proc/domain.h>
  10. /*
  11.  * Note that this is actually 0x1,0000,0000
  12.  */
  13. #define KERNEL_DS 0x00000000
  14. #define USER_DS PAGE_OFFSET
  15. static inline void set_fs (mm_segment_t fs)
  16. {
  17. current->addr_limit = fs;
  18. modify_domain(DOMAIN_KERNEL, fs ? DOMAIN_CLIENT : DOMAIN_MANAGER);
  19. }
  20. /* We use 33-bit arithmetic here... */
  21. #define __range_ok(addr,size) ({ 
  22. unsigned long flag, sum; 
  23. __asm__("adds %1, %2, %3; sbcccs %1, %1, %0; movcc %0, #0" 
  24. : "=&r" (flag), "=&r" (sum) 
  25. : "r" (addr), "Ir" (size), "0" (current->addr_limit) 
  26. : "cc"); 
  27. flag; })
  28. #define __addr_ok(addr) ({ 
  29. unsigned long flag; 
  30. __asm__("cmp %2, %0; movlo %0, #0" 
  31. : "=&r" (flag) 
  32. : "0" (current->addr_limit), "r" (addr) 
  33. : "cc"); 
  34. (flag == 0); })
  35. #define __put_user_asm_byte(x,addr,err)
  36. __asm__ __volatile__(
  37. "1: strbt %1,[%2],#0n"
  38. "2:n"
  39. " .section .fixup,"ax"n"
  40. " .align 2n"
  41. "3: mov %0, %3n"
  42. " b 2bn"
  43. " .previousn"
  44. " .section __ex_table,"a"n"
  45. " .align 3n"
  46. " .long 1b, 3bn"
  47. " .previous"
  48. : "=r" (err)
  49. : "r" (x), "r" (addr), "i" (-EFAULT), "0" (err))
  50. #define __put_user_asm_half(x,addr,err)
  51. ({
  52. unsigned long __temp = (unsigned long)(x);
  53. unsigned long __ptr  = (unsigned long)(addr);
  54. __put_user_asm_byte(__temp, __ptr, err);
  55. __put_user_asm_byte(__temp >> 8, __ptr + 1, err);
  56. })
  57. #define __put_user_asm_word(x,addr,err)
  58. __asm__ __volatile__(
  59. "1: strt %1,[%2],#0n"
  60. "2:n"
  61. " .section .fixup,"ax"n"
  62. " .align 2n"
  63. "3: mov %0, %3n"
  64. " b 2bn"
  65. " .previousn"
  66. " .section __ex_table,"a"n"
  67. " .align 3n"
  68. " .long 1b, 3bn"
  69. " .previous"
  70. : "=r" (err)
  71. : "r" (x), "r" (addr), "i" (-EFAULT), "0" (err))
  72. #define __get_user_asm_byte(x,addr,err)
  73. __asm__ __volatile__(
  74. "1: ldrbt %1,[%2],#0n"
  75. "2:n"
  76. " .section .fixup,"ax"n"
  77. " .align 2n"
  78. "3: mov %0, %3n"
  79. " mov %1, #0n"
  80. " b 2bn"
  81. " .previousn"
  82. " .section __ex_table,"a"n"
  83. " .align 3n"
  84. " .long 1b, 3bn"
  85. " .previous"
  86. : "=r" (err), "=&r" (x)
  87. : "r" (addr), "i" (-EFAULT), "0" (err))
  88. #define __get_user_asm_half(x,addr,err)
  89. ({
  90. unsigned long __b1, __b2, __ptr = (unsigned long)addr;
  91. __get_user_asm_byte(__b1, __ptr, err);
  92. __get_user_asm_byte(__b2, __ptr + 1, err);
  93. (x) = __b1 | (__b2 << 8);
  94. })
  95. #define __get_user_asm_word(x,addr,err)
  96. __asm__ __volatile__(
  97. "1: ldrt %1,[%2],#0n"
  98. "2:n"
  99. " .section .fixup,"ax"n"
  100. " .align 2n"
  101. "3: mov %0, %3n"
  102. " mov %1, #0n"
  103. " b 2bn"
  104. " .previousn"
  105. " .section __ex_table,"a"n"
  106. " .align 3n"
  107. " .long 1b, 3bn"
  108. " .previous"
  109. : "=r" (err), "=&r" (x)
  110. : "r" (addr), "i" (-EFAULT), "0" (err))
  111. extern unsigned long __arch_copy_from_user(void *to, const void *from, unsigned long n);
  112. #define __do_copy_from_user(to,from,n)
  113. (n) = __arch_copy_from_user(to,from,n)
  114. extern unsigned long __arch_copy_to_user(void *to, const void *from, unsigned long n);
  115. #define __do_copy_to_user(to,from,n)
  116. (n) = __arch_copy_to_user(to,from,n)
  117. extern unsigned long __arch_clear_user(void *addr, unsigned long n);
  118. #define __do_clear_user(addr,sz)
  119. (sz) = __arch_clear_user(addr,sz)
  120. extern unsigned long __arch_strncpy_from_user(char *to, const char *from, unsigned long count);
  121. #define __do_strncpy_from_user(dst,src,count,res)
  122. (res) = __arch_strncpy_from_user(dst,src,count)
  123. extern unsigned long __arch_strnlen_user(const char *s, long n);
  124. #define __do_strnlen_user(s,n,res)
  125. (res) = __arch_strnlen_user(s,n)