diff options
author | 2013-06-17 17:50:07 +0000 | |
---|---|---|
committer | 2013-06-17 17:50:07 +0000 | |
commit | 795b391eb6edbb7e1a1705ddd6385391ce57c19c (patch) | |
tree | 2e9118c9cf9e6a2722f068a1d6ec7f60812eb9c1 /sys | |
parent | Add .St values for POSIX 1003.1d, 1003.1j, and 1003.1q (diff) | |
download | wireguard-openbsd-795b391eb6edbb7e1a1705ddd6385391ce57c19c.tar.xz wireguard-openbsd-795b391eb6edbb7e1a1705ddd6385391ce57c19c.zip |
m68k kernel memcpy/memmove/bcopy implementation in libkern, remove ovbcopy, fix for larger than 128k size copies. Parts from deraadt@, ok (and off-by-one fix) miod@
Diffstat (limited to 'sys')
-rw-r--r-- | sys/arch/m68k/conf/files.m68k | 3 | ||||
-rw-r--r-- | sys/arch/m68k/m68k/bcopy.s | 122 | ||||
-rw-r--r-- | sys/lib/libkern/arch/m68k/bcopy.S | 2 | ||||
-rw-r--r-- | sys/lib/libkern/arch/m68k/memcpy.S | 2 | ||||
-rw-r--r-- | sys/lib/libkern/arch/m68k/memmove.S | 133 |
5 files changed, 135 insertions, 127 deletions
diff --git a/sys/arch/m68k/conf/files.m68k b/sys/arch/m68k/conf/files.m68k index 755747f2c79..14397e816f1 100644 --- a/sys/arch/m68k/conf/files.m68k +++ b/sys/arch/m68k/conf/files.m68k @@ -1,7 +1,6 @@ -# $OpenBSD: files.m68k,v 1.21 2010/07/02 19:57:14 tedu Exp $ +# $OpenBSD: files.m68k,v 1.22 2013/06/17 17:50:07 jj Exp $ # $NetBSD: files.m68k,v 1.18 1997/06/06 23:15:28 veego Exp $ # -file arch/m68k/m68k/bcopy.s file arch/m68k/m68k/cachectl.c file arch/m68k/m68k/copy.s file arch/m68k/m68k/copypage.s diff --git a/sys/arch/m68k/m68k/bcopy.s b/sys/arch/m68k/m68k/bcopy.s index 2fdd0bb6ff5..e69de29bb2d 100644 --- a/sys/arch/m68k/m68k/bcopy.s +++ b/sys/arch/m68k/m68k/bcopy.s @@ -1,122 +0,0 @@ -/* $OpenBSD: bcopy.s,v 1.4 2013/02/02 13:32:06 miod Exp $ */ -/* $NetBSD: bcopy.s,v 1.1 1997/03/17 19:44:33 gwr Exp $ */ - -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * the Systems Programming Group of the University of Utah Computer - * Science Department. - * - * 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. - */ - -/* - * This is based on: src/lib/libc/arch/m68k/string/bcopy.S - * identified as: @(#)bcopy.s 5.1 (Berkeley) 5/12/90 - */ - -#include <machine/asm.h> - - .file "bcopy.s" - .text - -/* - * {ov}bcopy(from, to, len) - * memcpy(to, from, len) - * - * Works for counts up to 128K. - */ -ALTENTRY(memmove, memcpy) -ENTRY(memcpy) - movl %sp@(12),%d0 | get count - jeq Lbccpyexit | if zero, return - movl %sp@(8), %a0 | src address - movl %sp@(4), %a1 | dest address - jra Lbcdocopy | jump into bcopy -ALTENTRY(ovbcopy, bcopy) -ENTRY(bcopy) - movl %sp@(12),%d0 | get count - jeq Lbccpyexit | if zero, return - movl %sp@(4),%a0 | src address - movl %sp@(8),%a1 | dest address -Lbcdocopy: - cmpl %a1,%a0 | src before dest? - jlt Lbccpyback | yes, copy backwards (avoids overlap) - movl %a0,%d1 - btst #0,%d1 | src address odd? - jeq Lbccfeven | no, go check dest - movb %a0@+,%a1@+ | yes, copy a byte - subql #1,%d0 | update count - jeq Lbccpyexit | exit if done -Lbccfeven: - movl %a1,%d1 - btst #0,%d1 | dest address odd? - jne Lbccfbyte | yes, must copy by bytes - movl %d0,%d1 | no, get count - lsrl #2,%d1 | convert to longwords - jeq Lbccfbyte | no longwords, copy bytes - subql #1,%d1 | set up for dbf -Lbccflloop: - movl %a0@+,%a1@+ | copy longwords - dbf %d1,Lbccflloop | til done - andl #3,%d0 | get remaining count - jeq Lbccpyexit | done if none -Lbccfbyte: - subql #1,%d0 | set up for dbf -Lbccfbloop: - movb %a0@+,%a1@+ | copy bytes - dbf %d0,Lbccfbloop | til done -Lbccpyexit: - rts -Lbccpyback: - addl %d0,%a0 | add count to src - addl %d0,%a1 | add count to dest - movl %a0,%d1 - btst #0,%d1 | src address odd? - jeq Lbccbeven | no, go check dest - movb %a0@-,%a1@- | yes, copy a byte - subql #1,%d0 | update count - jeq Lbccpyexit | exit if done -Lbccbeven: - movl %a1,%d1 - btst #0,%d1 | dest address odd? - jne Lbccbbyte | yes, must copy by bytes - movl %d0,%d1 | no, get count - lsrl #2,%d1 | convert to longwords - jeq Lbccbbyte | no longwords, copy bytes - subql #1,%d1 | set up for dbf -Lbccblloop: - movl %a0@-,%a1@- | copy longwords - dbf %d1,Lbccblloop | til done - andl #3,%d0 | get remaining count - jeq Lbccpyexit | done if none -Lbccbbyte: - subql #1,%d0 | set up for dbf -Lbccbbloop: - movb %a0@-,%a1@- | copy bytes - dbf %d0,Lbccbbloop | til done - rts diff --git a/sys/lib/libkern/arch/m68k/bcopy.S b/sys/lib/libkern/arch/m68k/bcopy.S index b34338a26e6..38afdda4544 100644 --- a/sys/lib/libkern/arch/m68k/bcopy.S +++ b/sys/lib/libkern/arch/m68k/bcopy.S @@ -1 +1 @@ -/* No code here since kernel implements this itself */ +/* Implemented in memmove.S */ diff --git a/sys/lib/libkern/arch/m68k/memcpy.S b/sys/lib/libkern/arch/m68k/memcpy.S index b34338a26e6..38afdda4544 100644 --- a/sys/lib/libkern/arch/m68k/memcpy.S +++ b/sys/lib/libkern/arch/m68k/memcpy.S @@ -1 +1 @@ -/* No code here since kernel implements this itself */ +/* Implemented in memmove.S */ diff --git a/sys/lib/libkern/arch/m68k/memmove.S b/sys/lib/libkern/arch/m68k/memmove.S index b34338a26e6..a6992690957 100644 --- a/sys/lib/libkern/arch/m68k/memmove.S +++ b/sys/lib/libkern/arch/m68k/memmove.S @@ -1 +1,132 @@ -/* No code here since kernel implements this itself */ +/* $OpenBSD: memmove.S,v 1.4 2013/06/17 17:50:07 jj Exp $ */ +/* $NetBSD: bcopy.s,v 1.1 1997/03/17 19:44:33 gwr Exp $ */ + +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * the Systems Programming Group of the University of Utah Computer + * Science Department. + * + * 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. + */ + +/* + * This is based on: src/lib/libc/arch/m68k/string/bcopy.S + * identified as: @(#)bcopy.s 5.1 (Berkeley) 5/12/90 + */ + +#include <machine/asm.h> + + .file "memmove.S" + .text + +/* + * bcopy(from, to, len) + * memmove(to, from, len): swap args and fall into bcopy + * memcpy(to, from, len): swap args, and fall into forward bcopy + * + */ +ENTRY(memcpy) + movl %sp@(12),%d0 | get count + jeq Lbccpyexit | if zero, return + movl %sp@(8), %a0 | src address + movl %sp@(4), %a1 | dest address + jra Lbcdocopyf | copy forward +ENTRY(memmove) + movl %sp@(12),%d0 | get count + jeq Lbccpyexit | if zero, return + movl %sp@(8), %a0 | src address + movl %sp@(4), %a1 | dest address + jra Lbcdocopy | jump into bcopy +ENTRY(bcopy) + movl %sp@(12),%d0 | get count + jeq Lbccpyexit | if zero, return + movl %sp@(4),%a0 | src address + movl %sp@(8),%a1 | dest address +Lbcdocopy: + cmpl %a1,%a0 | src before dest? + jlt Lbccpyback | yes, copy backwards (avoids overlap) +Lbcdocopyf: + movl %a0,%d1 + btst #0,%d1 | src address odd? + jeq Lbccfeven | no, go check dest + movb %a0@+,%a1@+ | yes, copy a byte + subql #1,%d0 | update count + jeq Lbccpyexit | exit if done +Lbccfeven: + movl %a1,%d1 + btst #0,%d1 | dest address odd? + jne Lbccfbyte | yes, must copy by bytes + movl %d0,%d1 | no, get count + lsrl #2,%d1 | convert to longwords + jeq Lbccfbyte | no longwords, copy bytes +Lbccflloop: + movl %a0@+,%a1@+ | copy longwords + subql #1,%d1 | decrement counter + jne Lbccflloop | til done + andl #3,%d0 | get remaining count + jeq Lbccpyexit | done if none +Lbccfbyte: +Lbccfbloop: + movb %a0@+,%a1@+ | copy bytes + subql #1,%d0 | decrement counter + jne Lbccfbloop | til done +Lbccpyexit: + movl %sp@(4),%d0 | dest address + moveal %d0,%a0 + rts +Lbccpyback: + addl %d0,%a0 | add count to src + addl %d0,%a1 | add count to dest + movl %a0,%d1 + btst #0,%d1 | src address odd? + jeq Lbccbeven | no, go check dest + movb %a0@-,%a1@- | yes, copy a byte + subql #1,%d0 | update count + jeq Lbccpyexit | exit if done +Lbccbeven: + movl %a1,%d1 + btst #0,%d1 | dest address odd? + jne Lbccbbyte | yes, must copy by bytes + movl %d0,%d1 | no, get count + lsrl #2,%d1 | convert to longwords + jeq Lbccbbyte | no longwords, copy bytes +Lbccblloop: + movl %a0@-,%a1@- | copy longwords + subql #1,%d1 | decrement counter + jne Lbccblloop | til done + andl #3,%d0 | get remaining count + jeq Lbccpyexit | done if none +Lbccbbyte: +Lbccbbloop: + movb %a0@-,%a1@- | copy bytes + subql #1,%d0 | decrement counter + jne Lbccbbloop | til done + movl %sp@(4),%d0 | dest address + moveal %d0,%a0 + rts + |