drm/rockchip: vop2: Fix the windows switch between different layers
[drm/drm-misc.git] / arch / sparc / kernel / una_asm_32.S
blobf8bf839289fb1907f30f211bd42bf71ef9a64bb6
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* una_asm.S: Kernel unaligned trap assembler helpers.
3  *
4  * Copyright (C) 1996,2005,2008 David S. Miller (davem@davemloft.net)
5  * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
6  */
8 #include <linux/errno.h>
10         .text
12 retl_efault:
13         retl
14          mov    -EFAULT, %o0
16         /* int __do_int_store(unsigned long *dst_addr, int size,
17          *                    unsigned long *src_val)
18          *
19          * %o0 = dest_addr
20          * %o1 = size
21          * %o2 = src_val
22          *
23          * Return '0' on success, -EFAULT on failure.
24          */
25         .globl  __do_int_store
26 __do_int_store:
27         ld      [%o2], %g1
28         cmp     %o1, 2
29         be      2f
30          cmp    %o1, 4
31         be      1f
32          srl    %g1, 24, %g2
33         srl     %g1, 16, %g7
34 4:      stb     %g2, [%o0]
35         srl     %g1, 8, %g2
36 5:      stb     %g7, [%o0 + 1]
37         ld      [%o2 + 4], %g7
38 6:      stb     %g2, [%o0 + 2]
39         srl     %g7, 24, %g2
40 7:      stb     %g1, [%o0 + 3]
41         srl     %g7, 16, %g1
42 8:      stb     %g2, [%o0 + 4]
43         srl     %g7, 8, %g2
44 9:      stb     %g1, [%o0 + 5]
45 10:     stb     %g2, [%o0 + 6]
46         b       0f
47 11:      stb    %g7, [%o0 + 7]
48 1:      srl     %g1, 16, %g7
49 12:     stb     %g2, [%o0]
50         srl     %g1, 8, %g2
51 13:     stb     %g7, [%o0 + 1]
52 14:     stb     %g2, [%o0 + 2]
53         b       0f
54 15:      stb    %g1, [%o0 + 3]
55 2:      srl     %g1, 8, %g2
56 16:     stb     %g2, [%o0]
57 17:     stb     %g1, [%o0 + 1]
58 0:      retl
59          mov    0, %o0
61         .section __ex_table,#alloc
62         .word   4b, retl_efault
63         .word   5b, retl_efault
64         .word   6b, retl_efault
65         .word   7b, retl_efault
66         .word   8b, retl_efault
67         .word   9b, retl_efault
68         .word   10b, retl_efault
69         .word   11b, retl_efault
70         .word   12b, retl_efault
71         .word   13b, retl_efault
72         .word   14b, retl_efault
73         .word   15b, retl_efault
74         .word   16b, retl_efault
75         .word   17b, retl_efault
76         .previous
78         /* int do_int_load(unsigned long *dest_reg, int size,
79          *                 unsigned long *saddr, int is_signed)
80          *
81          * %o0 = dest_reg
82          * %o1 = size
83          * %o2 = saddr
84          * %o3 = is_signed
85          *
86          * Return '0' on success, -EFAULT on failure.
87          */
88         .globl  do_int_load
89 do_int_load:
90         cmp     %o1, 8
91         be      9f
92          cmp    %o1, 4
93         be      6f
94 4:       ldub   [%o2], %g1
95 5:      ldub    [%o2 + 1], %g2
96         sll     %g1, 8, %g1
97         tst     %o3
98         be      3f
99          or     %g1, %g2, %g1
100         sll     %g1, 16, %g1
101         sra     %g1, 16, %g1
102 3:      b       0f
103          st     %g1, [%o0]
104 6:      ldub    [%o2 + 1], %g2
105         sll     %g1, 24, %g1
106 7:      ldub    [%o2 + 2], %g7
107         sll     %g2, 16, %g2
108 8:      ldub    [%o2 + 3], %g3
109         sll     %g7, 8, %g7
110         or      %g3, %g2, %g3
111         or      %g7, %g3, %g7
112         or      %g1, %g7, %g1
113         b       0f
114          st     %g1, [%o0]
115 9:      ldub    [%o2], %g1
116 10:     ldub    [%o2 + 1], %g2
117         sll     %g1, 24, %g1
118 11:     ldub    [%o2 + 2], %g7
119         sll     %g2, 16, %g2
120 12:     ldub    [%o2 + 3], %g3
121         sll     %g7, 8, %g7
122         or      %g1, %g2, %g1
123         or      %g7, %g3, %g7
124         or      %g1, %g7, %g7
125 13:     ldub    [%o2 + 4], %g1
126         st      %g7, [%o0]
127 14:     ldub    [%o2 + 5], %g2
128         sll     %g1, 24, %g1
129 15:     ldub    [%o2 + 6], %g7
130         sll     %g2, 16, %g2
131 16:     ldub    [%o2 + 7], %g3
132         sll     %g7, 8, %g7
133         or      %g1, %g2, %g1
134         or      %g7, %g3, %g7
135         or      %g1, %g7, %g7
136         st      %g7, [%o0 + 4]
137 0:      retl
138          mov    0, %o0
140         .section __ex_table,#alloc
141         .word   4b, retl_efault
142         .word   5b, retl_efault
143         .word   6b, retl_efault
144         .word   7b, retl_efault
145         .word   8b, retl_efault
146         .word   9b, retl_efault
147         .word   10b, retl_efault
148         .word   11b, retl_efault
149         .word   12b, retl_efault
150         .word   13b, retl_efault
151         .word   14b, retl_efault
152         .word   15b, retl_efault
153         .word   16b, retl_efault
154         .previous