-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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>
- Loading branch information
H. Peter Anvin
authored and
Linus Torvalds
committed
Jul 12, 2007
1 parent
ad7e906
commit 5be8656
Showing
2 changed files
with
153 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
/* ----------------------------------------------------------------------- * | ||
* | ||
* 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. | ||
* | ||
* ----------------------------------------------------------------------- */ | ||
|
||
/* | ||
* arch/i386/boot/copy.S | ||
* | ||
* Memory copy routines | ||
*/ | ||
|
||
.code16gcc | ||
.text | ||
|
||
.globl memcpy | ||
.type memcpy, @function | ||
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 | ||
ret | ||
.size memcpy, .-memcpy | ||
|
||
.globl memset | ||
.type memset, @function | ||
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 | ||
ret | ||
.size memset, .-memset | ||
|
||
.globl copy_from_fs | ||
.type copy_from_fs, @function | ||
copy_from_fs: | ||
pushw %ds | ||
pushw %fs | ||
popw %ds | ||
call memcpy | ||
popw %ds | ||
ret | ||
.size copy_from_fs, .-copy_from_fs | ||
|
||
.globl copy_to_fs | ||
.type copy_to_fs, @function | ||
copy_to_fs: | ||
pushw %es | ||
pushw %fs | ||
popw %es | ||
call memcpy | ||
popw %es | ||
ret | ||
.size copy_to_fs, .-copy_to_fs | ||
|
||
#if 0 /* Not currently used, but can be enabled as needed */ | ||
|
||
.globl copy_from_gs | ||
.type copy_from_gs, @function | ||
copy_from_gs: | ||
pushw %ds | ||
pushw %gs | ||
popw %ds | ||
call memcpy | ||
popw %ds | ||
ret | ||
.size copy_from_gs, .-copy_from_gs | ||
.globl copy_to_gs | ||
|
||
.type copy_to_gs, @function | ||
copy_to_gs: | ||
pushw %es | ||
pushw %gs | ||
popw %es | ||
call memcpy | ||
popw %es | ||
ret | ||
.size copy_to_gs, .-copy_to_gs | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
/* -*- linux-c -*- ------------------------------------------------------- * | ||
* | ||
* 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. | ||
* | ||
* ----------------------------------------------------------------------- */ | ||
|
||
/* | ||
* arch/i386/boot/string.c | ||
* | ||
* Very basic string functions | ||
*/ | ||
|
||
#include "boot.h" | ||
|
||
int strcmp(const char *str1, const char *str2) | ||
{ | ||
const unsigned char *s1 = (const unsigned char *)str1; | ||
const unsigned char *s2 = (const unsigned char *)str2; | ||
int delta = 0; | ||
|
||
while (*s1 || *s2) { | ||
delta = *s2 - *s1; | ||
if (delta) | ||
return delta; | ||
s1++; | ||
s2++; | ||
} | ||
return 0; | ||
} | ||
|
||
size_t strnlen(const char *s, size_t maxlen) | ||
{ | ||
const char *es = s; | ||
while (*es && maxlen) { | ||
es++; | ||
maxlen--; | ||
} | ||
|
||
return (es - s); | ||
} | ||
|
||
unsigned int atou(const char *s) | ||
{ | ||
unsigned int i = 0; | ||
while (isdigit(*s)) | ||
i = i * 10 + (*s++ - '0'); | ||
return i; | ||
} |