Merge branch 'sh/for-2.6.28' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal...
[linux-2.6] / arch / avr32 / lib / csum_partial_copy_generic.S
1 /*
2  * Copyright (C) 2004-2006 Atmel Corporation
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  */
8 #include <asm/errno.h>
9 #include <asm/asm.h>
10
11         /*
12          * unsigned int csum_partial_copy_generic(const char *src, char *dst, int len
13          *                                        int sum, int *src_err_ptr,
14          *                                        int *dst_err_ptr)
15          *
16          * Copy src to dst while checksumming, otherwise like csum_partial.
17          */
18
19         .macro ld_src size, reg, ptr
20 9999:   ld.\size \reg, \ptr
21         .section __ex_table, "a"
22         .long   9999b, fixup_ld_src
23         .previous
24         .endm
25
26         .macro st_dst size, ptr, reg
27 9999:   st.\size \ptr, \reg
28         .section __ex_table, "a"
29         .long   9999b, fixup_st_dst
30         .previous
31         .endm
32
33         .text
34         .global csum_partial_copy_generic
35         .type   csum_partial_copy_generic,"function"
36         .align  1
37 csum_partial_copy_generic:
38         pushm   r4-r7,lr
39
40         /* The inner loop */
41 1:      sub     r10, 4
42         brlt    5f
43 2:      ld_src  w, r5, r12++
44         st_dst  w, r11++, r5
45         add     r9, r5
46         acr     r9
47         sub     r10, 4
48         brge    2b
49
50         /* return if we had a whole number of words */
51 5:      sub     r10, -4
52         brne    7f
53
54 6:      mov     r12, r9
55         popm    r4-r7,pc
56
57         /* handle additional bytes at the tail */
58 7:      mov     r5, 0
59         mov     r4, 32
60 8:      ld_src  ub, r6, r12++
61         st_dst  b, r11++, r6
62         lsl     r5, 8
63         sub     r4, 8
64         bfins   r5, r6, 0, 8
65         sub     r10, 1
66         brne    8b
67
68         lsl     r5, r5, r4
69         add     r9, r5
70         acr     r9
71         rjmp    6b
72
73         /* Exception handler */
74         .section .fixup,"ax"
75         .align  1
76 fixup_ld_src:
77         mov     r9, -EFAULT
78         cp.w    r8, 0
79         breq    1f
80         st.w    r8[0], r9
81
82 1:      /*
83          * TODO: zero the complete destination - computing the rest
84          * is too much work
85          */
86
87         mov     r9, 0
88         rjmp    6b
89
90 fixup_st_dst:
91         mov     r9, -EFAULT
92         lddsp   r8, sp[20]
93         cp.w    r8, 0
94         breq    1f
95         st.w    r8[0], r9
96 1:      mov     r9, 0
97         rjmp    6b
98
99         .previous