xref: /openbmc/linux/arch/loongarch/lib/clear_user.S (revision 1fdb9a92)
1559671e0SHuacai Chen/* SPDX-License-Identifier: GPL-2.0 */
2559671e0SHuacai Chen/*
3559671e0SHuacai Chen * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
4559671e0SHuacai Chen */
5559671e0SHuacai Chen
6559671e0SHuacai Chen#include <asm/asm.h>
7559671e0SHuacai Chen#include <asm/asmmacro.h>
8559671e0SHuacai Chen#include <asm/export.h>
9559671e0SHuacai Chen#include <asm/regdef.h>
10559671e0SHuacai Chen
11559671e0SHuacai Chen.macro fixup_ex from, to, offset, fix
12559671e0SHuacai Chen.if \fix
13559671e0SHuacai Chen	.section .fixup, "ax"
14559671e0SHuacai Chen\to:	addi.d	a0, a1, \offset
15559671e0SHuacai Chen	jr	ra
16559671e0SHuacai Chen	.previous
17559671e0SHuacai Chen.endif
18559671e0SHuacai Chen	.section __ex_table, "a"
19559671e0SHuacai Chen	PTR	\from\()b, \to\()b
20559671e0SHuacai Chen	.previous
21559671e0SHuacai Chen.endm
22559671e0SHuacai Chen
23559671e0SHuacai Chen/*
24559671e0SHuacai Chen * unsigned long __clear_user(void *addr, size_t size)
25559671e0SHuacai Chen *
26559671e0SHuacai Chen * a0: addr
27559671e0SHuacai Chen * a1: size
28559671e0SHuacai Chen */
29559671e0SHuacai ChenSYM_FUNC_START(__clear_user)
30559671e0SHuacai Chen	beqz	a1, 2f
31559671e0SHuacai Chen
32559671e0SHuacai Chen1:	st.b	zero, a0, 0
33559671e0SHuacai Chen	addi.d	a0, a0, 1
34559671e0SHuacai Chen	addi.d	a1, a1, -1
35*1fdb9a92SWANG Xuerui	bgtz	a1, 1b
36559671e0SHuacai Chen
37559671e0SHuacai Chen2:	move	a0, a1
38559671e0SHuacai Chen	jr	ra
39559671e0SHuacai Chen
40559671e0SHuacai Chen	fixup_ex 1, 3, 0, 1
41559671e0SHuacai ChenSYM_FUNC_END(__clear_user)
42559671e0SHuacai Chen
43559671e0SHuacai ChenEXPORT_SYMBOL(__clear_user)
44