Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6
[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 /*
12  * Memory copy routines
13  */
14
15         .code16gcc
16         .text
17
18         .globl  memcpy
19         .type   memcpy, @function
20 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         .size   memcpy, .-memcpy
35
36         .globl  memset
37         .type   memset, @function
38 memset:
39         pushw   %di
40         movw    %ax, %di
41         movzbl  %dl, %eax
42         imull   $0x01010101,%eax
43         pushw   %cx
44         shrw    $2, %cx
45         rep; stosl
46         popw    %cx
47         andw    $3, %cx
48         rep; stosb
49         popw    %di
50         ret
51         .size   memset, .-memset
52
53         .globl  copy_from_fs
54         .type   copy_from_fs, @function
55 copy_from_fs:
56         pushw   %ds
57         pushw   %fs
58         popw    %ds
59         call    memcpy
60         popw    %ds
61         ret
62         .size   copy_from_fs, .-copy_from_fs
63
64         .globl  copy_to_fs
65         .type   copy_to_fs, @function
66 copy_to_fs:
67         pushw   %es
68         pushw   %fs
69         popw    %es
70         call    memcpy
71         popw    %es
72         ret
73         .size   copy_to_fs, .-copy_to_fs
74
75 #if 0 /* Not currently used, but can be enabled as needed */
76
77         .globl  copy_from_gs
78         .type   copy_from_gs, @function
79 copy_from_gs:
80         pushw   %ds
81         pushw   %gs
82         popw    %ds
83         call    memcpy
84         popw    %ds
85         ret
86         .size   copy_from_gs, .-copy_from_gs
87         .globl  copy_to_gs
88
89         .type   copy_to_gs, @function
90 copy_to_gs:
91         pushw   %es
92         pushw   %gs
93         popw    %es
94         call    memcpy
95         popw    %es
96         ret
97         .size   copy_to_gs, .-copy_to_gs
98
99 #endif