blob: aeafc03e961a822c82772a060350fd7728de1de4 [file] [log] [blame]
David Brazdil0f672f62019-12-10 10:32:29 +00001/* SPDX-License-Identifier: GPL-2.0-only */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002/*
3 * Based on arch/arm/lib/clear_user.S
4 *
5 * Copyright (C) 2012 ARM Ltd.
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00006 */
7#include <linux/linkage.h>
8
9#include <asm/asm-uaccess.h>
David Brazdil0f672f62019-12-10 10:32:29 +000010#include <asm/assembler.h>
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000011
12 .text
13
14/* Prototype: int __arch_clear_user(void *addr, size_t sz)
15 * Purpose : clear some user memory
16 * Params : addr - user memory address to clear
17 * : sz - number of bytes to clear
18 * Returns : number of bytes NOT cleared
19 *
20 * Alignment fixed up by hardware.
21 */
22ENTRY(__arch_clear_user)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000023 mov x2, x1 // save the size for fixup return
24 subs x1, x1, #8
25 b.mi 2f
261:
27uao_user_alternative 9f, str, sttr, xzr, x0, 8
28 subs x1, x1, #8
29 b.pl 1b
302: adds x1, x1, #4
31 b.mi 3f
32uao_user_alternative 9f, str, sttr, wzr, x0, 4
33 sub x1, x1, #4
343: adds x1, x1, #2
35 b.mi 4f
36uao_user_alternative 9f, strh, sttrh, wzr, x0, 2
37 sub x1, x1, #2
384: adds x1, x1, #1
39 b.mi 5f
40uao_user_alternative 9f, strb, sttrb, wzr, x0, 0
415: mov x0, #0
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000042 ret
43ENDPROC(__arch_clear_user)
David Brazdil0f672f62019-12-10 10:32:29 +000044EXPORT_SYMBOL(__arch_clear_user)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000045
46 .section .fixup,"ax"
47 .align 2
489: mov x0, x2 // return the original size
49 ret
50 .previous