copy_from_user.S 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /*
  2. * linux/arch/arm/lib/copy_from_user.S
  3. *
  4. * Author: Nicolas Pitre
  5. * Created: Sep 29, 2005
  6. * Copyright: MontaVista Software, Inc.
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License version 2 as
  10. * published by the Free Software Foundation.
  11. */
  12. #include <linux/linkage.h>
  13. #include <asm/assembler.h>
  14. #include <asm/unwind.h>
  15. #include <asm/export.h>
  16. /*
  17. * Prototype:
  18. *
  19. * size_t arm_copy_from_user(void *to, const void *from, size_t n)
  20. *
  21. * Purpose:
  22. *
  23. * copy a block to kernel memory from user memory
  24. *
  25. * Params:
  26. *
  27. * to = kernel memory
  28. * from = user memory
  29. * n = number of bytes to copy
  30. *
  31. * Return value:
  32. *
  33. * Number of bytes NOT copied.
  34. */
  35. #ifndef CONFIG_THUMB2_KERNEL
  36. #define LDR1W_SHIFT 0
  37. #else
  38. #define LDR1W_SHIFT 1
  39. #endif
  40. #define STR1W_SHIFT 0
  41. .macro ldr1w ptr reg abort
  42. ldrusr \reg, \ptr, 4, abort=\abort
  43. .endm
  44. .macro ldr4w ptr reg1 reg2 reg3 reg4 abort
  45. ldr1w \ptr, \reg1, \abort
  46. ldr1w \ptr, \reg2, \abort
  47. ldr1w \ptr, \reg3, \abort
  48. ldr1w \ptr, \reg4, \abort
  49. .endm
  50. .macro ldr8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
  51. ldr4w \ptr, \reg1, \reg2, \reg3, \reg4, \abort
  52. ldr4w \ptr, \reg5, \reg6, \reg7, \reg8, \abort
  53. .endm
  54. .macro ldr1b ptr reg cond=al abort
  55. ldrusr \reg, \ptr, 1, \cond, abort=\abort
  56. .endm
  57. .macro str1w ptr reg abort
  58. W(str) \reg, [\ptr], #4
  59. .endm
  60. .macro str8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
  61. stmia \ptr!, {\reg1, \reg2, \reg3, \reg4, \reg5, \reg6, \reg7, \reg8}
  62. .endm
  63. .macro str1b ptr reg cond=al abort
  64. str\cond\()b \reg, [\ptr], #1
  65. .endm
  66. .macro enter reg1 reg2
  67. mov r3, #0
  68. stmdb sp!, {r0, r2, r3, \reg1, \reg2}
  69. .endm
  70. .macro usave reg1 reg2
  71. UNWIND( .save {r0, r2, r3, \reg1, \reg2} )
  72. .endm
  73. .macro exit reg1 reg2
  74. add sp, sp, #8
  75. ldmfd sp!, {r0, \reg1, \reg2}
  76. .endm
  77. .text
  78. ENTRY(arm_copy_from_user)
  79. #include "copy_template.S"
  80. ENDPROC(arm_copy_from_user)
  81. EXPORT_SYMBOL(arm_copy_from_user)
  82. .pushsection .fixup,"ax"
  83. .align 0
  84. copy_abort_preamble
  85. ldmfd sp!, {r1, r2, r3}
  86. sub r0, r0, r1
  87. rsb r0, r0, r2
  88. copy_abort_end
  89. .popsection