mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 19:29:37 +00:00
![David Woodhouse](/assets/img/avatar_default.png)
This reverts commit 28b48688
("x86, boot: use .code16gcc instead
of .code16").
Versions of binutils older than 2.16 are already not working, so this
workaround is no longer necessary either. At the same time, some of
the transformations that .code16gcc does can be *extremely*
counterintuitive to a human programmer.
[ hpa: folded ret -> retl and call -> calll fixes from followup patch ]
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Link: http://lkml.kernel.org/r/1388788242.2391.75.camel@shinybook.infradead.org
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
87 lines
1.3 KiB
ArmAsm
87 lines
1.3 KiB
ArmAsm
/* ----------------------------------------------------------------------- *
|
|
*
|
|
* Copyright (C) 1991, 1992 Linus Torvalds
|
|
* Copyright 2007 rPath, Inc. - All Rights Reserved
|
|
*
|
|
* This file is part of the Linux kernel, and is made available under
|
|
* the terms of the GNU General Public License version 2.
|
|
*
|
|
* ----------------------------------------------------------------------- */
|
|
|
|
#include <linux/linkage.h>
|
|
|
|
/*
|
|
* Memory copy routines
|
|
*/
|
|
|
|
.code16
|
|
.text
|
|
|
|
GLOBAL(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
|
|
ENDPROC(memcpy)
|
|
|
|
GLOBAL(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
|
|
ENDPROC(memset)
|
|
|
|
GLOBAL(copy_from_fs)
|
|
pushw %ds
|
|
pushw %fs
|
|
popw %ds
|
|
calll memcpy
|
|
popw %ds
|
|
retl
|
|
ENDPROC(copy_from_fs)
|
|
|
|
GLOBAL(copy_to_fs)
|
|
pushw %es
|
|
pushw %fs
|
|
popw %es
|
|
calll memcpy
|
|
popw %es
|
|
retl
|
|
ENDPROC(copy_to_fs)
|
|
|
|
#if 0 /* Not currently used, but can be enabled as needed */
|
|
GLOBAL(copy_from_gs)
|
|
pushw %ds
|
|
pushw %gs
|
|
popw %ds
|
|
calll memcpy
|
|
popw %ds
|
|
retl
|
|
ENDPROC(copy_from_gs)
|
|
|
|
GLOBAL(copy_to_gs)
|
|
pushw %es
|
|
pushw %gs
|
|
popw %es
|
|
calll memcpy
|
|
popw %es
|
|
retl
|
|
ENDPROC(copy_to_gs)
|
|
#endif
|