| 
									
										
										
										
											2008-07-02 15:53:13 +02:00
										 |  |  | /* | 
					
						
							|  |  |  |  * Copyright 2008 Vitaly Mayatskikh <vmayatsk@redhat.com>
 | 
					
						
							|  |  |  |  * Copyright 2002 Andi Kleen, SuSE Labs. | 
					
						
							| 
									
										
										
										
											2007-02-13 13:26:19 +01:00
										 |  |  |  * Subject to the GNU Public License v2. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Functions to copy from and to user space. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/linkage.h> | 
					
						
							|  |  |  | #include <asm/dwarf2.h> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define FIX_ALIGNMENT 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <asm/current.h> | 
					
						
							|  |  |  | #include <asm/asm-offsets.h> | 
					
						
							|  |  |  | #include <asm/thread_info.h> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-02 15:53:13 +02:00
										 |  |  | 	.macro ALIGN_DESTINATION
 | 
					
						
							| 
									
										
										
										
											2007-02-13 13:26:19 +01:00
										 |  |  | #ifdef FIX_ALIGNMENT | 
					
						
							|  |  |  | 	/* check for bad alignment of destination */ | 
					
						
							|  |  |  | 	movl %edi,%ecx | 
					
						
							|  |  |  | 	andl $7,%ecx | 
					
						
							| 
									
										
										
										
											2008-07-02 15:53:13 +02:00
										 |  |  | 	jz 102f				/* already aligned */ | 
					
						
							|  |  |  | 	subl $8,%ecx | 
					
						
							|  |  |  | 	negl %ecx | 
					
						
							|  |  |  | 	subl %ecx,%edx | 
					
						
							|  |  |  | 100:	movb (%rsi),%al | 
					
						
							|  |  |  | 101:	movb %al,(%rdi) | 
					
						
							|  |  |  | 	incq %rsi | 
					
						
							|  |  |  | 	incq %rdi | 
					
						
							|  |  |  | 	decl %ecx | 
					
						
							|  |  |  | 	jnz 100b | 
					
						
							|  |  |  | 102: | 
					
						
							|  |  |  | 	.section .fixup,"ax" | 
					
						
							| 
									
										
										
										
											2008-07-30 13:30:14 +02:00
										 |  |  | 103:	addl %ecx,%edx			/* ecx is zerorest also */ | 
					
						
							| 
									
										
										
										
											2008-07-02 15:53:13 +02:00
										 |  |  | 	jmp copy_user_handle_tail | 
					
						
							|  |  |  | 	.previous | 
					
						
							| 
									
										
										
										
											2007-02-13 13:26:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-02 15:53:13 +02:00
										 |  |  | 	.section __ex_table,"a" | 
					
						
							|  |  |  | 	.align 8
 | 
					
						
							|  |  |  | 	.quad 100b,103b | 
					
						
							|  |  |  | 	.quad 101b,103b | 
					
						
							|  |  |  | 	.previous | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | 	.endm | 
					
						
							| 
									
										
										
										
											2007-02-13 13:26:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-02 15:53:13 +02:00
										 |  |  | /* | 
					
						
							|  |  |  |  * copy_user_nocache - Uncached memory copy with exception handling | 
					
						
							|  |  |  |  * This will force destination/source out of cache for more performance. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | ENTRY(__copy_user_nocache) | 
					
						
							|  |  |  | 	CFI_STARTPROC | 
					
						
							|  |  |  | 	cmpl $8,%edx | 
					
						
							|  |  |  | 	jb 20f		/* less then 8 bytes, go to byte copy loop */ | 
					
						
							|  |  |  | 	ALIGN_DESTINATION | 
					
						
							|  |  |  | 	movl %edx,%ecx | 
					
						
							|  |  |  | 	andl $63,%edx | 
					
						
							|  |  |  | 	shrl $6,%ecx | 
					
						
							|  |  |  | 	jz 17f | 
					
						
							|  |  |  | 1:	movq (%rsi),%r8 | 
					
						
							|  |  |  | 2:	movq 1*8(%rsi),%r9 | 
					
						
							|  |  |  | 3:	movq 2*8(%rsi),%r10 | 
					
						
							|  |  |  | 4:	movq 3*8(%rsi),%r11 | 
					
						
							|  |  |  | 5:	movnti %r8,(%rdi) | 
					
						
							|  |  |  | 6:	movnti %r9,1*8(%rdi) | 
					
						
							|  |  |  | 7:	movnti %r10,2*8(%rdi) | 
					
						
							|  |  |  | 8:	movnti %r11,3*8(%rdi) | 
					
						
							|  |  |  | 9:	movq 4*8(%rsi),%r8 | 
					
						
							|  |  |  | 10:	movq 5*8(%rsi),%r9 | 
					
						
							|  |  |  | 11:	movq 6*8(%rsi),%r10 | 
					
						
							|  |  |  | 12:	movq 7*8(%rsi),%r11 | 
					
						
							|  |  |  | 13:	movnti %r8,4*8(%rdi) | 
					
						
							|  |  |  | 14:	movnti %r9,5*8(%rdi) | 
					
						
							|  |  |  | 15:	movnti %r10,6*8(%rdi) | 
					
						
							|  |  |  | 16:	movnti %r11,7*8(%rdi) | 
					
						
							| 
									
										
										
										
											2007-02-13 13:26:19 +01:00
										 |  |  | 	leaq 64(%rsi),%rsi | 
					
						
							|  |  |  | 	leaq 64(%rdi),%rdi | 
					
						
							|  |  |  | 	decl %ecx | 
					
						
							| 
									
										
										
										
											2008-07-02 15:53:13 +02:00
										 |  |  | 	jnz 1b | 
					
						
							|  |  |  | 17:	movl %edx,%ecx | 
					
						
							|  |  |  | 	andl $7,%edx | 
					
						
							|  |  |  | 	shrl $3,%ecx | 
					
						
							|  |  |  | 	jz 20f | 
					
						
							|  |  |  | 18:	movq (%rsi),%r8 | 
					
						
							|  |  |  | 19:	movnti %r8,(%rdi) | 
					
						
							| 
									
										
										
										
											2007-02-13 13:26:19 +01:00
										 |  |  | 	leaq 8(%rsi),%rsi | 
					
						
							| 
									
										
										
										
											2008-07-02 15:53:13 +02:00
										 |  |  | 	leaq 8(%rdi),%rdi | 
					
						
							|  |  |  | 	decl %ecx | 
					
						
							|  |  |  | 	jnz 18b | 
					
						
							|  |  |  | 20:	andl %edx,%edx | 
					
						
							|  |  |  | 	jz 23f | 
					
						
							| 
									
										
										
										
											2007-02-13 13:26:19 +01:00
										 |  |  | 	movl %edx,%ecx | 
					
						
							| 
									
										
										
										
											2008-07-02 15:53:13 +02:00
										 |  |  | 21:	movb (%rsi),%al | 
					
						
							|  |  |  | 22:	movb %al,(%rdi) | 
					
						
							| 
									
										
										
										
											2007-02-13 13:26:19 +01:00
										 |  |  | 	incq %rsi | 
					
						
							| 
									
										
										
										
											2008-07-02 15:53:13 +02:00
										 |  |  | 	incq %rdi | 
					
						
							| 
									
										
										
										
											2007-02-13 13:26:19 +01:00
										 |  |  | 	decl %ecx | 
					
						
							| 
									
										
										
										
											2008-07-02 15:53:13 +02:00
										 |  |  | 	jnz 21b | 
					
						
							|  |  |  | 23:	xorl %eax,%eax | 
					
						
							| 
									
										
										
										
											2007-10-13 03:06:00 +02:00
										 |  |  | 	sfence | 
					
						
							| 
									
										
										
										
											2007-02-13 13:26:19 +01:00
										 |  |  | 	ret | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-02 15:53:13 +02:00
										 |  |  | 	.section .fixup,"ax" | 
					
						
							|  |  |  | 30:	shll $6,%ecx | 
					
						
							|  |  |  | 	addl %ecx,%edx | 
					
						
							|  |  |  | 	jmp 60f | 
					
						
							| 
									
										
										
										
											2008-07-10 12:52:52 -07:00
										 |  |  | 40:	lea (%rdx,%rcx,8),%rdx | 
					
						
							| 
									
										
										
										
											2008-07-02 15:53:13 +02:00
										 |  |  | 	jmp 60f | 
					
						
							|  |  |  | 50:	movl %ecx,%edx | 
					
						
							|  |  |  | 60:	sfence | 
					
						
							|  |  |  | 	jmp copy_user_handle_tail | 
					
						
							|  |  |  | 	.previous | 
					
						
							| 
									
										
										
										
											2007-02-13 13:26:19 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	.section __ex_table,"a" | 
					
						
							| 
									
										
										
										
											2008-07-02 15:53:13 +02:00
										 |  |  | 	.quad 1b,30b | 
					
						
							|  |  |  | 	.quad 2b,30b | 
					
						
							|  |  |  | 	.quad 3b,30b | 
					
						
							|  |  |  | 	.quad 4b,30b | 
					
						
							|  |  |  | 	.quad 5b,30b | 
					
						
							|  |  |  | 	.quad 6b,30b | 
					
						
							|  |  |  | 	.quad 7b,30b | 
					
						
							|  |  |  | 	.quad 8b,30b | 
					
						
							|  |  |  | 	.quad 9b,30b | 
					
						
							|  |  |  | 	.quad 10b,30b | 
					
						
							|  |  |  | 	.quad 11b,30b | 
					
						
							|  |  |  | 	.quad 12b,30b | 
					
						
							|  |  |  | 	.quad 13b,30b | 
					
						
							|  |  |  | 	.quad 14b,30b | 
					
						
							|  |  |  | 	.quad 15b,30b | 
					
						
							|  |  |  | 	.quad 16b,30b | 
					
						
							|  |  |  | 	.quad 18b,40b | 
					
						
							|  |  |  | 	.quad 19b,40b | 
					
						
							|  |  |  | 	.quad 21b,50b | 
					
						
							|  |  |  | 	.quad 22b,50b | 
					
						
							| 
									
										
										
										
											2007-02-13 13:26:19 +01:00
										 |  |  | 	.previous | 
					
						
							|  |  |  | 	CFI_ENDPROC | 
					
						
							|  |  |  | ENDPROC(__copy_user_nocache) |