diff options
Diffstat (limited to 'arch/x86/include/asm/asm.h')
| -rw-r--r-- | arch/x86/include/asm/asm.h | 25 | 
1 files changed, 25 insertions, 0 deletions
diff --git a/arch/x86/include/asm/asm.h b/arch/x86/include/asm/asm.h index 7730c1c5c83a..189679aba703 100644 --- a/arch/x86/include/asm/asm.h +++ b/arch/x86/include/asm/asm.h @@ -63,6 +63,31 @@  	_ASM_ALIGN ;						\  	_ASM_PTR (entry);					\  	.popsection + +.macro ALIGN_DESTINATION +	/* check for bad alignment of destination */ +	movl %edi,%ecx +	andl $7,%ecx +	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" +103:	addl %ecx,%edx			/* ecx is zerorest also */ +	jmp copy_user_handle_tail +	.previous + +	_ASM_EXTABLE(100b,103b) +	_ASM_EXTABLE(101b,103b) +	.endm +  #else  # define _ASM_EXTABLE(from,to)					\  	" .pushsection \"__ex_table\",\"a\"\n"			\  |