uaccess-armo.S
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:5k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/arch/arm/lib/uaccess-armo.S
  3.  *
  4.  *  Copyright (C) 1998 Russell King
  5.  *
  6.  *  Note!  Some code fragments found in here have a special calling
  7.  *  convention - they are not APCS compliant!
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License version 2 as
  11.  * published by the Free Software Foundation.
  12.  */
  13. #include <linux/linkage.h>
  14. #include <asm/assembler.h>
  15. .text
  16. .globl SYMBOL_NAME(uaccess_user)
  17. SYMBOL_NAME(uaccess_user):
  18. .word uaccess_user_put_byte
  19. .word uaccess_user_get_byte
  20. .word uaccess_user_put_half
  21. .word uaccess_user_get_half
  22. .word uaccess_user_put_word
  23. .word uaccess_user_get_word
  24. .word __arch_copy_from_user
  25. .word __arch_copy_to_user
  26. .word __arch_clear_user
  27. .word __arch_strncpy_from_user
  28. .word __arch_strnlen_user
  29. @ In : r0 = x, r1 = addr, r2 = error
  30. @ Out: r2 = error
  31. uaccess_user_put_byte:
  32. stmfd sp!, {lr}
  33. USER( strbt r0, [r1])
  34. ldmfd sp!, {pc}^
  35. @ In : r0 = x, r1 = addr, r2 = error
  36. @ Out: r2 = error
  37. uaccess_user_put_half:
  38. stmfd sp!, {lr}
  39. USER( strbt r0, [r1], #1)
  40. mov r0, r0, lsr #8
  41. USER( strbt r0, [r1])
  42. ldmfd sp!, {pc}^
  43. @ In : r0 = x, r1 = addr, r2 = error
  44. @ Out: r2 = error
  45. uaccess_user_put_word:
  46. stmfd sp!, {lr}
  47. USER( strt r0, [r1])
  48. ldmfd sp!, {pc}^
  49. 9001: mov r2, #-EFAULT
  50. ldmfd sp!, {pc}^
  51. @ In : r0 = addr, r1 = error
  52. @ Out: r0 = x, r1 = error
  53. uaccess_user_get_byte:
  54. stmfd sp!, {lr}
  55. USER( ldrbt r0, [r0])
  56. ldmfd sp!, {pc}^
  57. @ In : r0 = addr, r1 = error
  58. @ Out: r0 = x, r1 = error
  59. uaccess_user_get_half:
  60. stmfd sp!, {lr}
  61. USER( ldrt r0, [r0])
  62. mov r0, r0, lsl #16
  63. mov r0, r0, lsr #16
  64. ldmfd sp!, {pc}^
  65. @ In : r0 = addr, r1 = error
  66. @ Out: r0 = x, r1 = error
  67. uaccess_user_get_word:
  68. stmfd sp!, {lr}
  69. USER( ldrt r0, [r0])
  70. ldmfd sp!, {pc}^
  71. 9001: mov r1, #-EFAULT
  72. ldmfd sp!, {pc}^
  73. .globl SYMBOL_NAME(uaccess_kernel)
  74. SYMBOL_NAME(uaccess_kernel):
  75. .word uaccess_kernel_put_byte
  76. .word uaccess_kernel_get_byte
  77. .word uaccess_kernel_put_half
  78. .word uaccess_kernel_get_half
  79. .word uaccess_kernel_put_word
  80. .word uaccess_kernel_get_word
  81. .word uaccess_kernel_copy
  82. .word uaccess_kernel_copy
  83. .word uaccess_kernel_clear
  84. .word uaccess_kernel_strncpy_from
  85. .word uaccess_kernel_strnlen
  86. @ In : r0 = x, r1 = addr, r2 = error
  87. @ Out: r2 = error
  88. uaccess_kernel_put_byte:
  89. stmfd sp!, {lr}
  90. strb r0, [r1]
  91. ldmfd sp!, {pc}^
  92. @ In : r0 = x, r1 = addr, r2 = error
  93. @ Out: r2 = error
  94. uaccess_kernel_put_half:
  95. stmfd sp!, {lr}
  96. strb r0, [r1]
  97. mov r0, r0, lsr #8
  98. strb r0, [r1, #1]
  99. ldmfd sp!, {pc}^
  100. @ In : r0 = x, r1 = addr, r2 = error
  101. @ Out: r2 = error
  102. uaccess_kernel_put_word:
  103. stmfd sp!, {lr}
  104. str r0, [r1]
  105. ldmfd sp!, {pc}^
  106. @ In : r0 = addr, r1 = error
  107. @ Out: r0 = x, r1 = error
  108. uaccess_kernel_get_byte:
  109. stmfd sp!, {lr}
  110. ldrb r0, [r0]
  111. ldmfd sp!, {pc}^
  112. @ In : r0 = addr, r1 = error
  113. @ Out: r0 = x, r1 = error
  114. uaccess_kernel_get_half:
  115. stmfd sp!, {lr}
  116. ldr r0, [r0]
  117. mov r0, r0, lsl #16
  118. mov r0, r0, lsr #16
  119. ldmfd sp!, {pc}^
  120. @ In : r0 = addr, r1 = error
  121. @ Out: r0 = x, r1 = error
  122. uaccess_kernel_get_word:
  123. stmfd sp!, {lr}
  124. ldr r0, [r0]
  125. ldmfd sp!, {pc}^
  126. /* Prototype: int uaccess_kernel_copy(void *to, const char *from, size_t n)
  127.  * Purpose  : copy a block to kernel memory from kernel memory
  128.  * Params   : to   - kernel memory
  129.  *          : from - kernel memory
  130.  *          : n    - number of bytes to copy
  131.  * Returns  : Number of bytes NOT copied.
  132.  */
  133. uaccess_kernel_copy:
  134. stmfd sp!, {lr}
  135. bl SYMBOL_NAME(memcpy)
  136. mov r0, #0
  137. ldmfd sp!, {pc}^
  138. /* Prototype: int uaccess_kernel_clear(void *addr, size_t sz)
  139.  * Purpose  : clear some kernel memory
  140.  * Params   : addr - kernel memory address to clear
  141.  *          : sz   - number of bytes to clear
  142.  * Returns  : number of bytes NOT cleared
  143.  */
  144. uaccess_kernel_clear:
  145. stmfd sp!, {lr}
  146. mov r2, #0
  147. cmp r1, #4
  148. blt 2f
  149. ands ip, r0, #3
  150. beq 1f
  151. cmp ip, #1
  152. strb r2, [r0], #1
  153. strleb r2, [r0], #1
  154. strltb r2, [r0], #1
  155. rsb ip, ip, #4
  156. sub r1, r1, ip @  7  6  5  4  3  2  1
  157. 1: subs r1, r1, #8 @ -1 -2 -3 -4 -5 -6 -7
  158. bmi 2f
  159. str r2, [r0], #4
  160. str r2, [r0], #4
  161. b 1b
  162. 2: adds r1, r1, #4 @  3  2  1  0 -1 -2 -3
  163. strpl r2, [r0], #4
  164. tst r1, #2 @ 1x 1x 0x 0x 1x 1x 0x
  165. strneb r2, [r0], #1
  166. strneb r2, [r0], #1
  167. tst r1, #1 @ x1 x0 x1 x0 x1 x0 x1
  168. strneb r2, [r0], #1
  169. mov r0, #0
  170. ldmfd sp!, {pc}^
  171. /* Prototype: size_t uaccess_kernel_strncpy_from(char *dst, char *src, size_t len)
  172.  * Purpose  : copy a string from kernel memory to kernel memory
  173.  * Params   : dst - kernel memory destination
  174.  *          : src - kernel memory source
  175.  *          : len - maximum length of string
  176.  * Returns  : number of characters copied
  177.  */
  178. uaccess_kernel_strncpy_from:
  179. stmfd sp!, {lr}
  180. mov ip, r2
  181. 1: subs r2, r2, #1
  182. bmi 2f
  183. ldrb r3, [r1], #1
  184. strb r3, [r0], #1
  185. teq r3, #0
  186. bne 1b
  187. 2: subs r0, ip, r2
  188. ldmfd sp!, {pc}^
  189. /* Prototype: int uaccess_kernel_strlen(char *str, long n)
  190.  * Purpose  : get length of a string in kernel memory
  191.  * Params   : str - address of string in kernel memory
  192.  * Returns  : length of string *including terminator*,
  193.  *            or zero on exception, or n + 1 if too long
  194.  */
  195. uaccess_kernel_strnlen:
  196. stmfd sp!, {lr}
  197. mov r2, r0
  198. 1: ldrb r1, [r0], #1
  199. teq r1, #0
  200. beq 2f
  201. subs r1, r1, #1
  202. bne 1b
  203. add r0, r0, #1
  204. 2: sub r0, r0, r2
  205. ldmfd sp!, {pc}^