~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/sh/lib/copy_page.S

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /arch/sh/lib/copy_page.S (Architecture ppc) and /arch/alpha/lib/copy_page.S (Architecture alpha)


  1 /* SPDX-License-Identifier: GPL-2.0 */              1 /* SPDX-License-Identifier: GPL-2.0 */
  2 /*                                                  2 /*
  3  * copy_page, __copy_user_page, __copy_user im !!   3  * arch/alpha/lib/copy_page.S
  4  *                                                  4  *
  5  * Copyright (C) 2001  Niibe Yutaka & Kaz Koji !!   5  * Copy an entire page.
  6  * Copyright (C) 2002  Toshinobu Sugioka       << 
  7  * Copyright (C) 2006  Paul Mundt              << 
  8  */                                                 6  */
  9 #include <linux/linkage.h>                     !!   7 #include <linux/export.h>
 10 #include <asm/page.h>                          !!   8         .text
                                                   >>   9         .align 4
                                                   >>  10         .global copy_page
                                                   >>  11         .ent copy_page
                                                   >>  12 copy_page:
                                                   >>  13         .prologue 0
                                                   >>  14 
                                                   >>  15         lda     $18,128
                                                   >>  16         nop
                                                   >>  17         unop
                                                   >>  18         nop
                                                   >>  19 
                                                   >>  20 1:      ldq     $0,0($17)
                                                   >>  21         ldq     $1,8($17)
                                                   >>  22         ldq     $2,16($17)
                                                   >>  23         ldq     $3,24($17)
                                                   >>  24 
                                                   >>  25         ldq     $4,32($17)
                                                   >>  26         ldq     $5,40($17)
                                                   >>  27         ldq     $6,48($17)
                                                   >>  28         ldq     $7,56($17)
                                                   >>  29 
                                                   >>  30         stq     $0,0($16)
                                                   >>  31         subq    $18,1,$18
                                                   >>  32         stq     $1,8($16)
                                                   >>  33         addq    $17,64,$17
                                                   >>  34 
                                                   >>  35         stq     $2,16($16)
                                                   >>  36         stq     $3,24($16)
                                                   >>  37         stq     $4,32($16)
                                                   >>  38         stq     $5,40($16)
                                                   >>  39 
                                                   >>  40         stq     $6,48($16)
                                                   >>  41         stq     $7,56($16)
                                                   >>  42         addq    $16,64,$16
                                                   >>  43         bne     $18, 1b
                                                   >>  44 
                                                   >>  45         ret
                                                   >>  46         nop
                                                   >>  47         unop
                                                   >>  48         nop
 11                                                    49 
 12 /*                                             !!  50         .end copy_page
 13  * copy_page                                   !!  51         EXPORT_SYMBOL(copy_page)
 14  * @to: P1 address                             << 
 15  * @from: P1 address                           << 
 16  *                                             << 
 17  * void copy_page(void *to, void *from)        << 
 18  */                                            << 
 19                                                << 
 20 /*                                             << 
 21  * r0, r1, r2, r3, r4, r5, r6, r7 --- scratch  << 
 22  * r8 --- from + PAGE_SIZE                     << 
 23  * r9 --- not used                             << 
 24  * r10 --- to                                  << 
 25  * r11 --- from                                << 
 26  */                                            << 
 27 ENTRY(copy_page)                               << 
 28         mov.l   r8,@-r15                       << 
 29         mov.l   r10,@-r15                      << 
 30         mov.l   r11,@-r15                      << 
 31         mov     r4,r10                         << 
 32         mov     r5,r11                         << 
 33         mov     r5,r8                          << 
 34         mov     #(PAGE_SIZE >> 10), r0         << 
 35         shll8   r0                             << 
 36         shll2   r0                             << 
 37         add     r0,r8                          << 
 38         !                                      << 
 39 1:      mov.l   @r11+,r0                       << 
 40         mov.l   @r11+,r1                       << 
 41         mov.l   @r11+,r2                       << 
 42         mov.l   @r11+,r3                       << 
 43         mov.l   @r11+,r4                       << 
 44         mov.l   @r11+,r5                       << 
 45         mov.l   @r11+,r6                       << 
 46         mov.l   @r11+,r7                       << 
 47 #if defined(CONFIG_CPU_SH4)                    << 
 48         movca.l r0,@r10                        << 
 49 #else                                          << 
 50         mov.l   r0,@r10                        << 
 51 #endif                                         << 
 52         add     #32,r10                        << 
 53         mov.l   r7,@-r10                       << 
 54         mov.l   r6,@-r10                       << 
 55         mov.l   r5,@-r10                       << 
 56         mov.l   r4,@-r10                       << 
 57         mov.l   r3,@-r10                       << 
 58         mov.l   r2,@-r10                       << 
 59         mov.l   r1,@-r10                       << 
 60         cmp/eq  r11,r8                         << 
 61         bf/s    1b                             << 
 62          add    #28,r10                        << 
 63         !                                      << 
 64         mov.l   @r15+,r11                      << 
 65         mov.l   @r15+,r10                      << 
 66         mov.l   @r15+,r8                       << 
 67         rts                                    << 
 68          nop                                   << 
 69                                                << 
 70 /*                                             << 
 71  * __kernel_size_t __copy_user(void *to, const << 
 72  * Return the number of bytes NOT copied       << 
 73  */                                            << 
 74 #define EX(...)                 \              << 
 75         9999: __VA_ARGS__ ;             \      << 
 76         .section __ex_table, "a";       \      << 
 77         .long 9999b, 6000f      ;       \      << 
 78         .previous                              << 
 79 #define EX_NO_POP(...)                  \      << 
 80         9999: __VA_ARGS__ ;             \      << 
 81         .section __ex_table, "a";       \      << 
 82         .long 9999b, 6005f      ;       \      << 
 83         .previous                              << 
 84 ENTRY(__copy_user)                             << 
 85         ! Check if small number of bytes       << 
 86         mov     #11,r0                         << 
 87         mov     r4,r3                          << 
 88         cmp/gt  r0,r6           ! r6 (len) > r << 
 89         bf/s    .L_cleanup_loop_no_pop         << 
 90          add    r6,r3           ! last destina << 
 91                                                << 
 92         ! Calculate bytes needed to align to s << 
 93         mov.l   r11,@-r15                      << 
 94         neg     r5,r0                          << 
 95         mov.l   r10,@-r15                      << 
 96         add     #4,r0                          << 
 97         mov.l   r9,@-r15                       << 
 98         and     #3,r0                          << 
 99         mov.l   r8,@-r15                       << 
100         tst     r0,r0                          << 
101         bt      2f                             << 
102                                                << 
103 1:                                             << 
104         ! Copy bytes to long word align src    << 
105 EX(     mov.b   @r5+,r1         )              << 
106         dt      r0                             << 
107         add     #-1,r6                         << 
108 EX(     mov.b   r1,@r4          )              << 
109         bf/s    1b                             << 
110          add    #1,r4                          << 
111                                                << 
112         ! Jump to appropriate routine dependin << 
113 2:      mov     #3,r1                          << 
114         mov     r6, r2                         << 
115         and     r4,r1                          << 
116         shlr2   r2                             << 
117         shll2   r1                             << 
118         mova    .L_jump_tbl,r0                 << 
119         mov.l   @(r0,r1),r1                    << 
120         jmp     @r1                            << 
121          nop                                   << 
122                                                << 
123         .align 2                               << 
124 .L_jump_tbl:                                   << 
125         .long   .L_dest00                      << 
126         .long   .L_dest01                      << 
127         .long   .L_dest10                      << 
128         .long   .L_dest11                      << 
129                                                << 
130 /*                                             << 
131  * Come here if there are less than 12 bytes t << 
132  *                                             << 
133  * Keep the branch target close, so the bf/s c << 
134  * and result in a more expensive branch being << 
135  * fast-path for small copies, the jump via th << 
136  * default slow-path cleanup. -PFM.            << 
137  */                                            << 
138 .L_cleanup_loop_no_pop:                        << 
139         tst     r6,r6           ! Check explic << 
140         bt      1f                             << 
141                                                << 
142 2:                                             << 
143 EX_NO_POP(      mov.b   @r5+,r0         )      << 
144         dt      r6                             << 
145 EX_NO_POP(      mov.b   r0,@r4          )      << 
146         bf/s    2b                             << 
147          add    #1,r4                          << 
148                                                << 
149 1:      mov     #0,r0           ! normal retur << 
150 5000:                                          << 
151                                                << 
152 # Exception handler:                           << 
153 .section .fixup, "ax"                          << 
154 6005:                                          << 
155         mov.l   8000f,r1                       << 
156         mov     r3,r0                          << 
157         jmp     @r1                            << 
158          sub    r4,r0                          << 
159         .align  2                              << 
160 8000:   .long   5000b                          << 
161                                                << 
162 .previous                                      << 
163         rts                                    << 
164          nop                                   << 
165                                                << 
166 ! Destination = 00                             << 
167                                                << 
168 .L_dest00:                                     << 
169         ! Skip the large copy for small transf << 
170         mov     #(32+32-4), r0                 << 
171         cmp/gt  r6, r0          ! r0 (60) > r6 << 
172         bt      1f                             << 
173                                                << 
174         ! Align dest to a 32 byte boundary     << 
175         neg     r4,r0                          << 
176         add     #0x20, r0                      << 
177         and     #0x1f, r0                      << 
178         tst     r0, r0                         << 
179         bt      2f                             << 
180                                                << 
181         sub     r0, r6                         << 
182         shlr2   r0                             << 
183 3:                                             << 
184 EX(     mov.l   @r5+,r1         )              << 
185         dt      r0                             << 
186 EX(     mov.l   r1,@r4          )              << 
187         bf/s    3b                             << 
188          add    #4,r4                          << 
189                                                << 
190 2:                                             << 
191 EX(     mov.l   @r5+,r0         )              << 
192 EX(     mov.l   @r5+,r1         )              << 
193 EX(     mov.l   @r5+,r2         )              << 
194 EX(     mov.l   @r5+,r7         )              << 
195 EX(     mov.l   @r5+,r8         )              << 
196 EX(     mov.l   @r5+,r9         )              << 
197 EX(     mov.l   @r5+,r10        )              << 
198 EX(     mov.l   @r5+,r11        )              << 
199 #ifdef CONFIG_CPU_SH4                          << 
200 EX(     movca.l r0,@r4          )              << 
201 #else                                          << 
202 EX(     mov.l   r0,@r4          )              << 
203 #endif                                         << 
204         add     #-32, r6                       << 
205 EX(     mov.l   r1,@(4,r4)      )              << 
206         mov     #32, r0                        << 
207 EX(     mov.l   r2,@(8,r4)      )              << 
208         cmp/gt  r6, r0          ! r0 (32) > r6 << 
209 EX(     mov.l   r7,@(12,r4)     )              << 
210 EX(     mov.l   r8,@(16,r4)     )              << 
211 EX(     mov.l   r9,@(20,r4)     )              << 
212 EX(     mov.l   r10,@(24,r4)    )              << 
213 EX(     mov.l   r11,@(28,r4)    )              << 
214         bf/s    2b                             << 
215          add    #32,r4                         << 
216                                                << 
217 1:      mov     r6, r0                         << 
218         shlr2   r0                             << 
219         tst     r0, r0                         << 
220         bt      .L_cleanup                     << 
221 1:                                             << 
222 EX(     mov.l   @r5+,r1         )              << 
223         dt      r0                             << 
224 EX(     mov.l   r1,@r4          )              << 
225         bf/s    1b                             << 
226          add    #4,r4                          << 
227                                                << 
228         bra     .L_cleanup                     << 
229          nop                                   << 
230                                                << 
231 ! Destination = 10                             << 
232                                                << 
233 .L_dest10:                                     << 
234         mov     r2,r7                          << 
235         shlr2   r7                             << 
236         shlr    r7                             << 
237         tst     r7,r7                          << 
238         mov     #7,r0                          << 
239         bt/s    1f                             << 
240          and    r0,r2                          << 
241 2:                                             << 
242         dt      r7                             << 
243 #ifdef CONFIG_CPU_LITTLE_ENDIAN                << 
244 EX(     mov.l   @r5+,r0         )              << 
245 EX(     mov.l   @r5+,r1         )              << 
246 EX(     mov.l   @r5+,r8         )              << 
247 EX(     mov.l   @r5+,r9         )              << 
248 EX(     mov.l   @r5+,r10        )              << 
249 EX(     mov.w   r0,@r4          )              << 
250         add     #2,r4                          << 
251         xtrct   r1,r0                          << 
252         xtrct   r8,r1                          << 
253         xtrct   r9,r8                          << 
254         xtrct   r10,r9                         << 
255                                                << 
256 EX(     mov.l   r0,@r4          )              << 
257 EX(     mov.l   r1,@(4,r4)      )              << 
258 EX(     mov.l   r8,@(8,r4)      )              << 
259 EX(     mov.l   r9,@(12,r4)     )              << 
260                                                << 
261 EX(     mov.l   @r5+,r1         )              << 
262 EX(     mov.l   @r5+,r8         )              << 
263 EX(     mov.l   @r5+,r0         )              << 
264         xtrct   r1,r10                         << 
265         xtrct   r8,r1                          << 
266         xtrct   r0,r8                          << 
267         shlr16  r0                             << 
268 EX(     mov.l   r10,@(16,r4)    )              << 
269 EX(     mov.l   r1,@(20,r4)     )              << 
270 EX(     mov.l   r8,@(24,r4)     )              << 
271 EX(     mov.w   r0,@(28,r4)     )              << 
272         bf/s    2b                             << 
273          add    #30,r4                         << 
274 #else                                          << 
275 EX(     mov.l   @(28,r5),r0     )              << 
276 EX(     mov.l   @(24,r5),r8     )              << 
277 EX(     mov.l   @(20,r5),r9     )              << 
278 EX(     mov.l   @(16,r5),r10    )              << 
279 EX(     mov.w   r0,@(30,r4)     )              << 
280         add     #-2,r4                         << 
281         xtrct   r8,r0                          << 
282         xtrct   r9,r8                          << 
283         xtrct   r10,r9                         << 
284 EX(     mov.l   r0,@(28,r4)     )              << 
285 EX(     mov.l   r8,@(24,r4)     )              << 
286 EX(     mov.l   r9,@(20,r4)     )              << 
287                                                << 
288 EX(     mov.l   @(12,r5),r0     )              << 
289 EX(     mov.l   @(8,r5),r8      )              << 
290         xtrct   r0,r10                         << 
291 EX(     mov.l   @(4,r5),r9      )              << 
292         mov.l   r10,@(16,r4)                   << 
293 EX(     mov.l   @r5,r10         )              << 
294         xtrct   r8,r0                          << 
295         xtrct   r9,r8                          << 
296         xtrct   r10,r9                         << 
297 EX(     mov.l   r0,@(12,r4)     )              << 
298 EX(     mov.l   r8,@(8,r4)      )              << 
299         swap.w  r10,r0                         << 
300 EX(     mov.l   r9,@(4,r4)      )              << 
301 EX(     mov.w   r0,@(2,r4)      )              << 
302                                                << 
303         add     #32,r5                         << 
304         bf/s    2b                             << 
305          add    #34,r4                         << 
306 #endif                                         << 
307         tst     r2,r2                          << 
308         bt      .L_cleanup                     << 
309                                                << 
310 1:      ! Read longword, write two words per i << 
311 EX(     mov.l   @r5+,r0         )              << 
312         dt      r2                             << 
313 #ifdef CONFIG_CPU_LITTLE_ENDIAN                << 
314 EX(     mov.w   r0,@r4          )              << 
315         shlr16  r0                             << 
316 EX(     mov.w   r0,@(2,r4)      )              << 
317 #else                                          << 
318 EX(     mov.w   r0,@(2,r4)      )              << 
319         shlr16  r0                             << 
320 EX(     mov.w   r0,@r4          )              << 
321 #endif                                         << 
322         bf/s    1b                             << 
323          add    #4,r4                          << 
324                                                << 
325         bra     .L_cleanup                     << 
326          nop                                   << 
327                                                << 
328 ! Destination = 01 or 11                       << 
329                                                << 
330 .L_dest01:                                     << 
331 .L_dest11:                                     << 
332         ! Read longword, write byte, word, byt << 
333 EX(     mov.l   @r5+,r0         )              << 
334         dt      r2                             << 
335 #ifdef CONFIG_CPU_LITTLE_ENDIAN                << 
336 EX(     mov.b   r0,@r4          )              << 
337         shlr8   r0                             << 
338         add     #1,r4                          << 
339 EX(     mov.w   r0,@r4          )              << 
340         shlr16  r0                             << 
341 EX(     mov.b   r0,@(2,r4)      )              << 
342         bf/s    .L_dest01                      << 
343          add    #3,r4                          << 
344 #else                                          << 
345 EX(     mov.b   r0,@(3,r4)      )              << 
346         shlr8   r0                             << 
347         swap.w  r0,r7                          << 
348 EX(     mov.b   r7,@r4          )              << 
349         add     #1,r4                          << 
350 EX(     mov.w   r0,@r4          )              << 
351         bf/s    .L_dest01                      << 
352          add    #3,r4                          << 
353 #endif                                         << 
354                                                << 
355 ! Cleanup last few bytes                       << 
356 .L_cleanup:                                    << 
357         mov     r6,r0                          << 
358         and     #3,r0                          << 
359         tst     r0,r0                          << 
360         bt      .L_exit                        << 
361         mov     r0,r6                          << 
362                                                << 
363 .L_cleanup_loop:                               << 
364 EX(     mov.b   @r5+,r0         )              << 
365         dt      r6                             << 
366 EX(     mov.b   r0,@r4          )              << 
367         bf/s    .L_cleanup_loop                << 
368          add    #1,r4                          << 
369                                                << 
370 .L_exit:                                       << 
371         mov     #0,r0           ! normal retur << 
372                                                << 
373 5000:                                          << 
374                                                << 
375 # Exception handler:                           << 
376 .section .fixup, "ax"                          << 
377 6000:                                          << 
378         mov.l   8000f,r1                       << 
379         mov     r3,r0                          << 
380         jmp     @r1                            << 
381          sub    r4,r0                          << 
382         .align  2                              << 
383 8000:   .long   5000b                          << 
384                                                << 
385 .previous                                      << 
386         mov.l   @r15+,r8                       << 
387         mov.l   @r15+,r9                       << 
388         mov.l   @r15+,r10                      << 
389         rts                                    << 
390          mov.l  @r15+,r11                      << 
                                                      

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php