xref: /linux/arch/loongarch/lib/clear_user.S (revision 559671e04a33b183b6e65fd585ab2e2a0578208b)
1*559671e0SHuacai Chen/* SPDX-License-Identifier: GPL-2.0 */
2*559671e0SHuacai Chen/*
3*559671e0SHuacai Chen * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
4*559671e0SHuacai Chen */
5*559671e0SHuacai Chen
6*559671e0SHuacai Chen#include <asm/asm.h>
7*559671e0SHuacai Chen#include <asm/asmmacro.h>
8*559671e0SHuacai Chen#include <asm/export.h>
9*559671e0SHuacai Chen#include <asm/regdef.h>
10*559671e0SHuacai Chen
11*559671e0SHuacai Chen.macro fixup_ex from, to, offset, fix
12*559671e0SHuacai Chen.if \fix
13*559671e0SHuacai Chen	.section .fixup, "ax"
14*559671e0SHuacai Chen\to:	addi.d	a0, a1, \offset
15*559671e0SHuacai Chen	jr	ra
16*559671e0SHuacai Chen	.previous
17*559671e0SHuacai Chen.endif
18*559671e0SHuacai Chen	.section __ex_table, "a"
19*559671e0SHuacai Chen	PTR	\from\()b, \to\()b
20*559671e0SHuacai Chen	.previous
21*559671e0SHuacai Chen.endm
22*559671e0SHuacai Chen
23*559671e0SHuacai Chen/*
24*559671e0SHuacai Chen * unsigned long __clear_user(void *addr, size_t size)
25*559671e0SHuacai Chen *
26*559671e0SHuacai Chen * a0: addr
27*559671e0SHuacai Chen * a1: size
28*559671e0SHuacai Chen */
29*559671e0SHuacai ChenSYM_FUNC_START(__clear_user)
30*559671e0SHuacai Chen	beqz	a1, 2f
31*559671e0SHuacai Chen
32*559671e0SHuacai Chen1:	st.b	zero, a0, 0
33*559671e0SHuacai Chen	addi.d	a0, a0, 1
34*559671e0SHuacai Chen	addi.d	a1, a1, -1
35*559671e0SHuacai Chen	bgt	a1, zero, 1b
36*559671e0SHuacai Chen
37*559671e0SHuacai Chen2:	move	a0, a1
38*559671e0SHuacai Chen	jr	ra
39*559671e0SHuacai Chen
40*559671e0SHuacai Chen	fixup_ex 1, 3, 0, 1
41*559671e0SHuacai ChenSYM_FUNC_END(__clear_user)
42*559671e0SHuacai Chen
43*559671e0SHuacai ChenEXPORT_SYMBOL(__clear_user)
44