csumpartialcopyuser.S 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * linux/arch/arm/lib/csumpartialcopyuser.S
  4. *
  5. * Copyright (C) 1995-1998 Russell King
  6. *
  7. * 27/03/03 Ian Molton Clean up CONFIG_CPU
  8. */
  9. #include <linux/linkage.h>
  10. #include <asm/assembler.h>
  11. #include <asm/errno.h>
  12. #include <asm/asm-offsets.h>
  13. .text
  14. #if defined(CONFIG_CPU_SW_DOMAIN_PAN)
  15. .macro save_regs
  16. mrc p15, 0, ip, c3, c0, 0
  17. stmfd sp!, {r1, r2, r4 - r8, ip, lr}
  18. uaccess_enable ip
  19. .endm
  20. .macro load_regs
  21. ldmfd sp!, {r1, r2, r4 - r8, ip, lr}
  22. mcr p15, 0, ip, c3, c0, 0
  23. ret lr
  24. .endm
  25. #elif defined(CONFIG_CPU_TTBR0_PAN)
  26. .macro save_regs
  27. mrc p15, 0, ip, c2, c0, 2 @ read TTBCR
  28. stmfd sp!, {r1, r2, r4 - r8, ip, lr}
  29. uaccess_enable ip
  30. .endm
  31. .macro load_regs
  32. ldmfd sp!, {r1, r2, r4 - r8, ip, lr}
  33. mcr p15, 0, ip, c2, c0, 2 @ restore TTBCR
  34. ret lr
  35. .endm
  36. #else
  37. .macro save_regs
  38. stmfd sp!, {r1, r2, r4 - r8, lr}
  39. .endm
  40. .macro load_regs
  41. ldmfd sp!, {r1, r2, r4 - r8, pc}
  42. .endm
  43. #endif
  44. .macro load1b, reg1
  45. ldrusr \reg1, r0, 1
  46. .endm
  47. .macro load2b, reg1, reg2
  48. ldrusr \reg1, r0, 1
  49. ldrusr \reg2, r0, 1
  50. .endm
  51. .macro load1l, reg1
  52. ldrusr \reg1, r0, 4
  53. .endm
  54. .macro load2l, reg1, reg2
  55. ldrusr \reg1, r0, 4
  56. ldrusr \reg2, r0, 4
  57. .endm
  58. .macro load4l, reg1, reg2, reg3, reg4
  59. ldrusr \reg1, r0, 4
  60. ldrusr \reg2, r0, 4
  61. ldrusr \reg3, r0, 4
  62. ldrusr \reg4, r0, 4
  63. .endm
  64. /*
  65. * unsigned int
  66. * csum_partial_copy_from_user(const char *src, char *dst, int len)
  67. * r0 = src, r1 = dst, r2 = len
  68. * Returns : r0 = checksum or 0
  69. */
  70. #define FN_ENTRY ENTRY(csum_partial_copy_from_user)
  71. #define FN_EXIT ENDPROC(csum_partial_copy_from_user)
  72. #include "csumpartialcopygeneric.S"
  73. /*
  74. * We report fault by returning 0 csum - impossible in normal case, since
  75. * we start with 0xffffffff for initial sum.
  76. */
  77. .pushsection .text.fixup,"ax"
  78. .align 4
  79. 9001: mov r0, #0
  80. load_regs
  81. .popsection