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>
This commit is contained in:
parent
ad7e906d56
commit
5be8656615
101
arch/i386/boot/copy.S
Normal file
101
arch/i386/boot/copy.S
Normal file
@ -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
|
52
arch/i386/boot/string.c
Normal file
52
arch/i386/boot/string.c
Normal file
@ -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;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user