Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5be86566 authored by H. Peter Anvin's avatar H. Peter Anvin Committed by Linus Torvalds
Browse files

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: default avatarH. Peter Anvin <hpa@zytor.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent ad7e906d
Loading
Loading
Loading
Loading

arch/i386/boot/copy.S

0 → 100644
+101 −0
Original line number Diff line number Diff line
/* ----------------------------------------------------------------------- *
 *
 *   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 −0
Original line number Diff line number Diff line
/* -*- 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;
}