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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * __get_user functions.
  3.  *
  4.  * (C) Copyright 1998 Linus Torvalds
  5.  *
  6.  * These functions have a non-standard call interface
  7.  * to make them more efficient, especially as they
  8.  * return an error value in addition to the "real"
  9.  * return value.
  10.  */
  11. /*
  12.  * __get_user_X
  13.  *
  14.  * Inputs: %eax contains the address
  15.  *
  16.  * Outputs: %eax is error code (0 or -EFAULT)
  17.  * %edx contains zero-extended value
  18.  *
  19.  * These functions should not modify any other registers,
  20.  * as they get called from within inline assembly.
  21.  */
  22. addr_limit = 12
  23. .text
  24. .align 4
  25. .globl __get_user_1
  26. __get_user_1:
  27. movl %esp,%edx
  28. andl $0xffffe000,%edx
  29. cmpl addr_limit(%edx),%eax
  30. jae bad_get_user
  31. 1: movzbl (%eax),%edx
  32. xorl %eax,%eax
  33. ret
  34. .align 4
  35. .globl __get_user_2
  36. __get_user_2:
  37. addl $1,%eax
  38. movl %esp,%edx
  39. jc bad_get_user
  40. andl $0xffffe000,%edx
  41. cmpl addr_limit(%edx),%eax
  42. jae bad_get_user
  43. 2: movzwl -1(%eax),%edx
  44. xorl %eax,%eax
  45. ret
  46. .align 4
  47. .globl __get_user_4
  48. __get_user_4:
  49. addl $3,%eax
  50. movl %esp,%edx
  51. jc bad_get_user
  52. andl $0xffffe000,%edx
  53. cmpl addr_limit(%edx),%eax
  54. jae bad_get_user
  55. 3: movl -3(%eax),%edx
  56. xorl %eax,%eax
  57. ret
  58. bad_get_user:
  59. xorl %edx,%edx
  60. movl $-14,%eax
  61. ret
  62. .section __ex_table,"a"
  63. .long 1b,bad_get_user
  64. .long 2b,bad_get_user
  65. .long 3b,bad_get_user
  66. .previous