diff options
Diffstat (limited to 'kernel/arch/x86/boot/copy.S')
-rw-r--r-- | kernel/arch/x86/boot/copy.S | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/kernel/arch/x86/boot/copy.S b/kernel/arch/x86/boot/copy.S new file mode 100644 index 000000000..1eb7d298b --- /dev/null +++ b/kernel/arch/x86/boot/copy.S @@ -0,0 +1,87 @@ +/* ----------------------------------------------------------------------- * + * + * 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 |