~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/loongarch/lib/copy_user.S

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0 */
  2 /*
  3  * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
  4  */
  5 
  6 #include <linux/export.h>
  7 #include <asm/alternative-asm.h>
  8 #include <asm/asm.h>
  9 #include <asm/asmmacro.h>
 10 #include <asm/asm-extable.h>
 11 #include <asm/cpu.h>
 12 #include <asm/regdef.h>
 13 #include <asm/unwind_hints.h>
 14 
 15 SYM_FUNC_START(__copy_user)
 16         /*
 17          * Some CPUs support hardware unaligned access
 18          */
 19         ALTERNATIVE     "b __copy_user_generic",        \
 20                         "b __copy_user_fast", CPU_FEATURE_UAL
 21 SYM_FUNC_END(__copy_user)
 22 
 23 EXPORT_SYMBOL(__copy_user)
 24 
 25 /*
 26  * unsigned long __copy_user_generic(void *to, const void *from, size_t n)
 27  *
 28  * a0: to
 29  * a1: from
 30  * a2: n
 31  */
 32 SYM_FUNC_START(__copy_user_generic)
 33         beqz    a2, 3f
 34 
 35 1:      ld.b    t0, a1, 0
 36 2:      st.b    t0, a0, 0
 37         addi.d  a0, a0, 1
 38         addi.d  a1, a1, 1
 39         addi.d  a2, a2, -1
 40         bgtz    a2, 1b
 41 
 42 3:      move    a0, a2
 43         jr      ra
 44 
 45         _asm_extable 1b, 3b
 46         _asm_extable 2b, 3b
 47 SYM_FUNC_END(__copy_user_generic)
 48 
 49 /*
 50  * unsigned long __copy_user_fast(void *to, const void *from, unsigned long n)
 51  *
 52  * a0: to
 53  * a1: from
 54  * a2: n
 55  */
 56 SYM_FUNC_START(__copy_user_fast)
 57         sltui   t0, a2, 9
 58         bnez    t0, .Lsmall
 59 
 60 0:      ld.d    t0, a1, 0
 61 1:      st.d    t0, a0, 0
 62         add.d   a3, a1, a2
 63         add.d   a2, a0, a2
 64 
 65         /* align up destination address */
 66         andi    t1, a0, 7
 67         sub.d   t0, zero, t1
 68         addi.d  t0, t0, 8
 69         add.d   a1, a1, t0
 70         add.d   a0, a0, t0
 71 
 72         addi.d  a4, a3, -64
 73         bgeu    a1, a4, .Llt64
 74 
 75         /* copy 64 bytes at a time */
 76 .Lloop64:
 77 2:      ld.d    t0, a1, 0
 78 3:      ld.d    t1, a1, 8
 79 4:      ld.d    t2, a1, 16
 80 5:      ld.d    t3, a1, 24
 81 6:      ld.d    t4, a1, 32
 82 7:      ld.d    t5, a1, 40
 83 8:      ld.d    t6, a1, 48
 84 9:      ld.d    t7, a1, 56
 85 10:     st.d    t0, a0, 0
 86 11:     st.d    t1, a0, 8
 87 12:     st.d    t2, a0, 16
 88 13:     st.d    t3, a0, 24
 89 14:     st.d    t4, a0, 32
 90 15:     st.d    t5, a0, 40
 91 16:     st.d    t6, a0, 48
 92 17:     st.d    t7, a0, 56
 93         addi.d  a1, a1, 64
 94         addi.d  a0, a0, 64
 95         bltu    a1, a4, .Lloop64
 96 
 97         /* copy the remaining bytes */
 98 .Llt64:
 99         addi.d  a4, a3, -32
100         bgeu    a1, a4, .Llt32
101 18:     ld.d    t0, a1, 0
102 19:     ld.d    t1, a1, 8
103 20:     ld.d    t2, a1, 16
104 21:     ld.d    t3, a1, 24
105 22:     st.d    t0, a0, 0
106 23:     st.d    t1, a0, 8
107 24:     st.d    t2, a0, 16
108 25:     st.d    t3, a0, 24
109         addi.d  a1, a1, 32
110         addi.d  a0, a0, 32
111 
112 .Llt32:
113         addi.d  a4, a3, -16
114         bgeu    a1, a4, .Llt16
115 26:     ld.d    t0, a1, 0
116 27:     ld.d    t1, a1, 8
117 28:     st.d    t0, a0, 0
118 29:     st.d    t1, a0, 8
119         addi.d  a1, a1, 16
120         addi.d  a0, a0, 16
121 
122 .Llt16:
123         addi.d  a4, a3, -8
124         bgeu    a1, a4, .Llt8
125 30:     ld.d    t0, a1, 0
126 31:     st.d    t0, a0, 0
127         addi.d  a1, a1, 8
128         addi.d  a0, a0, 8
129 
130 .Llt8:
131 32:     ld.d    t0, a3, -8
132 33:     st.d    t0, a2, -8
133 
134         /* return */
135         move    a0, zero
136         jr      ra
137 
138         .align  5
139 .Lsmall:
140         pcaddi  t0, 8
141         slli.d  a3, a2, 5
142         add.d   t0, t0, a3
143         jr      t0
144 
145         .align  5
146         move    a0, zero
147         jr      ra
148 
149         .align  5
150 34:     ld.b    t0, a1, 0
151 35:     st.b    t0, a0, 0
152         move    a0, zero
153         jr      ra
154 
155         .align  5
156 36:     ld.h    t0, a1, 0
157 37:     st.h    t0, a0, 0
158         move    a0, zero
159         jr      ra
160 
161         .align  5
162 38:     ld.h    t0, a1, 0
163 39:     ld.b    t1, a1, 2
164 40:     st.h    t0, a0, 0
165 41:     st.b    t1, a0, 2
166         move    a0, zero
167         jr      ra
168 
169         .align  5
170 42:     ld.w    t0, a1, 0
171 43:     st.w    t0, a0, 0
172         move    a0, zero
173         jr      ra
174 
175         .align  5
176 44:     ld.w    t0, a1, 0
177 45:     ld.b    t1, a1, 4
178 46:     st.w    t0, a0, 0
179 47:     st.b    t1, a0, 4
180         move    a0, zero
181         jr      ra
182 
183         .align  5
184 48:     ld.w    t0, a1, 0
185 49:     ld.h    t1, a1, 4
186 50:     st.w    t0, a0, 0
187 51:     st.h    t1, a0, 4
188         move    a0, zero
189         jr      ra
190 
191         .align  5
192 52:     ld.w    t0, a1, 0
193 53:     ld.w    t1, a1, 3
194 54:     st.w    t0, a0, 0
195 55:     st.w    t1, a0, 3
196         move    a0, zero
197         jr      ra
198 
199         .align  5
200 56:     ld.d    t0, a1, 0
201 57:     st.d    t0, a0, 0
202         move    a0, zero
203         jr      ra
204 
205         /* fixup and ex_table */
206 .Llarge_fixup:
207         sub.d   a2, a2, a0
208 
209 .Lsmall_fixup:
210 58:     ld.b    t0, a1, 0
211 59:     st.b    t0, a0, 0
212         addi.d  a0, a0, 1
213         addi.d  a1, a1, 1
214         addi.d  a2, a2, -1
215         bgt     a2, zero, 58b
216 
217 .Lexit:
218         move    a0, a2
219         jr      ra
220 
221         _asm_extable 0b, .Lsmall_fixup
222         _asm_extable 1b, .Lsmall_fixup
223         _asm_extable 2b, .Llarge_fixup
224         _asm_extable 3b, .Llarge_fixup
225         _asm_extable 4b, .Llarge_fixup
226         _asm_extable 5b, .Llarge_fixup
227         _asm_extable 6b, .Llarge_fixup
228         _asm_extable 7b, .Llarge_fixup
229         _asm_extable 8b, .Llarge_fixup
230         _asm_extable 9b, .Llarge_fixup
231         _asm_extable 10b, .Llarge_fixup
232         _asm_extable 11b, .Llarge_fixup
233         _asm_extable 12b, .Llarge_fixup
234         _asm_extable 13b, .Llarge_fixup
235         _asm_extable 14b, .Llarge_fixup
236         _asm_extable 15b, .Llarge_fixup
237         _asm_extable 16b, .Llarge_fixup
238         _asm_extable 17b, .Llarge_fixup
239         _asm_extable 18b, .Llarge_fixup
240         _asm_extable 19b, .Llarge_fixup
241         _asm_extable 20b, .Llarge_fixup
242         _asm_extable 21b, .Llarge_fixup
243         _asm_extable 22b, .Llarge_fixup
244         _asm_extable 23b, .Llarge_fixup
245         _asm_extable 24b, .Llarge_fixup
246         _asm_extable 25b, .Llarge_fixup
247         _asm_extable 26b, .Llarge_fixup
248         _asm_extable 27b, .Llarge_fixup
249         _asm_extable 28b, .Llarge_fixup
250         _asm_extable 29b, .Llarge_fixup
251         _asm_extable 30b, .Llarge_fixup
252         _asm_extable 31b, .Llarge_fixup
253         _asm_extable 32b, .Llarge_fixup
254         _asm_extable 33b, .Llarge_fixup
255         _asm_extable 34b, .Lexit
256         _asm_extable 35b, .Lexit
257         _asm_extable 36b, .Lsmall_fixup
258         _asm_extable 37b, .Lsmall_fixup
259         _asm_extable 38b, .Lsmall_fixup
260         _asm_extable 39b, .Lsmall_fixup
261         _asm_extable 40b, .Lsmall_fixup
262         _asm_extable 41b, .Lsmall_fixup
263         _asm_extable 42b, .Lsmall_fixup
264         _asm_extable 43b, .Lsmall_fixup
265         _asm_extable 44b, .Lsmall_fixup
266         _asm_extable 45b, .Lsmall_fixup
267         _asm_extable 46b, .Lsmall_fixup
268         _asm_extable 47b, .Lsmall_fixup
269         _asm_extable 48b, .Lsmall_fixup
270         _asm_extable 49b, .Lsmall_fixup
271         _asm_extable 50b, .Lsmall_fixup
272         _asm_extable 51b, .Lsmall_fixup
273         _asm_extable 52b, .Lsmall_fixup
274         _asm_extable 53b, .Lsmall_fixup
275         _asm_extable 54b, .Lsmall_fixup
276         _asm_extable 55b, .Lsmall_fixup
277         _asm_extable 56b, .Lsmall_fixup
278         _asm_extable 57b, .Lsmall_fixup
279         _asm_extable 58b, .Lexit
280         _asm_extable 59b, .Lexit
281 SYM_FUNC_END(__copy_user_fast)
282 
283 STACK_FRAME_NON_STANDARD __copy_user_fast

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php