mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	Minimum version of binutils required to compile the kernel is 2.25. This version correctly handles the "rep" prefixes, so it is possible to remove the semicolon, which was used to support ancient versions of GNU as. Due to the semicolon, the compiler considers "rep; insn" (or its alternate "rep\n\tinsn" form) as two separate instructions. Removing the semicolon makes asm length calculations more accurate, consequently making scheduling and inlining decisions of the compiler more accurate. Removing the semicolon also enables assembler checks involving "rep" prefixes. Trying to assemble e.g. "rep addl %eax, %ebx" results in: Error: invalid instruction `add' after `rep' Signed-off-by: Uros Bizjak <ubizjak@gmail.com> Signed-off-by: Ingo Molnar <mingo@kernel.org> Cc: Andy Lutomirski <luto@kernel.org> Cc: Brian Gerst <brgerst@gmail.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Juergen Gross <jgross@suse.com> Cc: Kees Cook <keescook@chromium.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Martin Mares <mj@ucw.cz> Cc: Peter Zijlstra <peterz@infradead.org> Link: https://lore.kernel.org/r/20250418071437.4144391-1-ubizjak@gmail.com
		
			
				
	
	
		
			65 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
/* SPDX-License-Identifier: GPL-2.0-only */
 | 
						|
/* ----------------------------------------------------------------------- *
 | 
						|
 *
 | 
						|
 *   Copyright (C) 1991, 1992 Linus Torvalds
 | 
						|
 *   Copyright 2007 rPath, Inc. - All Rights Reserved
 | 
						|
 *
 | 
						|
 * ----------------------------------------------------------------------- */
 | 
						|
 | 
						|
#include <linux/linkage.h>
 | 
						|
 | 
						|
/*
 | 
						|
 * Memory copy routines
 | 
						|
 */
 | 
						|
 | 
						|
	.code16
 | 
						|
	.text
 | 
						|
 | 
						|
SYM_FUNC_START_NOALIGN(memcpy)
 | 
						|
	pushw	%si
 | 
						|
	pushw	%di
 | 
						|
	movw	%ax, %di
 | 
						|
	movw	%dx, %si
 | 
						|
	pushw	%cx
 | 
						|
	shrw	$2, %cx
 | 
						|
	rep movsl
 | 
						|
	popw	%cx
 | 
						|
	andw	$3, %cx
 | 
						|
	rep movsb
 | 
						|
	popw	%di
 | 
						|
	popw	%si
 | 
						|
	retl
 | 
						|
SYM_FUNC_END(memcpy)
 | 
						|
 | 
						|
SYM_FUNC_START_NOALIGN(memset)
 | 
						|
	pushw	%di
 | 
						|
	movw	%ax, %di
 | 
						|
	movzbl	%dl, %eax
 | 
						|
	imull	$0x01010101,%eax
 | 
						|
	pushw	%cx
 | 
						|
	shrw	$2, %cx
 | 
						|
	rep stosl
 | 
						|
	popw	%cx
 | 
						|
	andw	$3, %cx
 | 
						|
	rep stosb
 | 
						|
	popw	%di
 | 
						|
	retl
 | 
						|
SYM_FUNC_END(memset)
 | 
						|
 | 
						|
SYM_FUNC_START_NOALIGN(copy_from_fs)
 | 
						|
	pushw	%ds
 | 
						|
	pushw	%fs
 | 
						|
	popw	%ds
 | 
						|
	calll	memcpy
 | 
						|
	popw	%ds
 | 
						|
	retl
 | 
						|
SYM_FUNC_END(copy_from_fs)
 | 
						|
 | 
						|
SYM_FUNC_START_NOALIGN(copy_to_fs)
 | 
						|
	pushw	%es
 | 
						|
	pushw	%fs
 | 
						|
	popw	%es
 | 
						|
	calll	memcpy
 | 
						|
	popw	%es
 | 
						|
	retl
 | 
						|
SYM_FUNC_END(copy_to_fs)
 |