linux/arch/avr32/lib/csum_partial_copy_generic.S
<<
>>
Prefs
   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
  209999:   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
  279999:   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
  37csum_partial_copy_generic:
  38        pushm   r4-r7,lr
  39
  40        /* The inner loop */
  411:      sub     r10, 4
  42        brlt    5f
  432:      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 */
  515:      sub     r10, -4
  52        brne    7f
  53
  546:      mov     r12, r9
  55        popm    r4-r7,pc
  56
  57        /* handle additional bytes at the tail */
  587:      mov     r5, 0
  59        mov     r4, 32
  608:      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
  76fixup_ld_src:
  77        mov     r9, -EFAULT
  78        cp.w    r8, 0
  79        breq    1f
  80        st.w    r8[0], r9
  81
  821:      /*
  83         * TODO: zero the complete destination - computing the rest
  84         * is too much work
  85         */
  86
  87        mov     r9, 0
  88        rjmp    6b
  89
  90fixup_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
  961:      mov     r9, 0
  97        rjmp    6b
  98
  99        .previous
 100