1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /* ----------------------------------------------------------------------- *
3  *
4  *   Copyright (C) 1991, 1992 Linus Torvalds
5  *   Copyright 2007 rPath, Inc. - All Rights Reserved
6  *
7  * ----------------------------------------------------------------------- */
8 
9 #include <linux/linkage.h>
10 
11 /*
12  * Memory copy routines
13  */
14 
15 	.code16
16 	.text
17 
18 SYM_FUNC_START_NOALIGN(memcpy)
19 	pushw	%si
20 	pushw	%di
21 	movw	%ax, %di
22 	movw	%dx, %si
23 	pushw	%cx
24 	shrw	$2, %cx
25 	rep; movsl
26 	popw	%cx
27 	andw	$3, %cx
28 	rep; movsb
29 	popw	%di
30 	popw	%si
31 	retl
32 SYM_FUNC_END(memcpy)
33 
34 SYM_FUNC_START_NOALIGN(memset)
35 	pushw	%di
36 	movw	%ax, %di
37 	movzbl	%dl, %eax
38 	imull	$0x01010101,%eax
39 	pushw	%cx
40 	shrw	$2, %cx
41 	rep; stosl
42 	popw	%cx
43 	andw	$3, %cx
44 	rep; stosb
45 	popw	%di
46 	retl
47 SYM_FUNC_END(memset)
48 
49 SYM_FUNC_START_NOALIGN(copy_from_fs)
50 	pushw	%ds
51 	pushw	%fs
52 	popw	%ds
53 	calll	memcpy
54 	popw	%ds
55 	retl
56 SYM_FUNC_END(copy_from_fs)
57 
58 SYM_FUNC_START_NOALIGN(copy_to_fs)
59 	pushw	%es
60 	pushw	%fs
61 	popw	%es
62 	calll	memcpy
63 	popw	%es
64 	retl
65 SYM_FUNC_END(copy_to_fs)
66