forked from Minki/linux
100 lines
1.7 KiB
ArmAsm
100 lines
1.7 KiB
ArmAsm
|
/*
|
||
|
* Copyright (C) 2004-2006 Atmel Corporation
|
||
|
*
|
||
|
* This program is free software; you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU General Public License version 2 as
|
||
|
* published by the Free Software Foundation.
|
||
|
*/
|
||
|
#include <asm/errno.h>
|
||
|
#include <asm/asm.h>
|
||
|
|
||
|
/*
|
||
|
* unsigned int csum_partial_copy_generic(const char *src, char *dst, int len
|
||
|
* int sum, int *src_err_ptr,
|
||
|
* int *dst_err_ptr)
|
||
|
*
|
||
|
* Copy src to dst while checksumming, otherwise like csum_partial.
|
||
|
*/
|
||
|
|
||
|
.macro ld_src size, reg, ptr
|
||
|
9999: ld.\size \reg, \ptr
|
||
|
.section __ex_table, "a"
|
||
|
.long 9999b, fixup_ld_src
|
||
|
.previous
|
||
|
.endm
|
||
|
|
||
|
.macro st_dst size, ptr, reg
|
||
|
9999: st.\size \ptr, \reg
|
||
|
.section __ex_table, "a"
|
||
|
.long 9999b, fixup_st_dst
|
||
|
.previous
|
||
|
.endm
|
||
|
|
||
|
.text
|
||
|
.global csum_partial_copy_generic
|
||
|
.type csum_partial_copy_generic,"function"
|
||
|
.align 1
|
||
|
csum_partial_copy_generic:
|
||
|
pushm r4-r7,lr
|
||
|
|
||
|
/* The inner loop */
|
||
|
1: sub r10, 4
|
||
|
brlt 5f
|
||
|
2: ld_src w, r5, r12++
|
||
|
st_dst w, r11++, r5
|
||
|
add r9, r5
|
||
|
acr r9
|
||
|
sub r10, 4
|
||
|
brge 2b
|
||
|
|
||
|
/* return if we had a whole number of words */
|
||
|
5: sub r10, -4
|
||
|
brne 7f
|
||
|
|
||
|
6: mov r12, r9
|
||
|
popm r4-r7,pc
|
||
|
|
||
|
/* handle additional bytes at the tail */
|
||
|
7: mov r5, 0
|
||
|
mov r4, 32
|
||
|
8: ld_src ub, r6, r12++
|
||
|
st_dst b, r11++, r6
|
||
|
lsl r5, 8
|
||
|
sub r4, 8
|
||
|
bfins r5, r6, 0, 8
|
||
|
sub r10, 1
|
||
|
brne 8b
|
||
|
|
||
|
lsl r5, r5, r4
|
||
|
add r9, r5
|
||
|
acr r9
|
||
|
rjmp 6b
|
||
|
|
||
|
/* Exception handler */
|
||
|
.section .fixup,"ax"
|
||
|
.align 1
|
||
|
fixup_ld_src:
|
||
|
mov r9, -EFAULT
|
||
|
cp.w r8, 0
|
||
|
breq 1f
|
||
|
st.w r8[0], r9
|
||
|
|
||
|
1: /*
|
||
|
* TODO: zero the complete destination - computing the rest
|
||
|
* is too much work
|
||
|
*/
|
||
|
|
||
|
mov r9, 0
|
||
|
rjmp 6b
|
||
|
|
||
|
fixup_st_dst:
|
||
|
mov r9, -EFAULT
|
||
|
lddsp r8, sp[20]
|
||
|
cp.w r8, 0
|
||
|
breq 1f
|
||
|
st.w r8[0], r9
|
||
|
1: mov r9, 0
|
||
|
rjmp 6b
|
||
|
|
||
|
.previous
|