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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/arch/arm/lib/putuser.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
  13.  * them more efficient, especially as they return an error
  14.  * value in addition to the "real" return value.
  15.  *
  16.  * __put_user_X
  17.  *
  18.  * Inputs: r0 contains the address
  19.  * r1, r2 contains the value
  20.  * Outputs: r0 is the error code
  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 __put_user_bad is not global.
  28.  */
  29. #include <asm/constants.h>
  30. .global __put_user_1
  31. __put_user_1:
  32. bic r2, sp, #0x1f00
  33. bic r2, r2, #0x00ff
  34. ldr r2, [r2, #TSK_ADDR_LIMIT]
  35. sub r2, r2, #1
  36. cmp r0, r2
  37. 1: strlsbt r1, [r0]
  38. movls r0, #0
  39. movls pc, lr
  40. b __put_user_bad
  41. .global __put_user_2
  42. __put_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: strlsbt r1, [r0], #1
  49. movls r1, r1, lsr #8
  50. 3: strlsbt r1, [r0]
  51. movls r0, #0
  52. movls pc, lr
  53. b __put_user_bad
  54. .global __put_user_4
  55. __put_user_4:
  56. bic r2, sp, #0x1f00
  57. bic r2, r2, #0x00ff
  58. ldr r2, [r2, #TSK_ADDR_LIMIT]
  59. sub r2, r2, #4
  60. cmp r0, r2
  61. 4: strlst r1, [r0]
  62. movls r0, #0
  63. movls pc, lr
  64. b __put_user_bad
  65. .global __put_user_8
  66. __put_user_8:
  67. bic ip, sp, #0x1f00
  68. bic ip, ip, #0x00ff
  69. ldr ip, [ip, #TSK_ADDR_LIMIT]
  70. sub ip, ip, #8
  71. cmp r0, ip
  72. 5: strlst r1, [r0], #4
  73. 6: strlst r2, [r0]
  74. movls r0, #0
  75. movls pc, lr
  76. /* fall through */
  77. __put_user_bad:
  78. mov r0, #-14
  79. mov pc, lr
  80. .section __ex_table, "a"
  81. .long 1b, __put_user_bad
  82. .long 2b, __put_user_bad
  83. .long 3b, __put_user_bad
  84. .long 4b, __put_user_bad
  85. .long 5b, __put_user_bad
  86. .long 6b, __put_user_bad
  87. .previous