| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- /* SPDX-License-Identifier: GPL-2.0 */
- /*
- * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
- */
- #include <linux/linkage.h>
- #include <asm/asm.h>
- #include <asm/asmmacro.h>
- #include <asm/asm-extable.h>
- #include <asm/errno.h>
- #include <asm/regdef.h>
- .L_fixup_handle_unaligned:
- li.w a0, -EFAULT
- jr ra
- /*
- * unsigned long unaligned_read(void *addr, void *value, unsigned long n, bool sign)
- *
- * a0: addr
- * a1: value
- * a2: n
- * a3: sign
- */
- SYM_FUNC_START(unaligned_read)
- beqz a2, 5f
- li.w t2, 0
- addi.d t0, a2, -1
- slli.d t1, t0, 3
- add.d a0, a0, t0
- beqz a3, 2f
- 1: ld.b t3, a0, 0
- b 3f
- 2: ld.bu t3, a0, 0
- 3: sll.d t3, t3, t1
- or t2, t2, t3
- addi.d t1, t1, -8
- addi.d a0, a0, -1
- addi.d a2, a2, -1
- bgtz a2, 2b
- 4: st.d t2, a1, 0
- move a0, a2
- jr ra
- 5: li.w a0, -EFAULT
- jr ra
- _asm_extable 1b, .L_fixup_handle_unaligned
- _asm_extable 2b, .L_fixup_handle_unaligned
- _asm_extable 4b, .L_fixup_handle_unaligned
- SYM_FUNC_END(unaligned_read)
- /*
- * unsigned long unaligned_write(void *addr, unsigned long value, unsigned long n)
- *
- * a0: addr
- * a1: value
- * a2: n
- */
- SYM_FUNC_START(unaligned_write)
- beqz a2, 3f
- li.w t0, 0
- 1: srl.d t1, a1, t0
- 2: st.b t1, a0, 0
- addi.d t0, t0, 8
- addi.d a2, a2, -1
- addi.d a0, a0, 1
- bgtz a2, 1b
- move a0, a2
- jr ra
- 3: li.w a0, -EFAULT
- jr ra
- _asm_extable 2b, .L_fixup_handle_unaligned
- SYM_FUNC_END(unaligned_write)
|