diff options
Diffstat (limited to 'sys/lib/libkern')
-rw-r--r-- | sys/lib/libkern/arch/i386/bcopy.S | 2 | ||||
-rw-r--r-- | sys/lib/libkern/arch/i386/memcpy.S | 2 | ||||
-rw-r--r-- | sys/lib/libkern/arch/i386/memmove.S | 112 |
3 files changed, 113 insertions, 3 deletions
diff --git a/sys/lib/libkern/arch/i386/bcopy.S b/sys/lib/libkern/arch/i386/bcopy.S index b34338a26e6..c9361568da4 100644 --- a/sys/lib/libkern/arch/i386/bcopy.S +++ b/sys/lib/libkern/arch/i386/bcopy.S @@ -1 +1 @@ -/* No code here since kernel implements this itself */ +/* This code is contained in memmove.S */ diff --git a/sys/lib/libkern/arch/i386/memcpy.S b/sys/lib/libkern/arch/i386/memcpy.S index b34338a26e6..c9361568da4 100644 --- a/sys/lib/libkern/arch/i386/memcpy.S +++ b/sys/lib/libkern/arch/i386/memcpy.S @@ -1 +1 @@ -/* No code here since kernel implements this itself */ +/* This code is contained in memmove.S */ diff --git a/sys/lib/libkern/arch/i386/memmove.S b/sys/lib/libkern/arch/i386/memmove.S index b34338a26e6..99a63f7497e 100644 --- a/sys/lib/libkern/arch/i386/memmove.S +++ b/sys/lib/libkern/arch/i386/memmove.S @@ -1 +1,111 @@ -/* No code here since kernel implements this itself */ +/* $OpenBSD: memmove.S,v 1.4 2013/06/13 02:26:15 deraadt Exp $ */ + +/*- + * Copyright (c) 1993, 1994, 1995 Charles M. Hannum. All rights reserved. + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <machine/param.h> +#include <machine/asm.h> + +/* + * Emulate memmove() by swapping the first two arguments, and jumping + * into bcopy(), which handles overlapping regions. + */ +ENTRY(memmove) + pushl %esi + pushl %edi + movl 12(%esp),%edi + movl 16(%esp),%esi + jmp docopy + +/* + * Emulate memcpy() by loading the first two arguments in reverse order + * and jumping into bcopy()'s forward copy code. + */ +ENTRY(memcpy) + pushl %esi + pushl %edi + movl 12(%esp),%edi + movl 16(%esp),%esi + movl 20(%esp),%ecx + jmp docopyf + +/* + * bcopy(caddr_t from, caddr_t to, size_t len); + * Copy len bytes, copying with overlapping space. + */ +ENTRY(bcopy) + pushl %esi + pushl %edi + movl 12(%esp),%esi + movl 16(%esp),%edi +docopy: + movl 20(%esp),%ecx + movl %edi,%eax + subl %esi,%eax + cmpl %ecx,%eax # overlapping? + jb 1f +docopyf: + movl %esi,%eax # setup return value for memcpy/memmove + cld # nope, copy forward + shrl $2,%ecx # copy by 32-bit words + rep + movsl + movl 20(%esp),%ecx + andl $3,%ecx # any bytes left? + rep + movsb + popl %edi + popl %esi + ret + + _ALIGN_TEXT +1: movl %edi,%eax # setup return value for memcpy/memmove + addl %ecx,%edi # copy backward + addl %ecx,%esi + std + andl $3,%ecx # any fractional bytes? + decl %edi + decl %esi + rep + movsb + movl 20(%esp),%ecx # copy remainder by 32-bit words + shrl $2,%ecx + subl $3,%esi + subl $3,%edi + rep + movsl + popl %edi + popl %esi + cld + ret + |