Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
1da177e4 LT |
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. | |
1da177e4 | 12 | */ |
00fc0e0d | 13 | #include <asm/export.h> |
1da177e4 LT |
14 | |
15 | /* Allow an exception for an insn; exit if we get one. */ | |
16 | #define EX(x,y...) \ | |
17 | 99: x,##y; \ | |
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 | ||
85250231 AV |
27 | .globl __clear_user |
28 | .ent __clear_user | |
29 | .frame $30, 0, $26 | |
1da177e4 LT |
30 | .prologue 0 |
31 | ||
32 | $loop: | |
33 | and $1, 3, $4 # e0 : | |
34 | beq $4, 1f # .. e1 : | |
35 | ||
85250231 | 36 | 0: EX( stq_u $31, 0($16) ) # e0 : zero one word |
1da177e4 LT |
37 | subq $0, 8, $0 # .. e1 : |
38 | subq $4, 1, $4 # e0 : | |
85250231 | 39 | addq $16, 8, $16 # .. e1 : |
1da177e4 LT |
40 | bne $4, 0b # e1 : |
41 | unop # : | |
42 | ||
43 | 1: bic $1, 3, $1 # e0 : | |
44 | beq $1, $tail # .. e1 : | |
45 | ||
85250231 | 46 | 2: EX( stq_u $31, 0($16) ) # e0 : zero four words |
1da177e4 | 47 | subq $0, 8, $0 # .. e1 : |
85250231 | 48 | EX( stq_u $31, 8($16) ) # e0 : |
1da177e4 | 49 | subq $0, 8, $0 # .. e1 : |
85250231 | 50 | EX( stq_u $31, 16($16) ) # e0 : |
1da177e4 | 51 | subq $0, 8, $0 # .. e1 : |
85250231 | 52 | EX( stq_u $31, 24($16) ) # e0 : |
1da177e4 LT |
53 | subq $0, 8, $0 # .. e1 : |
54 | subq $1, 4, $1 # e0 : | |
85250231 | 55 | addq $16, 32, $16 # .. e1 : |
1da177e4 LT |
56 | bne $1, 2b # e1 : |
57 | ||
58 | $tail: | |
59 | bne $2, 1f # e1 : is there a tail to do? | |
85250231 | 60 | ret $31, ($26), 1 # .. e1 : |
1da177e4 | 61 | |
85250231 | 62 | 1: EX( ldq_u $5, 0($16) ) # e0 : |
1da177e4 LT |
63 | clr $0 # .. e1 : |
64 | nop # e1 : | |
65 | mskqh $5, $0, $5 # e0 : | |
85250231 AV |
66 | EX( stq_u $5, 0($16) ) # e0 : |
67 | ret $31, ($26), 1 # .. e1 : | |
1da177e4 | 68 | |
85250231 AV |
69 | __clear_user: |
70 | and $17, $17, $0 | |
71 | and $16, 7, $4 # e0 : find dest misalignment | |
1da177e4 LT |
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 | ||
85250231 | 78 | EX( ldq_u $5, 0($16) ) # e0 : load dst word to mask back in |
1da177e4 LT |
79 | beq $1, $oneword # .. e1 : sub-word store? |
80 | ||
85250231 AV |
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 : | |
1da177e4 LT |
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: | |
85250231 | 91 | mskql $5, $16, $4 # e0 : |
1da177e4 LT |
92 | mskqh $5, $2, $5 # e0 : |
93 | or $5, $4, $5 # e1 : | |
85250231 | 94 | EX( stq_u $5, 0($16) ) # e0 : |
1da177e4 LT |
95 | clr $0 # .. e1 : |
96 | ||
97 | $zerolength: | |
98 | $exception: | |
85250231 | 99 | ret $31, ($26), 1 # .. e1 : |
1da177e4 | 100 | |
85250231 AV |
101 | .end __clear_user |
102 | EXPORT_SYMBOL(__clear_user) |