Brooklyn/arch/arm64/lib/clear_user.S

51 lines
1.1 KiB
ArmAsm
Raw Normal View History

2021-05-27 00:09:36 +05:00
/* SPDX-License-Identifier: GPL-2.0-only */
/*
2021-09-23 21:59:15 +05:00
* Based on arch/arm/lib/clear_user.S
*
* Copyright (C) 2012 ARM Ltd.
2021-05-27 00:09:36 +05:00
*/
#include <linux/linkage.h>
2021-09-23 21:59:15 +05:00
#include <asm/asm-uaccess.h>
2021-05-27 00:09:36 +05:00
#include <asm/assembler.h>
.text
/* Prototype: int __arch_clear_user(void *addr, size_t sz)
* Purpose : clear some user memory
* Params : addr - user memory address to clear
* : sz - number of bytes to clear
* Returns : number of bytes NOT cleared
*
* Alignment fixed up by hardware.
*/
SYM_FUNC_START(__arch_clear_user)
2021-09-23 21:59:15 +05:00
mov x2, x1 // save the size for fixup return
2021-05-27 00:09:36 +05:00
subs x1, x1, #8
b.mi 2f
1:
2021-09-23 21:59:15 +05:00
uao_user_alternative 9f, str, sttr, xzr, x0, 8
2021-05-27 00:09:36 +05:00
subs x1, x1, #8
2021-09-23 21:59:15 +05:00
b.pl 1b
2: adds x1, x1, #4
b.mi 3f
uao_user_alternative 9f, str, sttr, wzr, x0, 4
sub x1, x1, #4
3: adds x1, x1, #2
b.mi 4f
uao_user_alternative 9f, strh, sttrh, wzr, x0, 2
sub x1, x1, #2
4: adds x1, x1, #1
b.mi 5f
uao_user_alternative 9f, strb, sttrb, wzr, x0, 0
2021-05-27 00:09:36 +05:00
5: mov x0, #0
ret
SYM_FUNC_END(__arch_clear_user)
EXPORT_SYMBOL(__arch_clear_user)
.section .fixup,"ax"
.align 2
2021-09-23 21:59:15 +05:00
9: mov x0, x2 // return the original size
2021-05-27 00:09:36 +05:00
ret
.previous