copy_to_user.S 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /*
  2. * Copyright (C) 2012 ARM Ltd.
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License version 2 as
  6. * published by the Free Software Foundation.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #include <linux/linkage.h>
  17. #include <asm/cache.h>
  18. #include <asm/asm-uaccess.h>
  19. /*
  20. * Copy to user space from a kernel buffer (alignment handled by the hardware)
  21. *
  22. * Parameters:
  23. * x0 - to
  24. * x1 - from
  25. * x2 - n
  26. * Returns:
  27. * x0 - bytes not copied
  28. */
  29. .macro ldrb1 ptr, regB, val
  30. ldrb \ptr, [\regB], \val
  31. .endm
  32. .macro strb1 ptr, regB, val
  33. uao_user_alternative 9998f, strb, sttrb, \ptr, \regB, \val
  34. .endm
  35. .macro ldrh1 ptr, regB, val
  36. ldrh \ptr, [\regB], \val
  37. .endm
  38. .macro strh1 ptr, regB, val
  39. uao_user_alternative 9998f, strh, sttrh, \ptr, \regB, \val
  40. .endm
  41. .macro ldr1 ptr, regB, val
  42. ldr \ptr, [\regB], \val
  43. .endm
  44. .macro str1 ptr, regB, val
  45. uao_user_alternative 9998f, str, sttr, \ptr, \regB, \val
  46. .endm
  47. .macro ldp1 ptr, regB, regC, val
  48. ldp \ptr, \regB, [\regC], \val
  49. .endm
  50. .macro stp1 ptr, regB, regC, val
  51. uao_stp 9998f, \ptr, \regB, \regC, \val
  52. .endm
  53. end .req x5
  54. ENTRY(__arch_copy_to_user)
  55. uaccess_enable_not_uao x3, x4, x5
  56. add end, x0, x2
  57. #include "copy_template.S"
  58. uaccess_disable_not_uao x3, x4
  59. mov x0, #0
  60. ret
  61. ENDPROC(__arch_copy_to_user)
  62. .section .fixup,"ax"
  63. .align 2
  64. 9998: sub x0, end, dst // bytes not copied
  65. uaccess_disable_not_uao x3, x4
  66. ret
  67. .previous