1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
6 #include <linux/export.h>
7 #include <asm/alternative-asm.h>
9 #include <asm/asmmacro.h>
10 #include <asm/asm-extable.h>
12 #include <asm/regdef.h>
14 .irp to, 0, 1, 2, 3, 4, 5, 6, 7
15 .L_fixup_handle_\to\():
17 addi.d a0, a0, (\to) * (-8)
22 .L_fixup_handle_s\to\():
27 SYM_FUNC_START(__copy_user)
29 * Some CPUs support hardware unaligned access
31 ALTERNATIVE "b __copy_user_generic", \
32 "b __copy_user_fast", CPU_FEATURE_UAL
33 SYM_FUNC_END(__copy_user)
35 EXPORT_SYMBOL(__copy_user)
38 * unsigned long __copy_user_generic(void *to, const void *from, size_t n)
44 SYM_FUNC_START(__copy_user_generic)
57 _asm_extable 1b, .L_fixup_handle_s0
58 _asm_extable 2b, .L_fixup_handle_s0
59 SYM_FUNC_END(__copy_user_generic)
62 * unsigned long __copy_user_fast(void *to, const void *from, unsigned long n)
68 SYM_FUNC_START(__copy_user_fast)
77 /* align up destination address */
87 /* copy 64 bytes at a time */
107 bltu a1, a4, .Lloop64
109 /* copy the remaining bytes */
216 /* fixup and ex_table */
217 _asm_extable 0b, .L_fixup_handle_0
218 _asm_extable 1b, .L_fixup_handle_0
219 _asm_extable 2b, .L_fixup_handle_0
220 _asm_extable 3b, .L_fixup_handle_0
221 _asm_extable 4b, .L_fixup_handle_0
222 _asm_extable 5b, .L_fixup_handle_0
223 _asm_extable 6b, .L_fixup_handle_0
224 _asm_extable 7b, .L_fixup_handle_0
225 _asm_extable 8b, .L_fixup_handle_0
226 _asm_extable 9b, .L_fixup_handle_0
227 _asm_extable 10b, .L_fixup_handle_0
228 _asm_extable 11b, .L_fixup_handle_1
229 _asm_extable 12b, .L_fixup_handle_2
230 _asm_extable 13b, .L_fixup_handle_3
231 _asm_extable 14b, .L_fixup_handle_4
232 _asm_extable 15b, .L_fixup_handle_5
233 _asm_extable 16b, .L_fixup_handle_6
234 _asm_extable 17b, .L_fixup_handle_7
235 _asm_extable 18b, .L_fixup_handle_0
236 _asm_extable 19b, .L_fixup_handle_0
237 _asm_extable 20b, .L_fixup_handle_0
238 _asm_extable 21b, .L_fixup_handle_0
239 _asm_extable 22b, .L_fixup_handle_0
240 _asm_extable 23b, .L_fixup_handle_1
241 _asm_extable 24b, .L_fixup_handle_2
242 _asm_extable 25b, .L_fixup_handle_3
243 _asm_extable 26b, .L_fixup_handle_0
244 _asm_extable 27b, .L_fixup_handle_0
245 _asm_extable 28b, .L_fixup_handle_0
246 _asm_extable 29b, .L_fixup_handle_1
247 _asm_extable 30b, .L_fixup_handle_0
248 _asm_extable 31b, .L_fixup_handle_0
249 _asm_extable 32b, .L_fixup_handle_0
250 _asm_extable 33b, .L_fixup_handle_0
251 _asm_extable 34b, .L_fixup_handle_s0
252 _asm_extable 35b, .L_fixup_handle_s0
253 _asm_extable 36b, .L_fixup_handle_s0
254 _asm_extable 37b, .L_fixup_handle_s0
255 _asm_extable 38b, .L_fixup_handle_s0
256 _asm_extable 39b, .L_fixup_handle_s0
257 _asm_extable 40b, .L_fixup_handle_s0
258 _asm_extable 41b, .L_fixup_handle_s2
259 _asm_extable 42b, .L_fixup_handle_s0
260 _asm_extable 43b, .L_fixup_handle_s0
261 _asm_extable 44b, .L_fixup_handle_s0
262 _asm_extable 45b, .L_fixup_handle_s0
263 _asm_extable 46b, .L_fixup_handle_s0
264 _asm_extable 47b, .L_fixup_handle_s4
265 _asm_extable 48b, .L_fixup_handle_s0
266 _asm_extable 49b, .L_fixup_handle_s0
267 _asm_extable 50b, .L_fixup_handle_s0
268 _asm_extable 51b, .L_fixup_handle_s4
269 _asm_extable 52b, .L_fixup_handle_s0
270 _asm_extable 53b, .L_fixup_handle_s0
271 _asm_extable 54b, .L_fixup_handle_s0
272 _asm_extable 55b, .L_fixup_handle_s4
273 _asm_extable 56b, .L_fixup_handle_s0
274 _asm_extable 57b, .L_fixup_handle_s0
275 SYM_FUNC_END(__copy_user_fast)