xref: /openbmc/linux/arch/arm64/lib/clear_user.S (revision 3ac0f452)
1caab277bSThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-only */
20aea86a2SCatalin Marinas/*
30aea86a2SCatalin Marinas * Based on arch/arm/lib/clear_user.S
40aea86a2SCatalin Marinas *
50aea86a2SCatalin Marinas * Copyright (C) 2012 ARM Ltd.
60aea86a2SCatalin Marinas */
70aea86a2SCatalin Marinas#include <linux/linkage.h>
8338d4f49SJames Morse
9b4b8664dSAl Viro#include <asm/asm-uaccess.h>
1056c08ec5SMark Rutland#include <asm/assembler.h>
110aea86a2SCatalin Marinas
120aea86a2SCatalin Marinas	.text
130aea86a2SCatalin Marinas
14f71c2ffcSWill Deacon/* Prototype: int __arch_clear_user(void *addr, size_t sz)
150aea86a2SCatalin Marinas * Purpose  : clear some user memory
160aea86a2SCatalin Marinas * Params   : addr - user memory address to clear
170aea86a2SCatalin Marinas *          : sz   - number of bytes to clear
180aea86a2SCatalin Marinas * Returns  : number of bytes NOT cleared
190aea86a2SCatalin Marinas *
200aea86a2SCatalin Marinas * Alignment fixed up by hardware.
210aea86a2SCatalin Marinas */
223ac0f452SMark BrownSYM_FUNC_START(__arch_clear_user)
230aea86a2SCatalin Marinas	mov	x2, x1			// save the size for fixup return
240aea86a2SCatalin Marinas	subs	x1, x1, #8
250aea86a2SCatalin Marinas	b.mi	2f
260aea86a2SCatalin Marinas1:
2757f4959bSJames Morseuao_user_alternative 9f, str, sttr, xzr, x0, 8
280aea86a2SCatalin Marinas	subs	x1, x1, #8
290aea86a2SCatalin Marinas	b.pl	1b
300aea86a2SCatalin Marinas2:	adds	x1, x1, #4
310aea86a2SCatalin Marinas	b.mi	3f
3257f4959bSJames Morseuao_user_alternative 9f, str, sttr, wzr, x0, 4
330aea86a2SCatalin Marinas	sub	x1, x1, #4
340aea86a2SCatalin Marinas3:	adds	x1, x1, #2
350aea86a2SCatalin Marinas	b.mi	4f
3657f4959bSJames Morseuao_user_alternative 9f, strh, sttrh, wzr, x0, 2
370aea86a2SCatalin Marinas	sub	x1, x1, #2
380aea86a2SCatalin Marinas4:	adds	x1, x1, #1
390aea86a2SCatalin Marinas	b.mi	5f
4057f4959bSJames Morseuao_user_alternative 9f, strb, sttrb, wzr, x0, 0
410aea86a2SCatalin Marinas5:	mov	x0, #0
420aea86a2SCatalin Marinas	ret
433ac0f452SMark BrownSYM_FUNC_END(__arch_clear_user)
4456c08ec5SMark RutlandEXPORT_SYMBOL(__arch_clear_user)
450aea86a2SCatalin Marinas
460aea86a2SCatalin Marinas	.section .fixup,"ax"
470aea86a2SCatalin Marinas	.align	2
480aea86a2SCatalin Marinas9:	mov	x0, x2			// return the original size
490aea86a2SCatalin Marinas	ret
500aea86a2SCatalin Marinas	.previous
51