diff options
author | H. Peter Anvin <hpa@zytor.com> | 2007-07-11 15:18:41 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-07-12 13:55:55 -0400 |
commit | 5be865661516263d90317a6b35b588a2d7c3cb55 (patch) | |
tree | d8eb903bc210256b3d4b667506279c0c8c21cab5 /arch/i386 | |
parent | ad7e906d5687bb076fe6c3c980d6e013a3a42bde (diff) |
String-handling functions for the new x86 setup code.
strcmp(), memcpy(), memset(), as well as routines to copy to and from
other segments (as pointed to by fs and gs).
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/i386')
-rw-r--r-- | arch/i386/boot/copy.S | 101 | ||||
-rw-r--r-- | arch/i386/boot/string.c | 52 |
2 files changed, 153 insertions, 0 deletions
diff --git a/arch/i386/boot/copy.S b/arch/i386/boot/copy.S new file mode 100644 index 000000000000..ef127e56a3cf --- /dev/null +++ b/arch/i386/boot/copy.S | |||
@@ -0,0 +1,101 @@ | |||
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 | * arch/i386/boot/copy.S | ||
13 | * | ||
14 | * Memory copy routines | ||
15 | */ | ||
16 | |||
17 | .code16gcc | ||
18 | .text | ||
19 | |||
20 | .globl memcpy | ||
21 | .type memcpy, @function | ||
22 | memcpy: | ||
23 | pushw %si | ||
24 | pushw %di | ||
25 | movw %ax, %di | ||
26 | movw %dx, %si | ||
27 | pushw %cx | ||
28 | shrw $2, %cx | ||
29 | rep; movsl | ||
30 | popw %cx | ||
31 | andw $3, %cx | ||
32 | rep; movsb | ||
33 | popw %di | ||
34 | popw %si | ||
35 | ret | ||
36 | .size memcpy, .-memcpy | ||
37 | |||
38 | .globl memset | ||
39 | .type memset, @function | ||
40 | memset: | ||
41 | pushw %di | ||
42 | movw %ax, %di | ||
43 | movzbl %dl, %eax | ||
44 | imull $0x01010101,%eax | ||
45 | pushw %cx | ||
46 | shrw $2, %cx | ||
47 | rep; stosl | ||
48 | popw %cx | ||
49 | andw $3, %cx | ||
50 | rep; stosb | ||
51 | popw %di | ||
52 | ret | ||
53 | .size memset, .-memset | ||
54 | |||
55 | .globl copy_from_fs | ||
56 | .type copy_from_fs, @function | ||
57 | copy_from_fs: | ||
58 | pushw %ds | ||
59 | pushw %fs | ||
60 | popw %ds | ||
61 | call memcpy | ||
62 | popw %ds | ||
63 | ret | ||
64 | .size copy_from_fs, .-copy_from_fs | ||
65 | |||
66 | .globl copy_to_fs | ||
67 | .type copy_to_fs, @function | ||
68 | copy_to_fs: | ||
69 | pushw %es | ||
70 | pushw %fs | ||
71 | popw %es | ||
72 | call memcpy | ||
73 | popw %es | ||
74 | ret | ||
75 | .size copy_to_fs, .-copy_to_fs | ||
76 | |||
77 | #if 0 /* Not currently used, but can be enabled as needed */ | ||
78 | |||
79 | .globl copy_from_gs | ||
80 | .type copy_from_gs, @function | ||
81 | copy_from_gs: | ||
82 | pushw %ds | ||
83 | pushw %gs | ||
84 | popw %ds | ||
85 | call memcpy | ||
86 | popw %ds | ||
87 | ret | ||
88 | .size copy_from_gs, .-copy_from_gs | ||
89 | .globl copy_to_gs | ||
90 | |||
91 | .type copy_to_gs, @function | ||
92 | copy_to_gs: | ||
93 | pushw %es | ||
94 | pushw %gs | ||
95 | popw %es | ||
96 | call memcpy | ||
97 | popw %es | ||
98 | ret | ||
99 | .size copy_to_gs, .-copy_to_gs | ||
100 | |||
101 | #endif | ||
diff --git a/arch/i386/boot/string.c b/arch/i386/boot/string.c new file mode 100644 index 000000000000..481a22097781 --- /dev/null +++ b/arch/i386/boot/string.c | |||
@@ -0,0 +1,52 @@ | |||
1 | /* -*- linux-c -*- ------------------------------------------------------- * | ||
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 | * arch/i386/boot/string.c | ||
13 | * | ||
14 | * Very basic string functions | ||
15 | */ | ||
16 | |||
17 | #include "boot.h" | ||
18 | |||
19 | int strcmp(const char *str1, const char *str2) | ||
20 | { | ||
21 | const unsigned char *s1 = (const unsigned char *)str1; | ||
22 | const unsigned char *s2 = (const unsigned char *)str2; | ||
23 | int delta = 0; | ||
24 | |||
25 | while (*s1 || *s2) { | ||
26 | delta = *s2 - *s1; | ||
27 | if (delta) | ||
28 | return delta; | ||
29 | s1++; | ||
30 | s2++; | ||
31 | } | ||
32 | return 0; | ||
33 | } | ||
34 | |||
35 | size_t strnlen(const char *s, size_t maxlen) | ||
36 | { | ||
37 | const char *es = s; | ||
38 | while (*es && maxlen) { | ||
39 | es++; | ||
40 | maxlen--; | ||
41 | } | ||
42 | |||
43 | return (es - s); | ||
44 | } | ||
45 | |||
46 | unsigned int atou(const char *s) | ||
47 | { | ||
48 | unsigned int i = 0; | ||
49 | while (isdigit(*s)) | ||
50 | i = i * 10 + (*s++ - '0'); | ||
51 | return i; | ||
52 | } | ||