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
							 |