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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/arch/arm/lib/getuser.S
  3.  *
  4.  *  Copyright (C) 2001 Russell King
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License version 2 as
  8.  * published by the Free Software Foundation.
  9.  *
  10.  *  Idea from x86 version, (C) Copyright 1998 Linus Torvalds
  11.  *
  12.  * These functions have a non-standard call interface to make them more
  13.  * efficient, especially as they return an error value in addition to
  14.  * the "real" return value.
  15.  *
  16.  * __get_user_X
  17.  *
  18.  * Inputs: r0 contains the address
  19.  * Outputs: r0 is the error code
  20.  * r1, r2 contains the zero-extended value
  21.  * lr corrupted
  22.  *
  23.  * No other registers must be altered.  (see include/asm-arm/uaccess.h
  24.  * for specific ASM register usage).
  25.  *
  26.  * Note that ADDR_LIMIT is either 0 or 0xc0000000.
  27.  * Note also that it is intended that __get_user_bad is not global.
  28.  */
  29. #include <asm/constants.h>
  30. .global __get_user_1
  31. __get_user_1:
  32. bic r1, sp, #0x1f00
  33. bic r1, r1, #0x00ff
  34. ldr r1, [r1, #TSK_ADDR_LIMIT]
  35. sub r1, r1, #1
  36. cmp r0, r1
  37. 1: ldrlsbt r1, [r0]
  38. movls r0, #0
  39. movls pc, lr
  40. b __get_user_bad
  41. .global __get_user_2
  42. __get_user_2:
  43. bic r2, sp, #0x1f00
  44. bic r2, r2, #0x00ff
  45. ldr r2, [r2, #TSK_ADDR_LIMIT]
  46. sub r2, r2, #2
  47. cmp r0, r2
  48. 2: ldrlsbt r1, [r0], #1
  49. 3: ldrlsbt r2, [r0]
  50. orrls r1, r1, r2, lsl #8
  51. movls r0, #0
  52. movls pc, lr
  53. b __get_user_bad
  54. .global __get_user_4
  55. __get_user_4:
  56. bic r1, sp, #0x1f00
  57. bic r1, r1, #0x00ff
  58. ldr r1, [r1, #TSK_ADDR_LIMIT]
  59. sub r1, r1, #4
  60. cmp r0, r1
  61. 4: ldrlst r1, [r0]
  62. movls r0, #0
  63. movls pc, lr
  64. b __get_user_bad
  65. .global __get_user_8
  66. __get_user_8:
  67. bic r2, sp, #0x1f00
  68. bic r2, r2, #0x00ff
  69. ldr r2, [r2, #TSK_ADDR_LIMIT]
  70. sub r2, r2, #8
  71. cmp r0, r2
  72. 5: ldrlst r1, [r0], #4
  73. 6: ldrlst r2, [r0]
  74. movls r0, #0
  75. movls pc, lr
  76. /* fall through */
  77. __get_user_bad_8:
  78. mov r2, #0
  79. __get_user_bad:
  80. mov r1, #0
  81. mov r0, #-14
  82. mov pc, lr
  83. .section __ex_table, "a"
  84. .long 1b, __get_user_bad
  85. .long 2b, __get_user_bad
  86. .long 3b, __get_user_bad
  87. .long 4b, __get_user_bad
  88. .long 5b, __get_user_bad_8
  89. .long 6b, __get_user_bad_8
  90. .previous