copy_in_user.S 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copy from user space to user space
  4. *
  5. * Copyright (C) 2012 ARM Ltd.
  6. */
  7. #include <linux/linkage.h>
  8. #include <asm/asm-uaccess.h>
  9. #include <asm/assembler.h>
  10. #include <asm/cache.h>
  11. /*
  12. * Copy from user space to user space (alignment handled by the hardware)
  13. *
  14. * Parameters:
  15. * x0 - to
  16. * x1 - from
  17. * x2 - n
  18. * Returns:
  19. * x0 - bytes not copied
  20. */
  21. .macro ldrb1 ptr, regB, val
  22. uao_user_alternative 9998f, ldrb, ldtrb, \ptr, \regB, \val
  23. .endm
  24. .macro strb1 ptr, regB, val
  25. uao_user_alternative 9998f, strb, sttrb, \ptr, \regB, \val
  26. .endm
  27. .macro ldrh1 ptr, regB, val
  28. uao_user_alternative 9998f, ldrh, ldtrh, \ptr, \regB, \val
  29. .endm
  30. .macro strh1 ptr, regB, val
  31. uao_user_alternative 9998f, strh, sttrh, \ptr, \regB, \val
  32. .endm
  33. .macro ldr1 ptr, regB, val
  34. uao_user_alternative 9998f, ldr, ldtr, \ptr, \regB, \val
  35. .endm
  36. .macro str1 ptr, regB, val
  37. uao_user_alternative 9998f, str, sttr, \ptr, \regB, \val
  38. .endm
  39. .macro ldp1 ptr, regB, regC, val
  40. uao_ldp 9998f, \ptr, \regB, \regC, \val
  41. .endm
  42. .macro stp1 ptr, regB, regC, val
  43. uao_stp 9998f, \ptr, \regB, \regC, \val
  44. .endm
  45. end .req x5
  46. ENTRY(__arch_copy_in_user)
  47. uaccess_enable_not_uao x3, x4, x5
  48. add end, x0, x2
  49. #include "copy_template.S"
  50. uaccess_disable_not_uao x3, x4
  51. mov x0, #0
  52. ret
  53. ENDPROC(__arch_copy_in_user)
  54. EXPORT_SYMBOL(__arch_copy_in_user)
  55. .section .fixup,"ax"
  56. .align 2
  57. 9998: sub x0, end, dst // bytes not copied
  58. ret
  59. .previous