Skip to content

Commit

Permalink
String-handling functions for the new x86 setup code.
Browse files Browse the repository at this point in the history
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
Show file tree
Hide file tree
Showing 2 changed files with 153 additions and 0 deletions.
101 changes: 101 additions & 0 deletions arch/i386/boot/copy.S
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
52 changes: 52 additions & 0 deletions arch/i386/boot/string.c
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;
}

0 comments on commit 5be8656

Please sign in to comment.