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:
Родитель
ad7e906d56
Коммит
5be8656615
|
@ -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
|
|
@ -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;
|
||||
}
|
Загрузка…
Ссылка в новой задаче