summaryrefslogtreecommitdiff
path: root/lib/libc/arch/i386
diff options
context:
space:
mode:
authorTed Unangst <tedu@cvs.openbsd.org>2014-12-02 03:07:14 +0000
committerTed Unangst <tedu@cvs.openbsd.org>2014-12-02 03:07:14 +0000
commit07f4e1768fdf06363e2a20a6c1d86ec7fe20a48c (patch)
tree1a46de493cc62d9545d4068c8f69bb3c490f06ab /lib/libc/arch/i386
parent2c8f99c494ec80fed39d8a7b7685b7235d931836 (diff)
sync bcopy/memmove/memcpy implementation with the kernel. ok deraadt
Diffstat (limited to 'lib/libc/arch/i386')
-rw-r--r--lib/libc/arch/i386/string/bcopy.S82
-rw-r--r--lib/libc/arch/i386/string/memcpy.S63
-rw-r--r--lib/libc/arch/i386/string/memmove.S62
3 files changed, 46 insertions, 161 deletions
diff --git a/lib/libc/arch/i386/string/bcopy.S b/lib/libc/arch/i386/string/bcopy.S
index bf3bcb1295c..c9361568da4 100644
--- a/lib/libc/arch/i386/string/bcopy.S
+++ b/lib/libc/arch/i386/string/bcopy.S
@@ -1,81 +1 @@
-/* $OpenBSD: bcopy.S,v 1.6 2014/11/30 19:43:56 deraadt Exp $ */
-
-/*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from locore.s.
- *
- * 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/asm.h>
-
-/*
- * bcopy(src, dst, cnt)
- * ws@tools.de (Wolfgang Solfrank, TooLs GmbH) +49-228-985800
- */
-
-ENTRY(bcopy)
- pushl %esi
- pushl %edi
-
- movl 12(%esp),%esi
- movl 16(%esp),%edi
-
- movl 20(%esp),%ecx
- movl %ecx,%edx
- cmpl %esi,%edi /* potentially overlapping? */
- jnb 1f
- cld /* nope, copy forwards. */
- shrl $2,%ecx /* copy by words */
- rep
- movsl
- movl %edx,%ecx
- andl $3,%ecx /* any bytes left? */
- rep
- movsb
- popl %edi
- popl %esi
- ret
-1:
- addl %ecx,%edi /* copy backwards. */
- addl %ecx,%esi
- std
- andl $3,%ecx /* any fractional bytes? */
- decl %edi
- decl %esi
- rep
- movsb
- movl %edx,%ecx
- shrl $2,%ecx
- subl $3,%esi
- subl $3,%edi
- rep
- movsl
- popl %edi
- popl %esi
- cld
- ret
+/* This code is contained in memmove.S */
diff --git a/lib/libc/arch/i386/string/memcpy.S b/lib/libc/arch/i386/string/memcpy.S
index 9c846004e67..c9361568da4 100644
--- a/lib/libc/arch/i386/string/memcpy.S
+++ b/lib/libc/arch/i386/string/memcpy.S
@@ -1,62 +1 @@
-/* $OpenBSD: memcpy.S,v 1.4 2014/11/30 19:43:56 deraadt Exp $ */
-
-/*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from locore.s.
- *
- * 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/asm.h>
-
-/*
- * memcpy(src, dst, cnt)
- * ws@tools.de (Wolfgang Solfrank, TooLs GmbH) +49-228-985800
- */
-
-ENTRY(memcpy)
- pushl %esi
- pushl %edi
-
- movl 12(%esp),%edi
- movl 16(%esp),%esi
- movl %edi, %eax
-
- movl 20(%esp),%ecx
- movl %ecx,%edx
-
- cld /* nope, copy forwards. */
- shrl $2,%ecx /* copy by words */
- rep
- movsl
- movl %edx,%ecx
- andl $3,%ecx /* any bytes left? */
- rep
- movsb
- popl %edi
- popl %esi
- ret
+/* This code is contained in memmove.S */
diff --git a/lib/libc/arch/i386/string/memmove.S b/lib/libc/arch/i386/string/memmove.S
index 4859e3744fd..a1621ec1f1e 100644
--- a/lib/libc/arch/i386/string/memmove.S
+++ b/lib/libc/arch/i386/string/memmove.S
@@ -1,10 +1,12 @@
-/* $OpenBSD: memmove.S,v 1.4 2014/11/30 19:43:56 deraadt Exp $ */
+/* $OpenBSD: memmove.S,v 1.5 2014/12/02 03:07:13 tedu 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 locore.s.
+ * 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
@@ -31,46 +33,69 @@
* SUCH DAMAGE.
*/
+#include <machine/param.h>
#include <machine/asm.h>
/*
- * memmove(src, dst, cnt)
- * ws@tools.de (Wolfgang Solfrank, TooLs GmbH) +49-228-985800
+ * Emulate bcopy() by swapping the first two arguments, and jumping
+ * into memmove(), which handles overlapping regions.
*/
+ENTRY(bcopy)
+ pushl %esi
+ pushl %edi
+ movl 12(%esp),%esi
+ movl 16(%esp),%edi
+ jmp docopy
+/*
+ * memmove(caddr_t dst, caddr_t src, size_t len);
+ * Copy len bytes, coping with overlapping space.
+ */
ENTRY(memmove)
pushl %esi
pushl %edi
-
movl 12(%esp),%edi
movl 16(%esp),%esi
- movl %edi, %eax
-
+docopy:
+ movl 20(%esp),%ecx
+ movl %edi,%eax
+ subl %esi,%eax
+ cmpl %ecx,%eax # overlapping?
+ jb 1f
+ jmp docopyf # nope
+/*
+ * memcpy() doesn't worry about overlap and always copies forward
+ */
+// ENTRY(memcpy)
+ pushl %esi
+ pushl %edi
+ movl 12(%esp),%edi
+ movl 16(%esp),%esi
movl 20(%esp),%ecx
- movl %ecx,%edx
- cmpl %esi,%edi /* potentially overlapping? */
- jnb 1f
- cld /* nope, copy forwards. */
- shrl $2,%ecx /* copy by words */
+docopyf:
+ movl %edi,%eax # setup return value for memcpy/memmove
+ shrl $2,%ecx # copy by 32-bit words
rep
movsl
- movl %edx,%ecx
- andl $3,%ecx /* any bytes left? */
+ movl 20(%esp),%ecx
+ andl $3,%ecx # any bytes left?
rep
movsb
popl %edi
popl %esi
ret
-1:
- addl %ecx,%edi /* copy backwards. */
+
+ _ALIGN_TEXT
+1: movl %edi,%eax # setup return value for memmove
+ addl %ecx,%edi # copy backward
addl %ecx,%esi
std
- andl $3,%ecx /* any fractional bytes? */
+ andl $3,%ecx # any fractional bytes?
decl %edi
decl %esi
rep
movsb
- movl %edx,%ecx
+ movl 20(%esp),%ecx # copy remainder by 32-bit words
shrl $2,%ecx
subl $3,%esi
subl $3,%edi
@@ -80,3 +105,4 @@ ENTRY(memmove)
popl %esi
cld
ret
+