mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00: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)
|