]> Git Repo - linux.git/blob - arch/loongarch/lib/unaligned.S
Merge tag 'amd-drm-next-6.5-2023-06-09' of https://gitlab.freedesktop.org/agd5f/linux...
[linux.git] / arch / loongarch / lib / unaligned.S
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
4  */
5
6 #include <linux/linkage.h>
7
8 #include <asm/asm.h>
9 #include <asm/asmmacro.h>
10 #include <asm/asm-extable.h>
11 #include <asm/errno.h>
12 #include <asm/export.h>
13 #include <asm/regdef.h>
14
15 .L_fixup_handle_unaligned:
16         li.w    a0, -EFAULT
17         jr      ra
18
19 /*
20  * unsigned long unaligned_read(void *addr, void *value, unsigned long n, bool sign)
21  *
22  * a0: addr
23  * a1: value
24  * a2: n
25  * a3: sign
26  */
27 SYM_FUNC_START(unaligned_read)
28         beqz    a2, 5f
29
30         li.w    t2, 0
31         addi.d  t0, a2, -1
32         slli.d  t1, t0, 3
33         add.d   a0, a0, t0
34
35         beqz    a3, 2f
36 1:      ld.b    t3, a0, 0
37         b       3f
38
39 2:      ld.bu   t3, a0, 0
40 3:      sll.d   t3, t3, t1
41         or      t2, t2, t3
42         addi.d  t1, t1, -8
43         addi.d  a0, a0, -1
44         addi.d  a2, a2, -1
45         bgtz    a2, 2b
46 4:      st.d    t2, a1, 0
47
48         move    a0, a2
49         jr      ra
50
51 5:      li.w    a0, -EFAULT
52         jr      ra
53
54         _asm_extable 1b, .L_fixup_handle_unaligned
55         _asm_extable 2b, .L_fixup_handle_unaligned
56         _asm_extable 4b, .L_fixup_handle_unaligned
57 SYM_FUNC_END(unaligned_read)
58
59 /*
60  * unsigned long unaligned_write(void *addr, unsigned long value, unsigned long n)
61  *
62  * a0: addr
63  * a1: value
64  * a2: n
65  */
66 SYM_FUNC_START(unaligned_write)
67         beqz    a2, 3f
68
69         li.w    t0, 0
70 1:      srl.d   t1, a1, t0
71 2:      st.b    t1, a0, 0
72         addi.d  t0, t0, 8
73         addi.d  a2, a2, -1
74         addi.d  a0, a0, 1
75         bgtz    a2, 1b
76
77         move    a0, a2
78         jr      ra
79
80 3:      li.w    a0, -EFAULT
81         jr      ra
82
83         _asm_extable 2b, .L_fixup_handle_unaligned
84 SYM_FUNC_END(unaligned_write)
This page took 0.037472 seconds and 4 git commands to generate.