/* SPDX-License-Identifier: GPL-2.0-only */1/*2* Copyright (C) 2021 Arm Ltd.3*/45#include <linux/linkage.h>6#include <asm/asm-uaccess.h>78.text910/* Prototype: int __arch_clear_user(void *addr, size_t sz)11* Purpose : clear some user memory12* Params : addr - user memory address to clear13* : sz - number of bytes to clear14* Returns : number of bytes NOT cleared15*16* Alignment fixed up by hardware.17*/1819SYM_FUNC_START(__arch_clear_user)20add x2, x0, x12122#ifdef CONFIG_AS_HAS_MOPS23.arch_extension mops24alternative_if_not ARM64_HAS_MOPS25b .Lno_mops26alternative_else_nop_endif2728USER(9f, setpt [x0]!, x1!, xzr)29USER(6f, setmt [x0]!, x1!, xzr)30USER(6f, setet [x0]!, x1!, xzr)31mov x0, #032ret33.Lno_mops:34#endif3536subs x1, x1, #837b.mi 2f38391: .p2align 440USER(9f, sttr xzr, [x0])41add x0, x0, #842subs x1, x1, #843b.hi 1b44USER(9f, sttr xzr, [x2, #-8])45mov x0, #046ret47482: tbz x1, #2, 3f49USER(9f, sttr wzr, [x0])50USER(8f, sttr wzr, [x2, #-4])51mov x0, #052ret53543: tbz x1, #1, 4f55USER(9f, sttrh wzr, [x0])564: tbz x1, #0, 5f57USER(7f, sttrb wzr, [x2, #-1])585: mov x0, #059ret6061// Exception fixups626: b.cs 9f63// Registers are in Option A format64add x0, x0, x165b 9f667: sub x0, x2, #5 // Adjust for faulting on the final byte...678: add x0, x0, #4 // ...or the second word of the 4-7 byte case689: sub x0, x2, x069ret70SYM_FUNC_END(__arch_clear_user)71EXPORT_SYMBOL(__arch_clear_user)727374