Module Name:    src
Committed By:   rin
Date:           Thu Mar  5 00:54:13 UTC 2020

Modified Files:
        src/sys/arch/powerpc/ibm4xx: copyinstr.c copyoutstr.c

Log Message:
copy{in,out}str: sync style with booke.

- early return in case of len == 0
- *done = 0 on fault


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/powerpc/ibm4xx/copyinstr.c \
    src/sys/arch/powerpc/ibm4xx/copyoutstr.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/powerpc/ibm4xx/copyinstr.c
diff -u src/sys/arch/powerpc/ibm4xx/copyinstr.c:1.9 src/sys/arch/powerpc/ibm4xx/copyinstr.c:1.10
--- src/sys/arch/powerpc/ibm4xx/copyinstr.c:1.9	Sat Mar 20 23:31:29 2010
+++ src/sys/arch/powerpc/ibm4xx/copyinstr.c	Thu Mar  5 00:54:13 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: copyinstr.c,v 1.9 2010/03/20 23:31:29 chs Exp $	*/
+/*	$NetBSD: copyinstr.c,v 1.10 2020/03/05 00:54:13 rin Exp $	*/
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: copyinstr.c,v 1.9 2010/03/20 23:31:29 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: copyinstr.c,v 1.10 2020/03/05 00:54:13 rin Exp $");
 
 #include <sys/param.h>
 #include <uvm/uvm_extern.h>
@@ -49,11 +49,16 @@ copyinstr(const void *udaddr, void *kadd
 	int rv, msr, pid, tmp, ctx;
 	struct faultbuf env;
 
+	if (__predict_false(len == 0)) {
+		if (done)
+			*done = 0;
+		return 0;
+	}
+
 	if ((rv = setfault(&env))) {
 		curpcb->pcb_onfault = NULL;
-		/* XXXX -- len may be lost on a fault */
 		if (done)
-			*done = len;
+			*done = 0;
 		return rv;
 	}
 
@@ -63,34 +68,32 @@ copyinstr(const void *udaddr, void *kadd
 		ctx = pm->pm_ctx;
 	}
 
-	if (len) {
-		__asm volatile("mtctr %3;"		/* Set up counter */
-			"mfmsr %0;"			/* Save MSR */
-			"li %1,0x20; "
-			"andc %1,%0,%1; mtmsr %1;"	/* Disable IMMU */
-			"mfpid %1;"			/* Save old PID */
-			"sync; isync;"
-
-			"li %3,0;"			/* Clear len */
-
-			"1: "
-			"mtpid %4; sync;"		/* Load user ctx */
-			"lbz %2,0(%5); addi %5,%5,1;"	/* Load byte */
-			"sync; isync;"
-			"mtpid %1;sync;"
-			"stb %2,0(%6);  dcbf 0,%6; addi %6,%6,1;"	/* Store kernel byte */
-			"sync; isync;"
-			"addi %3,%3,1;"			/* Inc len */
-			"or. %2,%2,%2;"
-			"bdnzf 2,1b;"			/*
-							 * while(ctr-- && !zero)
-							 */
-
-			"mtpid %1; mtmsr %0;"		/* Restore PID, MSR */
-			"sync; isync;"
-			: "=&r" (msr), "=&r" (pid), "=&r" (tmp), "+b" (len)
-			: "r" (ctx), "b" (udaddr), "b" (kaddr));
-	}
+	__asm volatile(
+		"mtctr %3;"			/* Set up counter */
+		"mfmsr %0;"			/* Save MSR */
+		"li %1,0x20;"
+		"andc %1,%0,%1; mtmsr %1;"	/* Disable IMMU */
+		"mfpid %1;"			/* Save old PID */
+		"sync; isync;"
+
+		"li %3,0;"			/* Clear len */
+
+		"1: "
+		"mtpid %4; sync;"		/* Load user ctx */
+		"lbz %2,0(%5); addi %5,%5,1;"	/* Load byte */
+		"sync; isync;"
+		"mtpid %1;sync;"
+		"stb %2,0(%6); dcbf 0,%6; addi %6,%6,1;"
+						/* Store kernel byte */
+		"sync; isync;"
+		"addi %3,%3,1;"			/* Inc len */
+		"or. %2,%2,%2;"
+		"bdnzf 2,1b;"			/* while(ctr-- && !zero) */
+		"mtpid %1; mtmsr %0;"		/* Restore PID, MSR */
+		"sync; isync;"
+		: "=&r" (msr), "=&r" (pid), "=&r" (tmp), "+b" (len)
+		: "r" (ctx), "b" (udaddr), "b" (kaddr));
+
 	curpcb->pcb_onfault = NULL;
 	if (done)
 		*done = len;
Index: src/sys/arch/powerpc/ibm4xx/copyoutstr.c
diff -u src/sys/arch/powerpc/ibm4xx/copyoutstr.c:1.9 src/sys/arch/powerpc/ibm4xx/copyoutstr.c:1.10
--- src/sys/arch/powerpc/ibm4xx/copyoutstr.c:1.9	Sat Mar 20 23:31:29 2010
+++ src/sys/arch/powerpc/ibm4xx/copyoutstr.c	Thu Mar  5 00:54:13 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: copyoutstr.c,v 1.9 2010/03/20 23:31:29 chs Exp $	*/
+/*	$NetBSD: copyoutstr.c,v 1.10 2020/03/05 00:54:13 rin Exp $	*/
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: copyoutstr.c,v 1.9 2010/03/20 23:31:29 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: copyoutstr.c,v 1.10 2020/03/05 00:54:13 rin Exp $");
 
 #include <sys/param.h>
 #include <uvm/uvm_extern.h>
@@ -49,11 +49,16 @@ copyoutstr(const void *kaddr, void *udad
 	int rv, msr, pid, tmp, ctx;
 	struct faultbuf env;
 
+	if (__predict_false(len == 0)) {
+		if (done)
+			*done = 0;
+		return 0;
+	}
+
 	if ((rv = setfault(&env))) {
 		curpcb->pcb_onfault = NULL;
-		/* XXXX -- len may be lost on a fault */
 		if (done)
-			*done = len;
+			*done = 0;
 		return rv;
 	}
 
@@ -63,34 +68,33 @@ copyoutstr(const void *kaddr, void *udad
 		ctx = pm->pm_ctx;
 	}
 
-	if (len) {
-		__asm volatile("mtctr %3;"		/* Set up counter */
-			"mfmsr %0;"			/* Save MSR */
-			"li %1,0x20; "
-			"andc %1,%0,%1; mtmsr %1;"	/* Disable IMMU */
-			"mfpid %1;"			/* Save old PID */
-			"sync; isync;"
-
-			"li %3,0;"			/* Clear len */
-
-			"1:"
-			"mtpid %1;sync;"
-			"lbz %2,0(%6); addi %6,%6,1;"	/* Store kernel byte */
-			"sync; isync;"
-			"mtpid %4; sync;"		/* Load user ctx */
-			"stb %2,0(%5);  dcbf 0,%5; addi %5,%5,1;"	/* Load byte */
-			"sync; isync;"
-			"addi %3,%3,1;"			/* Inc len */
-			"or. %2,%2,%2;"
-			"bdnzf 2,1b;"			/*
-							 * while(ctr-- && !zero)
-							 */
-
-			"mtpid %1; mtmsr %0;"		/* Restore PID, MSR */
-			"sync; isync;"
-			: "=&r" (msr), "=&r" (pid), "=&r" (tmp), "+b" (len)
-			: "r" (ctx), "b" (udaddr), "b" (kaddr));
-	}
+	__asm volatile(
+		"mtctr %3;"			/* Set up counter */
+		"mfmsr %0;"			/* Save MSR */
+		"li %1,0x20;"
+		"andc %1,%0,%1; mtmsr %1;"	/* Disable IMMU */
+		"mfpid %1;"			/* Save old PID */
+		"sync; isync;"
+
+		"li %3,0;"			/* Clear len */
+
+		"1:"
+		"mtpid %1;sync;"
+		"lbz %2,0(%6); addi %6,%6,1;"	/* Store kernel byte */
+		"sync; isync;"
+		"mtpid %4; sync;"		/* Load user ctx */
+		"stb %2,0(%5); dcbf 0,%5; addi %5,%5,1;"
+						/* Load byte */
+		"sync; isync;"
+		"addi %3,%3,1;"			/* Inc len */
+		"or. %2,%2,%2;"
+		"bdnzf 2,1b;"			/* while(ctr-- && !zero) */
+
+		"mtpid %1; mtmsr %0;"		/* Restore PID, MSR */
+		"sync; isync;"
+		: "=&r" (msr), "=&r" (pid), "=&r" (tmp), "+b" (len)
+		: "r" (ctx), "b" (udaddr), "b" (kaddr));
+
 	curpcb->pcb_onfault = NULL;
 	if (done)
 		*done = len;

Reply via email to