| 1 | /* SPDX-License-Identifier: GPL-2.0-only */
|
| 2 | /*
|
| 3 | * linux/arch/arm/lib/clear_user.S
|
| 4 | *
|
| 5 | * Copyright (C) 1995, 1996,1997,1998 Russell King
|
| 6 | */
|
| 7 | |
| 8 | |
| 9 | |
| 10 |
|
| 11 | .text
|
| 12 |
|
| 13 | /* Prototype: unsigned long arm_clear_user(void *addr, size_t sz)
|
| 14 | * Purpose : clear some user memory
|
| 15 | * Params : addr - user memory address to clear
|
| 16 | * : sz - number of bytes to clear
|
| 17 | * Returns : number of bytes NOT cleared
|
| 18 | */
|
| 19 | ENTRY(__clear_user_std)
|
| 20 | WEAK(arm_clear_user)
|
| 21 | UNWIND(.fnstart)
|
| 22 | UNWIND(.save {r1, lr})
|
| 23 | stmfd sp!, {r1, lr}
|
| 24 | mov r2, |
| 25 | cmp r1, |
| 26 | blt 2f
|
| 27 | ands ip, r0, |
| 28 | beq 1f
|
| 29 | cmp ip, |
| 30 | strusr r2, r0, 1
|
| 31 | strusr r2, r0, 1, le
|
| 32 | strusr r2, r0, 1, lt
|
| 33 | rsb ip, ip, |
| 34 | sub r1, r1, ip @ 7 6 5 4 3 2 1
|
| 35 | 1: subs r1, r1, |
| 36 | strusr r2, r0, 4, pl, rept=2
|
| 37 | bpl 1b
|
| 38 | adds r1, r1, |
| 39 | strusr r2, r0, 4, pl
|
| 40 | 2: tst r1, |
| 41 | strusr r2, r0, 1, ne, rept=2
|
| 42 | tst r1, |
| 43 | it ne @ explicit IT needed for the label
|
| 44 | USER( strbtne r2, [r0])
|
| 45 | mov r0, |
| 46 | ldmfd sp!, {r1, pc}
|
| 47 | UNWIND(.fnend)
|
| 48 | ENDPROC(arm_clear_user)
|
| 49 | ENDPROC(__clear_user_std)
|
| 50 |
|
| 51 | .pushsection .text.fixup,"ax"
|
| 52 | .align 0
|
| 53 | 9001: ldmfd sp!, {r0, pc}
|
| 54 | .popsection
|
| 55 |
|