lkml.org 
[lkml]   [2007]   [Jul]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[x86 setup 16/33] String-handling functions for the new x86 setup code.
    Date
    From: H. Peter Anvin <hpa@zytor.com>

    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>
    ---
    arch/i386/boot/copy.S | 101 +++++++++++++++++++++++++++++++++++++++++++++++
    arch/i386/boot/string.c | 52 ++++++++++++++++++++++++
    2 files changed, 153 insertions(+), 0 deletions(-)
    create mode 100644 arch/i386/boot/copy.S
    create mode 100644 arch/i386/boot/string.c
    diff --git a/arch/i386/boot/copy.S b/arch/i386/boot/copy.S
    new file mode 100644
    index 0000000..ef127e5
    --- /dev/null
    +++ b/arch/i386/boot/copy.S
    @@ -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
    diff --git a/arch/i386/boot/string.c b/arch/i386/boot/string.c
    new file mode 100644
    index 0000000..481a220
    --- /dev/null
    +++ b/arch/i386/boot/string.c
    @@ -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;
    +}
    --
    1.5.2.2
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-07-11 21:27    [from the cache]
    ©2003-2011 Jasper Spaans