Blame view
arch/sh/lib/__clear_user.S
1.75 KB
510c72ad2 sh: Fixup various... |
1 |
/* |
1da177e4c Linux-2.6.12-rc2 |
2 3 4 5 |
* __clear_user_page, __clear_user, clear_page implementation of SuperH * * Copyright (C) 2001 Kaz Kojima * Copyright (C) 2001, 2002 Niibe Yutaka |
510c72ad2 sh: Fixup various... |
6 |
* Copyright (C) 2006 Paul Mundt |
1da177e4c Linux-2.6.12-rc2 |
7 |
*/ |
1da177e4c Linux-2.6.12-rc2 |
8 |
#include <linux/linkage.h> |
510c72ad2 sh: Fixup various... |
9 |
#include <asm/page.h> |
1da177e4c Linux-2.6.12-rc2 |
10 |
|
1da177e4c Linux-2.6.12-rc2 |
11 12 13 |
ENTRY(__clear_user) ! mov #0, r0 |
fea966f75 sh: Remove implic... |
14 |
mov #0xffffffe0, r1 |
1da177e4c Linux-2.6.12-rc2 |
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
! ! r4..(r4+31)&~32 -------- not aligned [ Area 0 ] ! (r4+31)&~32..(r4+r5)&~32 -------- aligned [ Area 1 ] ! (r4+r5)&~32..r4+r5 -------- not aligned [ Area 2 ] ! ! Clear area 0 mov r4, r2 ! tst r1, r5 ! length < 32 bt .Larea2 ! skip to remainder ! add #31, r2 and r1, r2 cmp/eq r4, r2 bt .Larea1 mov r2, r3 sub r4, r3 mov r3, r7 mov r4, r2 ! .L0: dt r3 0: mov.b r0, @r2 bf/s .L0 add #1, r2 ! sub r7, r5 mov r2, r4 .Larea1: mov r4, r3 add r5, r3 and r1, r3 cmp/hi r2, r3 bf .Larea2 ! ! Clear area 1 #if defined(CONFIG_CPU_SH4) 1: movca.l r0, @r2 #else 1: mov.l r0, @r2 #endif add #4, r2 2: mov.l r0, @r2 add #4, r2 3: mov.l r0, @r2 add #4, r2 4: mov.l r0, @r2 add #4, r2 5: mov.l r0, @r2 add #4, r2 6: mov.l r0, @r2 add #4, r2 7: mov.l r0, @r2 add #4, r2 8: mov.l r0, @r2 add #4, r2 cmp/hi r2, r3 bt/s 1b nop ! ! Clear area 2 .Larea2: mov r4, r3 add r5, r3 cmp/hs r3, r2 bt/s .Ldone sub r2, r3 .L2: dt r3 9: mov.b r0, @r2 bf/s .L2 add #1, r2 ! .Ldone: rts mov #0, r0 ! return 0 as normal return ! return the number of bytes remained .Lbad_clear_user: mov r4, r0 add r5, r0 rts sub r2, r0 .section __ex_table,"a" .align 2 .long 0b, .Lbad_clear_user .long 1b, .Lbad_clear_user .long 2b, .Lbad_clear_user .long 3b, .Lbad_clear_user .long 4b, .Lbad_clear_user .long 5b, .Lbad_clear_user .long 6b, .Lbad_clear_user .long 7b, .Lbad_clear_user .long 8b, .Lbad_clear_user .long 9b, .Lbad_clear_user .previous |