summaryrefslogtreecommitdiff
path: root/sys/lib/libkern
diff options
context:
space:
mode:
Diffstat (limited to 'sys/lib/libkern')
-rw-r--r--sys/lib/libkern/arch/mips64/DEFS.h3
-rw-r--r--sys/lib/libkern/arch/mips64/Makefile.inc12
-rw-r--r--sys/lib/libkern/arch/mips64/SYS.h44
-rw-r--r--sys/lib/libkern/arch/mips64/bcmp.S82
-rw-r--r--sys/lib/libkern/arch/mips64/bcopy.S96
-rw-r--r--sys/lib/libkern/arch/mips64/bzero.S39
-rw-r--r--sys/lib/libkern/arch/mips64/ffs.S21
-rw-r--r--sys/lib/libkern/arch/mips64/htonl.S23
-rw-r--r--sys/lib/libkern/arch/mips64/htons.S19
-rw-r--r--sys/lib/libkern/arch/mips64/strcmp.S30
-rw-r--r--sys/lib/libkern/arch/mips64/strlen.S19
11 files changed, 388 insertions, 0 deletions
diff --git a/sys/lib/libkern/arch/mips64/DEFS.h b/sys/lib/libkern/arch/mips64/DEFS.h
new file mode 100644
index 00000000000..43e777c22cc
--- /dev/null
+++ b/sys/lib/libkern/arch/mips64/DEFS.h
@@ -0,0 +1,3 @@
+/* $OpenBSD: DEFS.h,v 1.1 2004/08/11 10:29:59 pefo Exp $ */
+
+#include <machine/asm.h>
diff --git a/sys/lib/libkern/arch/mips64/Makefile.inc b/sys/lib/libkern/arch/mips64/Makefile.inc
new file mode 100644
index 00000000000..218798c2d1f
--- /dev/null
+++ b/sys/lib/libkern/arch/mips64/Makefile.inc
@@ -0,0 +1,12 @@
+# $OpenBSD: Makefile.inc,v 1.1 2004/08/11 10:29:59 pefo Exp $
+# $NetBSD: Makefile.inc,v 1.4 1996/04/13 01:17:46 cgd Exp $
+#
+# There are likely more that we will notice when we go native
+
+SRCS+= __main.c imax.c imin.c lmax.c lmin.c max.c min.c ulmax.c ulmin.c \
+ memchr.c memcmp.c memset.c strcmp.c \
+ bcmp.S bcopy.S bzero.S strcmp.c strlcat.c strlcpy.c \
+ ffs.S htonl.S \
+ htons.S strcmp.S strlen.S strncmp.c random.c scanc.c skpc.c strncpy.c \
+ strncasecmp.c
+
diff --git a/sys/lib/libkern/arch/mips64/SYS.h b/sys/lib/libkern/arch/mips64/SYS.h
new file mode 100644
index 00000000000..83570fd0a02
--- /dev/null
+++ b/sys/lib/libkern/arch/mips64/SYS.h
@@ -0,0 +1,44 @@
+/* * $OpenBSD: SYS.h,v 1.1 2004/08/11 10:29:59 pefo Exp $*/
+/*-
+ * 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.
+ *
+ * from: @(#)SYS.h 5.5 (Berkeley) 5/7/91
+ */
+
+#include <machine/asm.h>
+#include <sys/syscall.h>
+
+#define SYSCALL(x) .text; .align 2; 2: jmp PIC_PLT(cerror); ENTRY(x); movl $(SYS_/**/x),%eax; int $0x80; jc 2b
+#define RSYSCALL(x) SYSCALL(x); ret
+#define PSEUDO(x,y) ENTRY(x); movl $(SYS_/**/y),%eax; int $0x80; ret
+#define CALL(x,y) call PIC_PLT(_/**/y); addl $4*x,%esp
+
+ .globl cerror
diff --git a/sys/lib/libkern/arch/mips64/bcmp.S b/sys/lib/libkern/arch/mips64/bcmp.S
new file mode 100644
index 00000000000..1e780135814
--- /dev/null
+++ b/sys/lib/libkern/arch/mips64/bcmp.S
@@ -0,0 +1,82 @@
+/* $OpenBSD: bcmp.S,v 1.1 2004/08/11 10:29:59 pefo Exp $ */
+
+#include "DEFS.h"
+
+
+/*
+ * bcmp(s1, s2, n)
+ */
+LEAF(bcmp)
+ .set noreorder
+ blt a2, 16, smallcmp # is it worth any trouble?
+ xor v0, a0, a1 # compare low two bits of addresses
+ and v0, v0, 3
+ subu a3, zero, a1 # compute # bytes to word align address
+ bne v0, zero, unalignedcmp # not possible to align addresses
+ and a3, a3, 3
+
+ beq a3, zero, 1f
+ subu a2, a2, a3 # subtract from remaining count
+ move v0, v1 # init v0,v1 so unmodified bytes match
+ LWHI v0, 0(a0) # read 1, 2, or 3 bytes
+ LWHI v1, 0(a1)
+ addu a1, a1, a3
+ bne v0, v1, nomatch
+ addu a0, a0, a3
+1:
+ and a3, a2, ~3 # compute number of whole words left
+ subu a2, a2, a3 # which has to be >= (16-3) & ~3
+ addu a3, a3, a0 # compute ending address
+2:
+ lw v0, 0(a0) # compare words
+ lw v1, 0(a1)
+ addu a0, a0, 4
+ bne v0, v1, nomatch
+ addu a1, a1, 4
+ bne a0, a3, 2b
+ nop
+ b smallcmp # finish remainder
+ nop
+unalignedcmp:
+ beq a3, zero, 2f
+ subu a2, a2, a3 # subtract from remaining count
+ addu a3, a3, a0 # compute ending address
+1:
+ lbu v0, 0(a0) # compare bytes until a1 word aligned
+ lbu v1, 0(a1)
+ addu a0, a0, 1
+ bne v0, v1, nomatch
+ addu a1, a1, 1
+ bne a0, a3, 1b
+ nop
+2:
+ and a3, a2, ~3 # compute number of whole words left
+ subu a2, a2, a3 # which has to be >= (16-3) & ~3
+ addu a3, a3, a0 # compute ending address
+3:
+ LWHI v0, 0(a0) # compare words a0 unaligned, a1 aligned
+ LWLO v0, 3(a0)
+ lw v1, 0(a1)
+ addu a0, a0, 4
+ bne v0, v1, nomatch
+ addu a1, a1, 4
+ bne a0, a3, 3b
+ nop
+smallcmp:
+ ble a2, zero, match
+ addu a3, a2, a0 # compute ending address
+1:
+ lbu v0, 0(a0)
+ lbu v1, 0(a1)
+ addu a0, a0, 1
+ bne v0, v1, nomatch
+ addu a1, a1, 1
+ bne a0, a3, 1b
+ nop
+match:
+ j ra
+ move v0, zero
+nomatch:
+ j ra
+ li v0, 1
+END(bcmp)
diff --git a/sys/lib/libkern/arch/mips64/bcopy.S b/sys/lib/libkern/arch/mips64/bcopy.S
new file mode 100644
index 00000000000..abf52789ee2
--- /dev/null
+++ b/sys/lib/libkern/arch/mips64/bcopy.S
@@ -0,0 +1,96 @@
+/* $OpenBSD: bcopy.S,v 1.1 2004/08/11 10:29:59 pefo Exp $ */
+
+#include "DEFS.h"
+
+
+/*
+ * memcpy(to, from, len)
+ * {ov}bcopy(from, to, len)
+ */
+LEAF(memcpy)
+ .set noreorder
+ move v0, a0 # swap from and to
+ move a0, a1
+ move a1, v0
+ALEAF(bcopy)
+ALEAF(ovbcopy)
+ .set noreorder
+ addu t0, a0, a2 # t0 = end of s1 region
+ sltu t1, a1, t0
+ sltu t2, a0, a1
+ and t1, t1, t2 # t1 = true if from < to < (from+len)
+ beq t1, zero, forward # non overlapping, do forward copy
+ slt t2, a2, 12 # check for small copy
+
+ ble a2, zero, 2f
+ addu t1, a1, a2 # t1 = end of to region
+1:
+ lb v1, -1(t0) # copy bytes backwards,
+ subu t0, t0, 1 # doesnt happen often so do slow way
+ subu t1, t1, 1
+ bne t0, a0, 1b
+ sb v1, 0(t1)
+2:
+ j ra
+ nop
+forward:
+ bne t2, zero, smallcpy # do a small bcopy
+ xor v1, a0, a1 # compare low two bits of addresses
+ and v1, v1, 3
+ subu a3, zero, a1 # compute # bytes to word align address
+ beq v1, zero, aligned # addresses can be word aligned
+ and a3, a3, 3
+
+ beq a3, zero, 1f
+ subu a2, a2, a3 # subtract from remaining count
+ LWHI v1, 0(a0) # get next 4 bytes (unaligned)
+ LWLO v1, 3(a0)
+ addu a0, a0, a3
+ SWHI v1, 0(a1) # store 1, 2, or 3 bytes to align a1
+ addu a1, a1, a3
+1:
+ and v1, a2, 3 # compute number of words left
+ subu a3, a2, v1
+ move a2, v1
+ addu a3, a3, a0 # compute ending address
+2:
+ LWHI v1, 0(a0) # copy words a0 unaligned, a1 aligned
+ LWLO v1, 3(a0)
+ addu a0, a0, 4
+ sw v1, 0(a1)
+ addu a1, a1, 4
+ bne a0, a3, 2b
+ nop # We have to do this mmu-bug.
+ b smallcpy
+ nop
+aligned:
+ beq a3, zero, 1f
+ subu a2, a2, a3 # subtract from remaining count
+ LWHI v1, 0(a0) # copy 1, 2, or 3 bytes to align
+ addu a0, a0, a3
+ SWHI v1, 0(a1)
+ addu a1, a1, a3
+1:
+ and v1, a2, 3 # compute number of whole words left
+ subu a3, a2, v1
+ move a2, v1
+ addu a3, a3, a0 # compute ending address
+2:
+ lw v1, 0(a0) # copy words
+ addu a0, a0, 4
+ sw v1, 0(a1)
+ bne a0, a3, 2b
+ addu a1, a1, 4
+smallcpy:
+ ble a2, zero, 2f
+ addu a3, a2, a0 # compute ending address
+1:
+ lbu v1, 0(a0) # copy bytes
+ addu a0, a0, 1
+ sb v1, 0(a1)
+ bne a0, a3, 1b
+ addu a1, a1, 1 # MMU BUG ? can not do -1(a1) at 0x80000000!!
+2:
+ j ra
+ nop
+END(memcpy)
diff --git a/sys/lib/libkern/arch/mips64/bzero.S b/sys/lib/libkern/arch/mips64/bzero.S
new file mode 100644
index 00000000000..544b1a237d6
--- /dev/null
+++ b/sys/lib/libkern/arch/mips64/bzero.S
@@ -0,0 +1,39 @@
+/* $OpenBSD: bzero.S,v 1.1 2004/08/11 10:29:59 pefo Exp $ */
+
+#include "DEFS.h"
+
+
+/*
+ * bzero(s1, n)
+ */
+LEAF(bzero)
+ALEAF(blkclr)
+ .set noreorder
+ blt a1, 12, smallclr # small amount to clear?
+ subu a3, zero, a0 # compute # bytes to word align address
+ and a3, a3, 3
+ beq a3, zero, 1f # skip if word aligned
+ subu a1, a1, a3 # subtract from remaining count
+ SWHI zero, 0(a0) # clear 1, 2, or 3 bytes to align
+ addu a0, a0, a3
+1:
+ and v0, a1, 3 # compute number of words left
+ subu a3, a1, v0
+ move a1, v0
+ addu a3, a3, a0 # compute ending address
+2:
+ addu a0, a0, 4 # clear words
+ bne a0, a3, 2b # unrolling loop does not help
+ sw zero, -4(a0) # since we are limited by memory speed
+smallclr:
+ ble a1, zero, 2f
+ addu a3, a1, a0 # compute ending address
+1:
+ addu a0, a0, 1 # clear bytes
+ bne a0, a3, 1b
+ sb zero, -1(a0)
+2:
+ j ra
+ nop
+END(bzero)
+
diff --git a/sys/lib/libkern/arch/mips64/ffs.S b/sys/lib/libkern/arch/mips64/ffs.S
new file mode 100644
index 00000000000..8a8559da022
--- /dev/null
+++ b/sys/lib/libkern/arch/mips64/ffs.S
@@ -0,0 +1,21 @@
+/* $OpenBSD: ffs.S,v 1.1 2004/08/11 10:29:59 pefo Exp $ */
+
+#include "DEFS.h"
+
+
+/*
+ * bit = ffs(value)
+ */
+LEAF(ffs)
+ .set noreorder
+ beq a0, zero, 2f
+ move v0, zero
+1:
+ and v1, a0, 1 # bit set?
+ addu v0, v0, 1
+ beq v1, zero, 1b # no, continue
+ srl a0, a0, 1
+2:
+ j ra
+ nop
+END(ffs)
diff --git a/sys/lib/libkern/arch/mips64/htonl.S b/sys/lib/libkern/arch/mips64/htonl.S
new file mode 100644
index 00000000000..8d1c96a835c
--- /dev/null
+++ b/sys/lib/libkern/arch/mips64/htonl.S
@@ -0,0 +1,23 @@
+/* $OpenBSD: htonl.S,v 1.1 2004/08/11 10:29:59 pefo Exp $ */
+
+#include "DEFS.h"
+
+
+/*
+ * netorder = htonl(hostorder)
+ * hostorder = ntohl(netorder)
+ */
+LEAF(htonl) # a0 = 0x11223344, return 0x44332211
+ALEAF(ntohl)
+ .set noreorder
+ srl v1, a0, 24 # v1 = 0x00000011
+ sll v0, a0, 24 # v0 = 0x44000000
+ or v0, v0, v1
+ and v1, a0, 0xff00
+ sll v1, v1, 8 # v1 = 0x00330000
+ or v0, v0, v1
+ srl v1, a0, 8
+ and v1, v1, 0xff00 # v1 = 0x00002200
+ j ra
+ or v0, v0, v1
+END(htonl)
diff --git a/sys/lib/libkern/arch/mips64/htons.S b/sys/lib/libkern/arch/mips64/htons.S
new file mode 100644
index 00000000000..644d2ef1c2a
--- /dev/null
+++ b/sys/lib/libkern/arch/mips64/htons.S
@@ -0,0 +1,19 @@
+/* $OpenBSD: htons.S,v 1.1 2004/08/11 10:29:59 pefo Exp $ */
+
+#include "DEFS.h"
+
+
+/*
+ * netorder = htons(hostorder)
+ * hostorder = ntohs(netorder)
+ */
+LEAF(htons)
+ALEAF(ntohs)
+ .set noreorder
+ srl v0, a0, 8
+ and v0, v0, 0xff
+ sll v1, a0, 8
+ and v1, v1, 0xff00
+ j ra
+ or v0, v0, v1
+END(htons)
diff --git a/sys/lib/libkern/arch/mips64/strcmp.S b/sys/lib/libkern/arch/mips64/strcmp.S
new file mode 100644
index 00000000000..d2e34de98be
--- /dev/null
+++ b/sys/lib/libkern/arch/mips64/strcmp.S
@@ -0,0 +1,30 @@
+/* $OpenBSD: strcmp.S,v 1.1 2004/08/11 10:29:59 pefo Exp $ */
+
+#include "DEFS.h"
+
+
+/*
+ * NOTE: this version assumes unsigned chars in order to be "8 bit clean".
+ */
+LEAF(strcmp)
+ .set noreorder
+1:
+ lbu t0, 0(a0) # get two bytes and compare them
+ lbu t1, 0(a1)
+ beq t0, zero, LessOrEq # end of first string?
+ nop
+ bne t0, t1, NotEq
+ nop
+ lbu t0, 1(a0) # unroll loop
+ lbu t1, 1(a1)
+ beq t0, zero, LessOrEq # end of first string?
+ addu a0, a0, 2
+ beq t0, t1, 1b
+ addu a1, a1, 2
+NotEq:
+ j ra
+ subu v0, t0, t1
+LessOrEq:
+ j ra
+ subu v0, zero, t1
+END(strcmp)
diff --git a/sys/lib/libkern/arch/mips64/strlen.S b/sys/lib/libkern/arch/mips64/strlen.S
new file mode 100644
index 00000000000..a92ea33134a
--- /dev/null
+++ b/sys/lib/libkern/arch/mips64/strlen.S
@@ -0,0 +1,19 @@
+/* $OpenBSD: strlen.S,v 1.1 2004/08/11 10:29:59 pefo Exp $ */
+
+#include "DEFS.h"
+
+
+/*
+ * strlen(str)
+ */
+LEAF(strlen)
+ .set noreorder
+ addu v1, a0, 1
+1:
+ lb v0, 0(a0) # get byte from string
+ addu a0, a0, 1 # increment pointer
+ bne v0, zero, 1b # continue if not end
+ nop
+ j ra
+ subu v0, a0, v1 # compute length - 1 for '\0' char
+END(strlen)