| .. | .. |
|---|
| 18 | 18 | * rdi source |
|---|
| 19 | 19 | * rsi destination |
|---|
| 20 | 20 | * edx len (32bit) |
|---|
| 21 | | - * ecx sum (32bit) |
|---|
| 22 | | - * r8 src_err_ptr (int) |
|---|
| 23 | | - * r9 dst_err_ptr (int) |
|---|
| 24 | 21 | * |
|---|
| 25 | 22 | * Output |
|---|
| 26 | 23 | * eax 64bit sum. undefined in case of exception. |
|---|
| .. | .. |
|---|
| 31 | 28 | |
|---|
| 32 | 29 | .macro source |
|---|
| 33 | 30 | 10: |
|---|
| 34 | | - _ASM_EXTABLE(10b, .Lbad_source) |
|---|
| 31 | + _ASM_EXTABLE_UA(10b, .Lfault) |
|---|
| 35 | 32 | .endm |
|---|
| 36 | 33 | |
|---|
| 37 | 34 | .macro dest |
|---|
| 38 | 35 | 20: |
|---|
| 39 | | - _ASM_EXTABLE(20b, .Lbad_dest) |
|---|
| 36 | + _ASM_EXTABLE_UA(20b, .Lfault) |
|---|
| 40 | 37 | .endm |
|---|
| 41 | 38 | |
|---|
| 42 | | - .macro ignore L=.Lignore |
|---|
| 43 | | -30: |
|---|
| 44 | | - _ASM_EXTABLE(30b, \L) |
|---|
| 45 | | - .endm |
|---|
| 39 | +SYM_FUNC_START(csum_partial_copy_generic) |
|---|
| 40 | + subq $5*8, %rsp |
|---|
| 41 | + movq %rbx, 0*8(%rsp) |
|---|
| 42 | + movq %r12, 1*8(%rsp) |
|---|
| 43 | + movq %r14, 2*8(%rsp) |
|---|
| 44 | + movq %r13, 3*8(%rsp) |
|---|
| 45 | + movq %r15, 4*8(%rsp) |
|---|
| 46 | 46 | |
|---|
| 47 | | - |
|---|
| 48 | | -ENTRY(csum_partial_copy_generic) |
|---|
| 49 | | - cmpl $3*64, %edx |
|---|
| 50 | | - jle .Lignore |
|---|
| 51 | | - |
|---|
| 52 | | -.Lignore: |
|---|
| 53 | | - subq $7*8, %rsp |
|---|
| 54 | | - movq %rbx, 2*8(%rsp) |
|---|
| 55 | | - movq %r12, 3*8(%rsp) |
|---|
| 56 | | - movq %r14, 4*8(%rsp) |
|---|
| 57 | | - movq %r13, 5*8(%rsp) |
|---|
| 58 | | - movq %r15, 6*8(%rsp) |
|---|
| 59 | | - |
|---|
| 60 | | - movq %r8, (%rsp) |
|---|
| 61 | | - movq %r9, 1*8(%rsp) |
|---|
| 62 | | - |
|---|
| 63 | | - movl %ecx, %eax |
|---|
| 64 | | - movl %edx, %ecx |
|---|
| 65 | | - |
|---|
| 47 | + movl $-1, %eax |
|---|
| 66 | 48 | xorl %r9d, %r9d |
|---|
| 67 | | - movq %rcx, %r12 |
|---|
| 49 | + movl %edx, %ecx |
|---|
| 50 | + cmpl $8, %ecx |
|---|
| 51 | + jb .Lshort |
|---|
| 52 | + |
|---|
| 53 | + testb $7, %sil |
|---|
| 54 | + jne .Lunaligned |
|---|
| 55 | +.Laligned: |
|---|
| 56 | + movl %ecx, %r12d |
|---|
| 68 | 57 | |
|---|
| 69 | 58 | shrq $6, %r12 |
|---|
| 70 | 59 | jz .Lhandle_tail /* < 64 */ |
|---|
| .. | .. |
|---|
| 95 | 84 | source |
|---|
| 96 | 85 | movq 56(%rdi), %r13 |
|---|
| 97 | 86 | |
|---|
| 98 | | - ignore 2f |
|---|
| 87 | +30: |
|---|
| 88 | + /* |
|---|
| 89 | + * No _ASM_EXTABLE_UA; this is used for intentional prefetch on a |
|---|
| 90 | + * potentially unmapped kernel address. |
|---|
| 91 | + */ |
|---|
| 92 | + _ASM_EXTABLE(30b, 2f) |
|---|
| 99 | 93 | prefetcht0 5*64(%rdi) |
|---|
| 100 | 94 | 2: |
|---|
| 101 | 95 | adcq %rbx, %rax |
|---|
| .. | .. |
|---|
| 127 | 121 | dest |
|---|
| 128 | 122 | movq %r13, 56(%rsi) |
|---|
| 129 | 123 | |
|---|
| 130 | | -3: |
|---|
| 131 | | - |
|---|
| 132 | 124 | leaq 64(%rdi), %rdi |
|---|
| 133 | 125 | leaq 64(%rsi), %rsi |
|---|
| 134 | 126 | |
|---|
| .. | .. |
|---|
| 138 | 130 | |
|---|
| 139 | 131 | /* do last up to 56 bytes */ |
|---|
| 140 | 132 | .Lhandle_tail: |
|---|
| 141 | | - /* ecx: count */ |
|---|
| 142 | | - movl %ecx, %r10d |
|---|
| 133 | + /* ecx: count, rcx.63: the end result needs to be rol8 */ |
|---|
| 134 | + movq %rcx, %r10 |
|---|
| 143 | 135 | andl $63, %ecx |
|---|
| 144 | 136 | shrl $3, %ecx |
|---|
| 145 | 137 | jz .Lfold |
|---|
| .. | .. |
|---|
| 168 | 160 | .Lhandle_7: |
|---|
| 169 | 161 | movl %r10d, %ecx |
|---|
| 170 | 162 | andl $7, %ecx |
|---|
| 163 | +.L1: /* .Lshort rejoins the common path here */ |
|---|
| 171 | 164 | shrl $1, %ecx |
|---|
| 172 | 165 | jz .Lhandle_1 |
|---|
| 173 | 166 | movl $2, %edx |
|---|
| .. | .. |
|---|
| 199 | 192 | adcl %r9d, %eax /* carry */ |
|---|
| 200 | 193 | |
|---|
| 201 | 194 | .Lende: |
|---|
| 202 | | - movq 2*8(%rsp), %rbx |
|---|
| 203 | | - movq 3*8(%rsp), %r12 |
|---|
| 204 | | - movq 4*8(%rsp), %r14 |
|---|
| 205 | | - movq 5*8(%rsp), %r13 |
|---|
| 206 | | - movq 6*8(%rsp), %r15 |
|---|
| 207 | | - addq $7*8, %rsp |
|---|
| 208 | | - ret |
|---|
| 195 | + testq %r10, %r10 |
|---|
| 196 | + js .Lwas_odd |
|---|
| 197 | +.Lout: |
|---|
| 198 | + movq 0*8(%rsp), %rbx |
|---|
| 199 | + movq 1*8(%rsp), %r12 |
|---|
| 200 | + movq 2*8(%rsp), %r14 |
|---|
| 201 | + movq 3*8(%rsp), %r13 |
|---|
| 202 | + movq 4*8(%rsp), %r15 |
|---|
| 203 | + addq $5*8, %rsp |
|---|
| 204 | + RET |
|---|
| 205 | +.Lshort: |
|---|
| 206 | + movl %ecx, %r10d |
|---|
| 207 | + jmp .L1 |
|---|
| 208 | +.Lunaligned: |
|---|
| 209 | + xorl %ebx, %ebx |
|---|
| 210 | + testb $1, %sil |
|---|
| 211 | + jne .Lodd |
|---|
| 212 | +1: testb $2, %sil |
|---|
| 213 | + je 2f |
|---|
| 214 | + source |
|---|
| 215 | + movw (%rdi), %bx |
|---|
| 216 | + dest |
|---|
| 217 | + movw %bx, (%rsi) |
|---|
| 218 | + leaq 2(%rdi), %rdi |
|---|
| 219 | + subq $2, %rcx |
|---|
| 220 | + leaq 2(%rsi), %rsi |
|---|
| 221 | + addq %rbx, %rax |
|---|
| 222 | +2: testb $4, %sil |
|---|
| 223 | + je .Laligned |
|---|
| 224 | + source |
|---|
| 225 | + movl (%rdi), %ebx |
|---|
| 226 | + dest |
|---|
| 227 | + movl %ebx, (%rsi) |
|---|
| 228 | + leaq 4(%rdi), %rdi |
|---|
| 229 | + subq $4, %rcx |
|---|
| 230 | + leaq 4(%rsi), %rsi |
|---|
| 231 | + addq %rbx, %rax |
|---|
| 232 | + jmp .Laligned |
|---|
| 209 | 233 | |
|---|
| 210 | | - /* Exception handlers. Very simple, zeroing is done in the wrappers */ |
|---|
| 211 | | -.Lbad_source: |
|---|
| 212 | | - movq (%rsp), %rax |
|---|
| 213 | | - testq %rax, %rax |
|---|
| 214 | | - jz .Lende |
|---|
| 215 | | - movl $-EFAULT, (%rax) |
|---|
| 216 | | - jmp .Lende |
|---|
| 234 | +.Lodd: |
|---|
| 235 | + source |
|---|
| 236 | + movb (%rdi), %bl |
|---|
| 237 | + dest |
|---|
| 238 | + movb %bl, (%rsi) |
|---|
| 239 | + leaq 1(%rdi), %rdi |
|---|
| 240 | + leaq 1(%rsi), %rsi |
|---|
| 241 | + /* decrement, set MSB */ |
|---|
| 242 | + leaq -1(%rcx, %rcx), %rcx |
|---|
| 243 | + rorq $1, %rcx |
|---|
| 244 | + shll $8, %ebx |
|---|
| 245 | + addq %rbx, %rax |
|---|
| 246 | + jmp 1b |
|---|
| 217 | 247 | |
|---|
| 218 | | -.Lbad_dest: |
|---|
| 219 | | - movq 8(%rsp), %rax |
|---|
| 220 | | - testq %rax, %rax |
|---|
| 221 | | - jz .Lende |
|---|
| 222 | | - movl $-EFAULT, (%rax) |
|---|
| 223 | | - jmp .Lende |
|---|
| 224 | | -ENDPROC(csum_partial_copy_generic) |
|---|
| 248 | +.Lwas_odd: |
|---|
| 249 | + roll $8, %eax |
|---|
| 250 | + jmp .Lout |
|---|
| 251 | + |
|---|
| 252 | + /* Exception: just return 0 */ |
|---|
| 253 | +.Lfault: |
|---|
| 254 | + xorl %eax, %eax |
|---|
| 255 | + jmp .Lout |
|---|
| 256 | +SYM_FUNC_END(csum_partial_copy_generic) |
|---|