1 /* SPDX-License-Identifier: GPL-2.0-only */ !! 1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 2 /* 3 * linux/arch/arm/lib/clear_user.S !! 3 * arch/alpha/lib/clear_user.S >> 4 * Contributed by Richard Henderson <rth@tamu.edu> 4 * 5 * 5 * Copyright (C) 1995, 1996,1997,1998 Russell !! 6 * Zero user space, handling exceptions as we go. 6 */ !! 7 * 7 #include <linux/linkage.h> !! 8 * We have to make sure that $0 is always up-to-date and contains the 8 #include <asm/assembler.h> !! 9 * right "bytes left to zero" value (and that it is updated only _after_ 9 #include <asm/unwind.h> !! 10 * a successful copy). There is also some rather minor exception setup 10 !! 11 * stuff. 11 .text << 12 << 13 /* Prototype: unsigned long arm_clear_user(voi << 14 * Purpose : clear some user memory << 15 * Params : addr - user memory address to cl << 16 * : sz - number of bytes to clear << 17 * Returns : number of bytes NOT cleared << 18 */ 12 */ 19 ENTRY(__clear_user_std) !! 13 #include <linux/export.h> 20 WEAK(arm_clear_user) !! 14 21 UNWIND(.fnstart) !! 15 /* Allow an exception for an insn; exit if we get one. */ 22 UNWIND(.save {r1, lr}) !! 16 #define EX(x,y...) \ 23 stmfd sp!, {r1, lr} !! 17 99: x,##y; \ 24 mov r2, #0 !! 18 .section __ex_table,"a"; \ 25 cmp r1, #4 !! 19 .long 99b - .; \ 26 blt 2f !! 20 lda $31, $exception-99b($31); \ 27 ands ip, r0, #3 !! 21 .previous 28 beq 1f !! 22 29 cmp ip, #2 !! 23 .set noat 30 strusr r2, r0, 1 !! 24 .set noreorder 31 strusr r2, r0, 1, le !! 25 .align 4 32 strusr r2, r0, 1, lt !! 26 33 rsb ip, ip, #4 !! 27 .globl __clear_user 34 sub r1, r1, ip !! 28 .ent __clear_user 35 1: subs r1, r1, #8 !! 29 .frame $30, 0, $26 36 strusr r2, r0, 4, pl, rept=2 !! 30 .prologue 0 37 bpl 1b !! 31 38 adds r1, r1, #4 !! 32 $loop: 39 strusr r2, r0, 4, pl !! 33 and $1, 3, $4 # e0 : 40 2: tst r1, #2 !! 34 beq $4, 1f # .. e1 : 41 strusr r2, r0, 1, ne, rept=2 !! 35 42 tst r1, #1 !! 36 0: EX( stq_u $31, 0($16) ) # e0 : zero one word 43 it ne !! 37 subq $0, 8, $0 # .. e1 : 44 USER( strbtne r2, [r0]) !! 38 subq $4, 1, $4 # e0 : 45 mov r0, #0 !! 39 addq $16, 8, $16 # .. e1 : 46 ldmfd sp!, {r1, pc} !! 40 bne $4, 0b # e1 : 47 UNWIND(.fnend) !! 41 unop # : 48 ENDPROC(arm_clear_user) !! 42 49 ENDPROC(__clear_user_std) !! 43 1: bic $1, 3, $1 # e0 : 50 !! 44 beq $1, $tail # .. e1 : 51 .pushsection .text.fixup,"ax" !! 45 52 .align 0 !! 46 2: EX( stq_u $31, 0($16) ) # e0 : zero four words 53 9001: ldmfd sp!, {r0, pc} !! 47 subq $0, 8, $0 # .. e1 : 54 .popsection !! 48 EX( stq_u $31, 8($16) ) # e0 : >> 49 subq $0, 8, $0 # .. e1 : >> 50 EX( stq_u $31, 16($16) ) # e0 : >> 51 subq $0, 8, $0 # .. e1 : >> 52 EX( stq_u $31, 24($16) ) # e0 : >> 53 subq $0, 8, $0 # .. e1 : >> 54 subq $1, 4, $1 # e0 : >> 55 addq $16, 32, $16 # .. e1 : >> 56 bne $1, 2b # e1 : >> 57 >> 58 $tail: >> 59 bne $2, 1f # e1 : is there a tail to do? >> 60 ret $31, ($26), 1 # .. e1 : >> 61 >> 62 1: EX( ldq_u $5, 0($16) ) # e0 : >> 63 clr $0 # .. e1 : >> 64 nop # e1 : >> 65 mskqh $5, $0, $5 # e0 : >> 66 EX( stq_u $5, 0($16) ) # e0 : >> 67 ret $31, ($26), 1 # .. e1 : >> 68 >> 69 __clear_user: >> 70 and $17, $17, $0 >> 71 and $16, 7, $4 # e0 : find dest misalignment >> 72 beq $0, $zerolength # .. e1 : >> 73 addq $0, $4, $1 # e0 : bias counter >> 74 and $1, 7, $2 # e1 : number of bytes in tail >> 75 srl $1, 3, $1 # e0 : >> 76 beq $4, $loop # .. e1 : >> 77 >> 78 EX( ldq_u $5, 0($16) ) # e0 : load dst word to mask back in >> 79 beq $1, $oneword # .. e1 : sub-word store? >> 80 >> 81 mskql $5, $16, $5 # e0 : take care of misaligned head >> 82 addq $16, 8, $16 # .. e1 : >> 83 EX( stq_u $5, -8($16) ) # e0 : >> 84 addq $0, $4, $0 # .. e1 : bytes left -= 8 - misalignment >> 85 subq $1, 1, $1 # e0 : >> 86 subq $0, 8, $0 # .. e1 : >> 87 br $loop # e1 : >> 88 unop # : >> 89 >> 90 $oneword: >> 91 mskql $5, $16, $4 # e0 : >> 92 mskqh $5, $2, $5 # e0 : >> 93 or $5, $4, $5 # e1 : >> 94 EX( stq_u $5, 0($16) ) # e0 : >> 95 clr $0 # .. e1 : >> 96 >> 97 $zerolength: >> 98 $exception: >> 99 ret $31, ($26), 1 # .. e1 : 55 100 >> 101 .end __clear_user >> 102 EXPORT_SYMBOL(__clear_user)
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.