unaligned.S 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
  4. */
  5. #include <linux/linkage.h>
  6. #include <asm/asm.h>
  7. #include <asm/asmmacro.h>
  8. #include <asm/asm-extable.h>
  9. #include <asm/errno.h>
  10. #include <asm/regdef.h>
  11. .L_fixup_handle_unaligned:
  12. li.w a0, -EFAULT
  13. jr ra
  14. /*
  15. * unsigned long unaligned_read(void *addr, void *value, unsigned long n, bool sign)
  16. *
  17. * a0: addr
  18. * a1: value
  19. * a2: n
  20. * a3: sign
  21. */
  22. SYM_FUNC_START(unaligned_read)
  23. beqz a2, 5f
  24. li.w t2, 0
  25. addi.d t0, a2, -1
  26. slli.d t1, t0, 3
  27. add.d a0, a0, t0
  28. beqz a3, 2f
  29. 1: ld.b t3, a0, 0
  30. b 3f
  31. 2: ld.bu t3, a0, 0
  32. 3: sll.d t3, t3, t1
  33. or t2, t2, t3
  34. addi.d t1, t1, -8
  35. addi.d a0, a0, -1
  36. addi.d a2, a2, -1
  37. bgtz a2, 2b
  38. 4: st.d t2, a1, 0
  39. move a0, a2
  40. jr ra
  41. 5: li.w a0, -EFAULT
  42. jr ra
  43. _asm_extable 1b, .L_fixup_handle_unaligned
  44. _asm_extable 2b, .L_fixup_handle_unaligned
  45. _asm_extable 4b, .L_fixup_handle_unaligned
  46. SYM_FUNC_END(unaligned_read)
  47. /*
  48. * unsigned long unaligned_write(void *addr, unsigned long value, unsigned long n)
  49. *
  50. * a0: addr
  51. * a1: value
  52. * a2: n
  53. */
  54. SYM_FUNC_START(unaligned_write)
  55. beqz a2, 3f
  56. li.w t0, 0
  57. 1: srl.d t1, a1, t0
  58. 2: st.b t1, a0, 0
  59. addi.d t0, t0, 8
  60. addi.d a2, a2, -1
  61. addi.d a0, a0, 1
  62. bgtz a2, 1b
  63. move a0, a2
  64. jr ra
  65. 3: li.w a0, -EFAULT
  66. jr ra
  67. _asm_extable 2b, .L_fixup_handle_unaligned
  68. SYM_FUNC_END(unaligned_write)