/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (C) 2020-2022 Loongson Technology Corporation Limited
*/
#include <linux/export.h>
#include <asm/alternative-asm.h>
#include <asm/asm.h>
#include <asm/asmmacro.h>
#include <asm/asm-extable.h>
#include <asm/cpu.h>
#include <asm/regdef.h>
#include <asm/unwind_hints.h>
SYM_FUNC_START(__clear_user)
/*
* Some CPUs support hardware unaligned access
*/
ALTERNATIVE "b __clear_user_generic" , \
"b __clear_user_fast" , CPU_FEATURE_UAL
SYM_FUNC_END(__clear_user)
EXPORT_SYMBOL(__clear_user)
/*
* unsigned long __clear_user_generic(void *addr, size_t size)
*
* a0: addr
* a1: size
*/
SYM_FUNC_START(__clear_user_generic)
beqz a1, 2 f
1 : st .b zero, a0, 0
addi.d a0, a0, 1
addi.d a1, a1, -1
bgtz a1, 1 b
2 : move a0, a1
jr ra
_asm_extable 1 b, 2 b
SYM_FUNC_END(__clear_user_generic)
/*
* unsigned long __clear_user_fast(void *addr, unsigned long size)
*
* a0: addr
* a1: size
*/
SYM_FUNC_START(__clear_user_fast)
sltui t0, a1, 9
bnez t0, .Lsmall
add.d a2, a0, a1
0 : st .d zero, a0, 0
/* align up address */
addi.d a0, a0, 8
bstrins.d a0, zero, 2 , 0
addi.d a3, a2, -64
bgeu a0, a3, .Llt64
/* set 64 bytes at a time */
.Lloop64:
1 : st .d zero, a0, 0
2 : st .d zero, a0, 8
3 : st .d zero, a0, 16
4 : st .d zero, a0, 24
5 : st .d zero, a0, 32
6 : st .d zero, a0, 40
7 : st .d zero, a0, 48
8 : st .d zero, a0, 56
addi.d a0, a0, 64
bltu a0, a3, .Lloop64
/* set the remaining bytes */
.Llt64:
addi.d a3, a2, -32
bgeu a0, a3, .Llt32
9 : st .d zero, a0, 0
10 : st .d zero, a0, 8
11 : st .d zero, a0, 16
12 : st .d zero, a0, 24
addi.d a0, a0, 32
.Llt32:
addi.d a3, a2, -16
bgeu a0, a3, .Llt16
13 : st .d zero, a0, 0
14 : st .d zero, a0, 8
addi.d a0, a0, 16
.Llt16:
addi.d a3, a2, -8
bgeu a0, a3, .Llt8
15 : st .d zero, a0, 0
addi.d a0, a0, 8
.Llt8:
16 : st .d zero, a2, -8
/* return */
move a0, zero
jr ra
.align 4
.Lsmall:
pcaddi t0, 4
slli.d a2, a1, 4
add.d t0, t0, a2
jr t0
.align 4
move a0, zero
jr ra
.align 4
17 : st .b zero, a0, 0
move a0, zero
jr ra
.align 4
18 : st .h zero, a0, 0
move a0, zero
jr ra
.align 4
19 : st .h zero, a0, 0
20 : st .b zero, a0, 2
move a0, zero
jr ra
.align 4
21 : st .w zero, a0, 0
move a0, zero
jr ra
.align 4
22 : st .w zero, a0, 0
23 : st .b zero, a0, 4
move a0, zero
jr ra
.align 4
24 : st .w zero, a0, 0
25 : st .h zero, a0, 4
move a0, zero
jr ra
.align 4
26 : st .w zero, a0, 0
27 : st .w zero, a0, 3
move a0, zero
jr ra
.align 4
28 : st .d zero, a0, 0
move a0, zero
jr ra
/* fixup and ex_table */
.Llarge_fixup:
sub .d a1, a2, a0
.Lsmall_fixup:
29 : st .b zero, a0, 0
addi.d a0, a0, 1
addi.d a1, a1, -1
bgt a1, zero, 29 b
.Lexit:
move a0, a1
jr ra
_asm_extable 0 b, .Lsmall_fixup
_asm_extable 1 b, .Llarge_fixup
_asm_extable 2 b, .Llarge_fixup
_asm_extable 3 b, .Llarge_fixup
_asm_extable 4 b, .Llarge_fixup
_asm_extable 5 b, .Llarge_fixup
_asm_extable 6 b, .Llarge_fixup
_asm_extable 7 b, .Llarge_fixup
_asm_extable 8 b, .Llarge_fixup
_asm_extable 9 b, .Llarge_fixup
_asm_extable 10 b, .Llarge_fixup
_asm_extable 11 b, .Llarge_fixup
_asm_extable 12 b, .Llarge_fixup
_asm_extable 13 b, .Llarge_fixup
_asm_extable 14 b, .Llarge_fixup
_asm_extable 15 b, .Llarge_fixup
_asm_extable 16 b, .Llarge_fixup
_asm_extable 17 b, .Lexit
_asm_extable 18 b, .Lsmall_fixup
_asm_extable 19 b, .Lsmall_fixup
_asm_extable 20 b, .Lsmall_fixup
_asm_extable 21 b, .Lsmall_fixup
_asm_extable 22 b, .Lsmall_fixup
_asm_extable 23 b, .Lsmall_fixup
_asm_extable 24 b, .Lsmall_fixup
_asm_extable 25 b, .Lsmall_fixup
_asm_extable 26 b, .Lsmall_fixup
_asm_extable 27 b, .Lsmall_fixup
_asm_extable 28 b, .Lsmall_fixup
_asm_extable 29 b, .Lexit
SYM_FUNC_END(__clear_user_fast)
STACK_FRAME_NON_STANDARD __clear_user_fast
Messung V0.5 in Prozent C=97 H=82 G=89
¤ Dauer der Verarbeitung: 0.8 Sekunden
(vorverarbeitet am 2026-06-07)
¤
*© Formatika GbR, Deutschland