Browse Source

Improved version of memset

Similar 20x improvement as the change to memmove

Also added profile scripts and changed error message in fileop

Change-Id: I2e34c3279d816d18f058bbd5605f4c2a8cd1c597
Signed-off-by: Keith Poole <keith.poole@gmail.com>
Keith Poole 8 years ago
parent
commit
1bf492b88e

+ 2 - 2
sys/include/libc.h

@@ -17,8 +17,8 @@
 /*
  * mem routines
  */
-extern	void*	memccpy(void*, void*, int, uint32_t);
-extern	void*	memset(void*, int, uint32_t);
+extern	void*	memccpy(void*, const void*, int, uint32_t);
+extern	void*	memset(void*, int, size_t);
 extern	int	memcmp(const void*, const void*, uint32_t);
 extern	void*	memcpy(void*, const void*, size_t);
 extern	void*	memmove(void*, const void*, size_t);

+ 1 - 1
sys/src/9/amd64/fns.h

@@ -155,7 +155,7 @@ Stackframe	*stackframe(void); /* l64v.S */
 void	stacksnippet(void);
 void	stopac(void);
 void	syncclock(void);
-void	syscall(int scallnr, Ureg *ureg);
+void	syscall(unsigned int scallnr, Ureg *ureg);
 void*	sysexecregs(uintptr_t, uint32_t, void*);
 uintptr_t	sysexecstack(uintptr_t, int);
 void	sysprocsetup(Proc*);

+ 3 - 4
sys/src/9/amd64/syscall.c

@@ -238,11 +238,11 @@ noerrorsleft(void)
 }
 
 int printallsyscalls;
-/* it should be unsigned. FIXME */
+
 void
-syscall(int badscallnr, Ureg *ureg)
+syscall(unsigned int scallnr, Ureg *ureg)
 {
-	// can only handle 4 args right now.
+	// can only handle 6 args right now.
 	uintptr_t a0, a1, a2, a3;
 	uintptr_t a4, a5;
 
@@ -253,7 +253,6 @@ syscall(int badscallnr, Ureg *ureg)
 	a4 = ureg->r8;
 	a5 = ureg->r9;
 	Proc *up = externup();
-	unsigned int scallnr = (unsigned int) badscallnr;
 	if (0) iprint("Syscall %d, %lx, %lx, %lx %lx %lx %lx\n", scallnr, a0, a1, a2, a3, a4, a5);
 	char *e;
 	uintptr_t	sp;

+ 0 - 1
sys/src/9/port/cpu_buffer.c

@@ -751,6 +751,5 @@ oprofread(void *va, int n)
 	}
 
 	len = qread(opq, va, n);
-	print("oprofread len=%d\n", len);
 	return len;
 }

+ 1 - 1
sys/src/cmd/iozone/fileop.c

@@ -523,7 +523,7 @@ dir_create(int x)
 	  ret = create(buf, OREAD, DMDIR | 0777);
 	  if(ret < 0)
 	  {
-	      print("Mkdir failed\n");
+	      print("Mkdir %s failed %r\n", buf);
 	      exits("mkdir");
 	  }
 	  close(ret);

+ 4 - 4
sys/src/libc/port/memmove.c

@@ -49,12 +49,12 @@ void *
 memmove(
 	void *dst0,
 	const void *src0,
-	register size_t length
+	size_t length
 	)
 {
-	register char *dst = dst0;
-	register const char *src = src0;
-	register size_t t;
+	char *dst = dst0;
+	const char *src = src0;
+	size_t t;
 
 	if (length == 0 || dst == src)		/* nothing to do */
 	    goto done;

+ 113 - 17
sys/src/libc/port/memset.c

@@ -1,24 +1,120 @@
 /*
- * This file is part of the UCB release of Plan 9. It is subject to the license
- * terms in the LICENSE file found in the top-level directory of this
- * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
- * part of the UCB release of Plan 9, including this file, may be copied,
- * modified, propagated, or distributed except according to the terms contained
- * in the LICENSE file.
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
  */
+/*
+ * Copyright (c) 1990, 1993
+ *      The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Mike Hibler and Chris Torek.
+ *
+ * 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. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed by the University of
+ *      California, Berkeley and its contributors.
+ * 4. 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 <u.h>
+#include <libc.h>
 
-#include	<u.h>
-#include	<libc.h>
+#define wsize   sizeof(uint64_t)
+#define wmask   (wsize - 1)
 
-void*
-memset(void *ap, int c, uint32_t n)
+void *
+memset(void* dest, int c0, size_t length)
 {
-	char *p;
+        size_t t;
+        uint64_t c = 0;
+        unsigned char *dst;
+
+        dst = dest;
+        /*
+         * If not enough words, just fill bytes.  A length >= 2 words
+         * guarantees that at least one of them is `complete' after
+         * any necessary alignment.  For instance:
+         *
+         *      |-----------|-----------|-----------|
+         *      |00|01|02|03|04|05|06|07|08|09|0A|00|
+         *                ^---------------------^
+         *               dst             dst+length-1
+         *
+         * but we use a minimum of 3 here since the overhead of the code
+         * to do word writes is substantial.
+         */ 
+        if (length < 3 * wsize) {
+                while (length != 0) {
+                        *dst++ = c0;
+                        --length;
+                }
+                return dest;
+        }
+
+        if ((c = (unsigned char)c0) != 0) {     /* Fill the word. */
+               c = (c << 8) | c;       
+               c = (c << 16) | c;
+               c = (c << 32) | c;      /* uint64_t is 64 bits. */
+        }
+        /* Align destination by filling in bytes. */
+        if ((t = (uintptr_t)dst & wmask) != 0) {
+                t = wsize - t;
+                length -= t;
+                do {
+                        *dst++ = c0;
+                } while (--t != 0);
+        }
+
+        /* Fill words.  Length was >= 2*words so we know t >= 1 here. */
+        t = length / wsize;
+        do {
+                *(uint64_t *)dst = c;
+                dst += wsize;
+        } while (--t != 0);
 
-	p = ap;
-	while(n > 0) {
-		*p++ = c;
-		n--;
-	}
-	return ap;
+        /* Mop up trailing bytes, if any. */
+        t = length & wmask;
+        if (t != 0)
+                do {
+                        *dst++ = c0;
+                } while (--t != 0);
+        return dest;
 }

+ 3 - 0
usr/harvey/bin/rc/profoff

@@ -0,0 +1,3 @@
+#!/bin/rc
+echo opstop >'#K/kpctl'
+cp '#K/kpoprofile' $1

+ 2 - 0
usr/harvey/bin/rc/profon

@@ -0,0 +1,2 @@
+#!/bin/rc
+echo opstart >'#K/kpctl'