| 1 | /* SPDX-License-Identifier: GPL-2.0 */
|
| 2 | /*
|
| 3 | * arch/alpha/lib/clear_user.S
|
| 4 | * Contributed by Richard Henderson <rth@tamu.edu>
|
| 5 | *
|
| 6 | * Zero user space, handling exceptions as we go.
|
| 7 | *
|
| 8 | * We have to make sure that $0 is always up-to-date and contains the
|
| 9 | * right "bytes left to zero" value (and that it is updated only _after_
|
| 10 | * a successful copy). There is also some rather minor exception setup
|
| 11 | * stuff.
|
| 12 | */
|
| 13 | |
| 14 |
|
| 15 | /* Allow an exception for an insn; exit if we get one. */
|
| 16 | |
| 17 | 99: x, |
| 18 | .section __ex_table,"a"; \
|
| 19 | .long 99b - .; \
|
| 20 | lda $31, $exception-99b($31); \
|
| 21 | .previous
|
| 22 |
|
| 23 | .set noat
|
| 24 | .set noreorder
|
| 25 | .align 4
|
| 26 |
|
| 27 | .globl __clear_user
|
| 28 | .ent __clear_user
|
| 29 | .frame $30, 0, $26
|
| 30 | .prologue 0
|
| 31 |
|
| 32 | $loop:
|
| 33 | and $1, 3, $4 |
| 34 | beq $4, 1f |
| 35 |
|
| 36 | 0: EX( stq_u $31, 0($16) ) |
| 37 | subq $0, 8, $0 |
| 38 | subq $4, 1, $4 |
| 39 | addq $16, 8, $16 |
| 40 | bne $4, 0b |
| 41 | unop |
| 42 |
|
| 43 | 1: bic $1, 3, $1 |
| 44 | beq $1, $tail |
| 45 |
|
| 46 | 2: EX( stq_u $31, 0($16) ) |
| 47 | subq $0, 8, $0 |
| 48 | EX( stq_u $31, 8($16) ) |
| 49 | subq $0, 8, $0 |
| 50 | EX( stq_u $31, 16($16) ) |
| 51 | subq $0, 8, $0 |
| 52 | EX( stq_u $31, 24($16) ) |
| 53 | subq $0, 8, $0 |
| 54 | subq $1, 4, $1 |
| 55 | addq $16, 32, $16 |
| 56 | bne $1, 2b |
| 57 |
|
| 58 | $tail:
|
| 59 | bne $2, 1f |
| 60 | ret $31, ($26), 1 |
| 61 |
|
| 62 | 1: EX( ldq_u $5, 0($16) ) |
| 63 | clr $0 |
| 64 | nop |
| 65 | mskqh $5, $0, $5 |
| 66 | EX( stq_u $5, 0($16) ) |
| 67 | ret $31, ($26), 1 |
| 68 |
|
| 69 | __clear_user:
|
| 70 | and $17, $17, $0
|
| 71 | and $16, 7, $4 |
| 72 | beq $0, $zerolength |
| 73 | addq $0, $4, $1 |
| 74 | and $1, 7, $2 |
| 75 | srl $1, 3, $1 |
| 76 | beq $4, $loop |
| 77 |
|
| 78 | EX( ldq_u $5, 0($16) ) |
| 79 | beq $1, $oneword |
| 80 |
|
| 81 | mskql $5, $16, $5 |
| 82 | addq $16, 8, $16 |
| 83 | EX( stq_u $5, -8($16) ) |
| 84 | addq $0, $4, $0 |
| 85 | subq $1, 1, $1 |
| 86 | subq $0, 8, $0 |
| 87 | br $loop |
| 88 | unop |
| 89 |
|
| 90 | $oneword:
|
| 91 | mskql $5, $16, $4 |
| 92 | mskqh $5, $2, $5 |
| 93 | or $5, $4, $5 |
| 94 | EX( stq_u $5, 0($16) ) |
| 95 | clr $0 |
| 96 |
|
| 97 | $zerolength:
|
| 98 | $exception:
|
| 99 | ret $31, ($26), 1 |
| 100 |
|
| 101 | .end __clear_user
|
| 102 | EXPORT_SYMBOL(__clear_user)
|