Merge git://git.kernel.org/pub/scm/linux/kernel/git/arjan/linux-2.6-async-for-30
[linux-2.6] / arch / x86 / boot / copy.S
1 /* ----------------------------------------------------------------------- *
2  *
3  *   Copyright (C) 1991, 1992 Linus Torvalds
4  *   Copyright 2007 rPath, Inc. - All Rights Reserved
5  *
6  *   This file is part of the Linux kernel, and is made available under
7  *   the terms of the GNU General Public License version 2.
8  *
9  * ----------------------------------------------------------------------- */
10
11 #include <linux/linkage.h>
12
13 /*
14  * Memory copy routines
15  */
16
17         .code16gcc
18         .text
19
20 GLOBAL(memcpy)
21         pushw   %si
22         pushw   %di
23         movw    %ax, %di
24         movw    %dx, %si
25         pushw   %cx
26         shrw    $2, %cx
27         rep; movsl
28         popw    %cx
29         andw    $3, %cx
30         rep; movsb
31         popw    %di
32         popw    %si
33         ret
34 ENDPROC(memcpy)
35
36 GLOBAL(memset)
37         pushw   %di
38         movw    %ax, %di
39         movzbl  %dl, %eax
40         imull   $0x01010101,%eax
41         pushw   %cx
42         shrw    $2, %cx
43         rep; stosl
44         popw    %cx
45         andw    $3, %cx
46         rep; stosb
47         popw    %di
48         ret
49 ENDPROC(memset)
50
51 GLOBAL(copy_from_fs)
52         pushw   %ds
53         pushw   %fs
54         popw    %ds
55         call    memcpy
56         popw    %ds
57         ret
58 ENDPROC(copy_from_fs)
59
60 GLOBAL(copy_to_fs)
61         pushw   %es
62         pushw   %fs
63         popw    %es
64         call    memcpy
65         popw    %es
66         ret
67 ENDPROC(copy_to_fs)
68
69 #if 0 /* Not currently used, but can be enabled as needed */
70 GLOBAL(copy_from_gs)
71         pushw   %ds
72         pushw   %gs
73         popw    %ds
74         call    memcpy
75         popw    %ds
76         ret
77 ENDPROC(copy_from_gs)
78
79 GLOBAL(copy_to_gs)
80         pushw   %es
81         pushw   %gs
82         popw    %es
83         call    memcpy
84         popw    %es
85         ret
86 ENDPROC(copy_to_gs)
87 #endif