Module Name:    src
Committed By:   maxv
Date:           Tue Jun 30 16:20:03 UTC 2020

Modified Files:
        src/sys/arch/aarch64/aarch64: copyinout.S
        src/sys/arch/alpha/alpha: locore.s
        src/sys/arch/amd64/amd64: copy.S
        src/sys/arch/arm/arm: copystr.S
        src/sys/arch/hppa/hppa: copy.S
        src/sys/arch/i386/i386: copy.S
        src/sys/arch/ia64/ia64: support.S
        src/sys/arch/m68k/m68k: copy.s
        src/sys/arch/mips/mips: copy.S
        src/sys/arch/powerpc/conf: files.powerpc
        src/sys/arch/riscv/riscv: trap.c
        src/sys/arch/sh3/sh3: locore_c.c
        src/sys/arch/sparc/sparc: locore.s
        src/sys/arch/sparc64/sparc64: copy.S
        src/sys/arch/usermode/usermode: copy.c
        src/sys/arch/vax/vax: subr.S
        src/sys/kern: subr_asan.c subr_csan.c subr_msan.c
        src/sys/lib/libkern: Makefile.libkern
        src/sys/sys: systm.h
Added Files:
        src/sys/lib/libkern: copystr.c
Removed Files:
        src/sys/arch/powerpc/powerpc: copystr.c

Log Message:
Make copystr() a MI C function, part of libkern and shared on all
architectures.

Notes:

 - On alpha and ia64 the function is kept but gets renamed locally to avoid
   symbol collision. This is because on these two arches, I am not sure
   whether the ASM callers do not rely on fixed registers, so I prefer to
   keep the ASM body for now.
 - On Vax, only the symbol is removed, because the body is used from other
   functions.
 - On RISC-V, this change fixes a bug: copystr() was just a wrapper around
   strlcpy(), but strlcpy() makes the operation less safe (strlen on the
   source beyond its size).
 - The kASan, kCSan and kMSan wrappers are removed, because now that
   copystr() is in C, the compiler transformations are applied to it,
   without the need for manual wrappers.

Could test on amd64 only, but should be fine.


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/aarch64/aarch64/copyinout.S
cvs rdiff -u -r1.124 -r1.125 src/sys/arch/alpha/alpha/locore.s
cvs rdiff -u -r1.33 -r1.34 src/sys/arch/amd64/amd64/copy.S
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/arm/arm/copystr.S
cvs rdiff -u -r1.24 -r1.25 src/sys/arch/hppa/hppa/copy.S
cvs rdiff -u -r1.31 -r1.32 src/sys/arch/i386/i386/copy.S
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/ia64/ia64/support.S
cvs rdiff -u -r1.48 -r1.49 src/sys/arch/m68k/m68k/copy.s
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/mips/mips/copy.S
cvs rdiff -u -r1.93 -r1.94 src/sys/arch/powerpc/conf/files.powerpc
cvs rdiff -u -r1.6 -r0 src/sys/arch/powerpc/powerpc/copystr.c
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/riscv/riscv/trap.c
cvs rdiff -u -r1.31 -r1.32 src/sys/arch/sh3/sh3/locore_c.c
cvs rdiff -u -r1.277 -r1.278 src/sys/arch/sparc/sparc/locore.s
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/sparc64/sparc64/copy.S
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/usermode/usermode/copy.c
cvs rdiff -u -r1.37 -r1.38 src/sys/arch/vax/vax/subr.S
cvs rdiff -u -r1.21 -r1.22 src/sys/kern/subr_asan.c
cvs rdiff -u -r1.8 -r1.9 src/sys/kern/subr_csan.c
cvs rdiff -u -r1.11 -r1.12 src/sys/kern/subr_msan.c
cvs rdiff -u -r1.48 -r1.49 src/sys/lib/libkern/Makefile.libkern
cvs rdiff -u -r0 -r1.1 src/sys/lib/libkern/copystr.c
cvs rdiff -u -r1.294 -r1.295 src/sys/sys/systm.h

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/aarch64/aarch64/copyinout.S
diff -u src/sys/arch/aarch64/aarch64/copyinout.S:1.9 src/sys/arch/aarch64/aarch64/copyinout.S:1.10
--- src/sys/arch/aarch64/aarch64/copyinout.S:1.9	Fri Sep 14 13:47:14 2018
+++ src/sys/arch/aarch64/aarch64/copyinout.S	Tue Jun 30 16:20:00 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: copyinout.S,v 1.9 2018/09/14 13:47:14 ryo Exp $ */
+/* $NetBSD: copyinout.S,v 1.10 2020/06/30 16:20:00 maxv Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -33,7 +33,7 @@
 #include <aarch64/asm.h>
 #include "assym.h"
 
-RCSID("$NetBSD: copyinout.S,v 1.9 2018/09/14 13:47:14 ryo Exp $");
+RCSID("$NetBSD: copyinout.S,v 1.10 2020/06/30 16:20:00 maxv Exp $");
 
 	.macro enter_cpu_onfault
 	stp	fp, lr, [sp, #-16]!	/* save fp, lr */
@@ -314,34 +314,6 @@ copyoutstr_done:
 END(copyoutstr)
 
 
-/* LINTSTUB: int copystr(const void *s, void *d, size_t len, size_t *done); */
-
-ENTRY(copystr)
-	enter_cpu_onfault
-
-	mov	x8, #0			/* error = 0 */
-
-	mov	x4, xzr			/* i = 0 */
-	cbz	x2, copystr_done	/* if (len == 0) goto done */
-copystr_loop:
-	ldrb	w5, [x0], #1		/* ch = src[i] */
-	strb	w5, [x1], #1		/* dst[i] = ch */
-	add	x4, x4, #1		/* i++ */
-	cbz	x5, copystr_done	/* if (ch == '\0') goto done */
-
-	cmp	x4, x2			/* if (i < len) goto loop */
-	bcc	copystr_loop
-	mov	x8, #ENAMETOOLONG	/* error = ENAMETOOLONG */
-
-copystr_done:
-	cbz	x3, 1f			/* if (done != NULL) *done = i */
-	str	x4, [x3]
-1:
-	exit_cpu_onfault
-	ret
-END(copystr)
-
-
 /* LINTSTUB: int kcopy(const void *src, void *dst, size_t len); */
 
 ENTRY(kcopy)

Index: src/sys/arch/alpha/alpha/locore.s
diff -u src/sys/arch/alpha/alpha/locore.s:1.124 src/sys/arch/alpha/alpha/locore.s:1.125
--- src/sys/arch/alpha/alpha/locore.s:1.124	Wed Jan  8 20:59:18 2020
+++ src/sys/arch/alpha/alpha/locore.s	Tue Jun 30 16:20:00 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: locore.s,v 1.124 2020/01/08 20:59:18 skrll Exp $ */
+/* $NetBSD: locore.s,v 1.125 2020/06/30 16:20:00 maxv Exp $ */
 
 /*-
  * Copyright (c) 1999, 2000, 2019 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
 
 #include <machine/asm.h>
 
-__KERNEL_RCSID(0, "$NetBSD: locore.s,v 1.124 2020/01/08 20:59:18 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: locore.s,v 1.125 2020/06/30 16:20:00 maxv Exp $");
 
 #include "assym.h"
 
@@ -744,12 +744,9 @@ LEAF_NOPROFILE(lwp_trampoline, 0)
 /**************************************************************************/
 
 /*
- * Copy a null-terminated string within the kernel's address space.
- * If lenp is not NULL, store the number of chars copied in *lenp
- *
- * int copystr(char *from, char *to, size_t len, size_t *lenp);
+ * XXX XXX XXX: Should be removed?
  */
-LEAF(copystr, 4)
+LEAF(alpha_copystr, 4)
 	LDGP(pv)
 
 	mov	a2, t0			/* t0 = i = len */
@@ -781,7 +778,7 @@ LEAF(copystr, 4)
 
 4:	mov	zero, v0		/* return 0. */
 	RET
-	END(copystr)
+	END(alpha_copystr)
 
 NESTED(copyinstr, 4, 16, ra, IM_RA|IM_S0, 0)
 	LDGP(pv)
@@ -800,7 +797,7 @@ NESTED(copyinstr, 4, 16, ra, IM_RA|IM_S0
 	ldq	at_reg, L_PCB(at_reg)
 	stq	v0, PCB_ONFAULT(at_reg)
 	.set at
-	CALL(copystr)				/* do the copy.		     */
+	CALL(alpha_copystr)			/* do the copy.		     */
 	.set noat
 	ldq	at_reg, 0(s0)			/* kill the fault handler.   */
 	ldq	at_reg, L_PCB(at_reg)
@@ -829,7 +826,7 @@ NESTED(copyoutstr, 4, 16, ra, IM_RA|IM_S
 	ldq	at_reg, L_PCB(at_reg)
 	stq	v0, PCB_ONFAULT(at_reg)
 	.set at
-	CALL(copystr)				/* do the copy.		     */
+	CALL(alpha_copystr)			/* do the copy.		     */
 	.set noat
 	ldq	at_reg, 0(s0)			/* kill the fault handler.   */
 	ldq	at_reg, L_PCB(at_reg)

Index: src/sys/arch/amd64/amd64/copy.S
diff -u src/sys/arch/amd64/amd64/copy.S:1.33 src/sys/arch/amd64/amd64/copy.S:1.34
--- src/sys/arch/amd64/amd64/copy.S:1.33	Sat May  4 08:50:39 2019
+++ src/sys/arch/amd64/amd64/copy.S	Tue Jun 30 16:20:00 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: copy.S,v 1.33 2019/05/04 08:50:39 maxv Exp $	*/
+/*	$NetBSD: copy.S,v 1.34 2020/06/30 16:20:00 maxv Exp $	*/
 
 /*
  * Copyright (c) 2001 Wasabi Systems, Inc.
@@ -355,36 +355,6 @@ copystr_return:
 8:	ret
 END(copystr_fault)
 
-ENTRY(copystr)
-	xchgq	%rdi,%rsi
-	movq	%rdx,%r8
-
-	incq	%rdx
-
-1:	decq	%rdx
-	jz	4f
-	lodsb
-	stosb
-	testb	%al,%al
-	jnz	1b
-
-	/* Success -- 0 byte reached. */
-	decq	%rdx
-	xorl	%eax,%eax
-	jmp	6f
-
-4:	/* rdx is zero -- return ENAMETOOLONG. */
-	movl	$ENAMETOOLONG,%eax
-
-6:	/* Set *lencopied and return %eax. */
-	testq	%rcx,%rcx
-	jz	7f
-	subq	%rdx,%r8
-	movq	%r8,(%rcx)
-
-7:	ret
-END(copystr)
-
 /**************************************************************************/
 
 #define	UFETCHSTORE_PROLOGUE(x)						\

Index: src/sys/arch/arm/arm/copystr.S
diff -u src/sys/arch/arm/arm/copystr.S:1.12 src/sys/arch/arm/arm/copystr.S:1.13
--- src/sys/arch/arm/arm/copystr.S:1.12	Wed Jan 24 09:04:44 2018
+++ src/sys/arch/arm/arm/copystr.S	Tue Jun 30 16:20:00 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: copystr.S,v 1.12 2018/01/24 09:04:44 skrll Exp $	*/
+/*	$NetBSD: copystr.S,v 1.13 2020/06/30 16:20:00 maxv Exp $	*/
 
 /*
  * Copyright (c) 1995 Mark Brinicombe.
@@ -47,44 +47,12 @@
 
 #include <arm/locore.h>
 
-RCSID("$NetBSD: copystr.S,v 1.12 2018/01/24 09:04:44 skrll Exp $")
+RCSID("$NetBSD: copystr.S,v 1.13 2020/06/30 16:20:00 maxv Exp $")
 
 #include <sys/errno.h>
 
 	.text
 	.align	0
-/*
- * r0 - from
- * r1 - to
- * r2 - maxlens
- * r3 - lencopied
- *
- * Copy string from r0 to r1
- */
-ENTRY(copystr)
-	push	{r4-r5}			/* stack is 8 byte aligned */
-	teq	r2, #0x00000000
-	mov	r5, #0x00000000
-	moveq	r0, #ENAMETOOLONG
-	beq	2f
-
-1:	ldrb	r4, [r0], #0x0001
-	add	r5, r5, #0x00000001
-	teq	r4, #0x00000000
-	strb	r4, [r1], #0x0001
-	teqne	r5, r2
-	bne	1b
-
-	teq	r4, #0x00000000
-	moveq	r0, #0x00000000
-	movne	r0, #ENAMETOOLONG
-
-2:	teq	r3, #0x00000000
-	strne	r5, [r3]
-
-	pop	{r4-r5}			/* stack is 8 byte aligned */
-	RET
-END(copystr)
 
 #define SAVE_REGS	push	{r3-r6}
 #define RESTORE_REGS	pop	{r3-r6}

Index: src/sys/arch/hppa/hppa/copy.S
diff -u src/sys/arch/hppa/hppa/copy.S:1.24 src/sys/arch/hppa/hppa/copy.S:1.25
--- src/sys/arch/hppa/hppa/copy.S:1.24	Mon Apr 15 20:45:08 2019
+++ src/sys/arch/hppa/hppa/copy.S	Tue Jun 30 16:20:01 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: copy.S,v 1.24 2019/04/15 20:45:08 skrll Exp $	*/
+/*	$NetBSD: copy.S,v 1.25 2020/06/30 16:20:01 maxv Exp $	*/
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -256,9 +256,8 @@ EXIT(name)
 
 /*
  * int kcopy(const void *src, void *dst, size_t len);
- * int copystr(const void *src, void *dst, size_t size, size_t *lenp);
  */
-SPCOPY(kcopy, copystr,
+_SPCOPY(kcopy, CALL_SPCOPY,
 	SPACE_KERNEL(%arg0) ! SPACE_KERNEL(%arg2))
 
 /*

Index: src/sys/arch/i386/i386/copy.S
diff -u src/sys/arch/i386/i386/copy.S:1.31 src/sys/arch/i386/i386/copy.S:1.32
--- src/sys/arch/i386/i386/copy.S:1.31	Sat May  4 08:50:39 2019
+++ src/sys/arch/i386/i386/copy.S	Tue Jun 30 16:20:01 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: copy.S,v 1.31 2019/05/04 08:50:39 maxv Exp $	*/
+/*	$NetBSD: copy.S,v 1.32 2020/06/30 16:20:01 maxv Exp $	*/
 
 /*
  * Copyright (c) 1998, 2000, 2004, 2008 The NetBSD Foundation, Inc.
@@ -64,7 +64,7 @@
  */
 
 #include <machine/asm.h>
-__KERNEL_RCSID(0, "$NetBSD: copy.S,v 1.31 2019/05/04 08:50:39 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: copy.S,v 1.32 2020/06/30 16:20:01 maxv Exp $");
 
 #include "assym.h"
 
@@ -455,50 +455,6 @@ copystr_return:
 	ret
 END(copystr_fault)
 
-/*
- * int copystr(const void *from, void *to, size_t maxlen, size_t *lencopied);
- * Copy a NUL-terminated string, at most maxlen characters long.  Return the
- * number of characters copied (including the NUL) in *lencopied.  If the
- * string is too long, return ENAMETOOLONG; else return 0.
- * see copystr(9)
- */
-ENTRY(copystr)
-	pushl	%esi
-	pushl	%edi
-
-	movl	12(%esp),%esi		/* esi = from */
-	movl	16(%esp),%edi		/* edi = to */
-	movl	20(%esp),%edx		/* edx = maxlen */
-	incl	%edx
-
-1:	decl	%edx
-	jz	4f
-	lodsb
-	stosb
-	testb	%al,%al
-	jnz	1b
-
-	/* Success -- 0 byte reached. */
-	decl	%edx
-	xorl	%eax,%eax
-	jmp	6f
-
-4:	/* edx is zero -- return ENAMETOOLONG. */
-	movl	$ENAMETOOLONG,%eax
-
-6:	/* Set *lencopied and return %eax. */
-	movl	20(%esp),%ecx
-	subl	%edx,%ecx
-	movl	24(%esp),%edx
-	testl	%edx,%edx
-	jz	7f
-	movl	%ecx,(%edx)
-
-7:	popl	%edi
-	popl	%esi
-	ret
-END(copystr)
-
 /**************************************************************************/
 
 #define	UFETCHSTORE_PROLOGUE(x)						\

Index: src/sys/arch/ia64/ia64/support.S
diff -u src/sys/arch/ia64/ia64/support.S:1.9 src/sys/arch/ia64/ia64/support.S:1.10
--- src/sys/arch/ia64/ia64/support.S:1.9	Thu May  2 16:55:50 2019
+++ src/sys/arch/ia64/ia64/support.S	Tue Jun 30 16:20:01 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: support.S,v 1.9 2019/05/02 16:55:50 scole Exp $	*/
+/*	$NetBSD: support.S,v 1.10 2020/06/30 16:20:01 maxv Exp $	*/
 
 /*-
  * Copyright (c) 1998 Doug Rabson
@@ -377,12 +377,9 @@ END(_ustore_64)
 /**************************************************************************/
 
 /*
- * Copy a null-terminated string within the kernel's address space.
- * If lenp is not NULL, store the number of chars copied in *lenp
- *
- * int copystr(char *from, char *to, size_t len, size_t *lenp);
+ * XXX XXX XXX: Should be removed?
  */
-ENTRY(copystr, 4)
+ENTRY(ia64_copystr, 4)
 	mov	r14=in2			// r14 = i = len
 	cmp.eq	p6,p0=r0,in2
 (p6)	br.cond.spnt.few 2f		// if (len == 0), bail out
@@ -412,7 +409,7 @@ ENTRY(copystr, 4)
 
 4:	mov	ret0=0			// return 0.
 	br.ret.sptk.few rp
-END(copystr)
+END(ia64_copystr)
 
 ENTRY(copyinstr, 4)
 	.prologue
@@ -446,7 +443,7 @@ ENTRY(copyinstr, 4)
 	mov	out2=in2
 	mov	out3=in3
 	;;
-	br.call.sptk.few rp=copystr		// do the copy.
+	br.call.sptk.few rp=ia64_copystr	// do the copy.
 	st8	[loc2]=r0			// kill the fault handler.
 	mov	ar.pfs=loc0			// restore ar.pfs
 	mov	rp=loc1				// restore ra.
@@ -485,7 +482,7 @@ ENTRY(copyoutstr, 4)
 	mov	out2=in2
 	mov	out3=in3
 	;;
-	br.call.sptk.few rp=copystr		// do the copy.
+	br.call.sptk.few rp=ia64_copystr	// do the copy.
 	st8	[loc2]=r0			// kill the fault handler.
 	mov	ar.pfs=loc0			// restore ar.pfs
 	mov	rp=loc1				// restore ra.

Index: src/sys/arch/m68k/m68k/copy.s
diff -u src/sys/arch/m68k/m68k/copy.s:1.48 src/sys/arch/m68k/m68k/copy.s:1.49
--- src/sys/arch/m68k/m68k/copy.s:1.48	Fri Apr 12 03:29:24 2019
+++ src/sys/arch/m68k/m68k/copy.s	Tue Jun 30 16:20:01 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: copy.s,v 1.48 2019/04/12 03:29:24 thorpej Exp $	*/
+/*	$NetBSD: copy.s,v 1.49 2020/06/30 16:20:01 maxv Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2019 The NetBSD Foundation, Inc.
@@ -225,36 +225,6 @@ ENTRY(copyout)
 	jra	.Lcodone
 
 /*
- * copystr(void *from, void *to, size_t maxlen, size_t *lencopied);
- * Copy a NUL-terminated string, at most maxlen characters long.  Return the
- * number of characters copied (including the NUL) in *lencopied.  If the
- * string is too long, return ENAMETOOLONG; else return 0.
- */
-ENTRY(copystr)
-	movl	4(%sp),%a0		| a0 = fromaddr
-	movl	8(%sp),%a1		| a1 = toaddr
-	clrl	%d0
-	movl	12(%sp),%d1		| count
-	jeq	.Lcstoolong		| nothing to copy
-	subql	#1,%d1			| predecrement for dbeq
-.Lcsloop:
-	movb	(%a0)+,(%a1)+		| copy a byte
-	dbeq	%d1,.Lcsloop		| decrement low word of count
-	jeq	.Lcsdone		| copied null, exit
-	subil	#0x10000,%d1		| decrement high word of count
-	jcc	.Lcsloop		| more room, keep going
-.Lcstoolong:
-	moveq	#ENAMETOOLONG,%d0	| ran out of space
-.Lcsdone:
-	tstl	16(%sp)			| length desired?
-	jeq	.Lcsret
-	subl	4(%sp),%a0		| yes, calculate length copied
-	movl	16(%sp),%a1		| store at return location
-	movl	%a0,(%a1)
-.Lcsret:
-	rts
-
-/*
  * copyinstr(void *from, void *to, size_t maxlen, size_t *lencopied);
  * Copy a NUL-terminated string, at most maxlen characters long, from the
  * user's address space.  Return the number of characters copied (including

Index: src/sys/arch/mips/mips/copy.S
diff -u src/sys/arch/mips/mips/copy.S:1.17 src/sys/arch/mips/mips/copy.S:1.18
--- src/sys/arch/mips/mips/copy.S:1.17	Sat Apr  6 03:06:26 2019
+++ src/sys/arch/mips/mips/copy.S	Tue Jun 30 16:20:01 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: copy.S,v 1.17 2019/04/06 03:06:26 thorpej Exp $	*/
+/*	$NetBSD: copy.S,v 1.18 2020/06/30 16:20:01 maxv Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -60,34 +60,6 @@
 #include "assym.h"
 
 	.set	noreorder
-/*
- * int copystr(void *kfaddr, void *kdaddr, size_t maxlen, size_t *lencopied)
- * Copy a NIL-terminated string, at most maxlen characters long.  Return the
- * number of characters copied (including the NIL) in *lencopied.  If the
- * string is too long, return ENAMETOOLONG; else return 0.
- */
-LEAF(copystr)
-	move	t0, a2
-	beq	a2, zero, 4f
-	 nop
-1:
-	lbu	v0, 0(a0)
-	PTR_SUBU a2, a2, 1
-	beq	v0, zero, 2f
-	 sb	v0, 0(a1)			# each byte until NIL
-	PTR_ADDU a0, a0, 1
-	bne	a2, zero, 1b			# less than maxlen
-	 PTR_ADDU a1, a1, 1
-4:
-	li	v0, ENAMETOOLONG		# run out of space
-2:
-	beq	a3, zero, 3f			# return num. of copied bytes
-	 PTR_SUBU a2, t0, a2			# if the 4th arg was non-NULL
-	PTR_S	a2, 0(a3)
-3:
-	j	ra				# v0 is 0 or ENAMETOOLONG
-	 nop
-END(copystr)
 
 /*
  * int copyinstr(void *uaddr, void *kaddr, size_t maxlen, size_t *lencopied)

Index: src/sys/arch/powerpc/conf/files.powerpc
diff -u src/sys/arch/powerpc/conf/files.powerpc:1.93 src/sys/arch/powerpc/conf/files.powerpc:1.94
--- src/sys/arch/powerpc/conf/files.powerpc:1.93	Thu Feb 20 05:03:54 2020
+++ src/sys/arch/powerpc/conf/files.powerpc	Tue Jun 30 16:20:01 2020
@@ -1,4 +1,4 @@
-#	$NetBSD: files.powerpc,v 1.93 2020/02/20 05:03:54 rin Exp $
+#	$NetBSD: files.powerpc,v 1.94 2020/06/30 16:20:01 maxv Exp $
 
 defflag	opt_altivec.h	ALTIVEC K_ALTIVEC PPC_HAVE_SPE
 defflag	opt_openpic.h	OPENPIC_DISTRIBUTE
@@ -8,7 +8,6 @@ defflag opt_ppccache.h	CACHE_PROTO_MEI
 defflag opt_pmap.h	PMAPDEBUG PMAPCHECK PMAPCOUNTERS PMAP_MINIMALTLB
 defparam opt_pmap.h	PTEGCOUNT PMAP_MEMLIMIT
 
-file	arch/powerpc/powerpc/copystr.c
 file	arch/powerpc/powerpc/core_machdep.c		coredump
 file	arch/powerpc/powerpc/fixup.c
 file	arch/powerpc/powerpc/kgdb_machdep.c		kgdb

Index: src/sys/arch/riscv/riscv/trap.c
diff -u src/sys/arch/riscv/riscv/trap.c:1.6 src/sys/arch/riscv/riscv/trap.c:1.7
--- src/sys/arch/riscv/riscv/trap.c:1.6	Mon Apr  6 20:26:16 2020
+++ src/sys/arch/riscv/riscv/trap.c	Tue Jun 30 16:20:02 2020
@@ -32,7 +32,7 @@
 #define __PMAP_PRIVATE
 #define __UFETCHSTORE_PRIVATE
 
-__RCSID("$NetBSD: trap.c,v 1.6 2020/04/06 20:26:16 skrll Exp $");
+__RCSID("$NetBSD: trap.c,v 1.7 2020/06/30 16:20:02 maxv Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -129,22 +129,6 @@ kcopy(const void *kfaddr, void *kdaddr, 
 }
 
 int
-copystr(const void *kfaddr, void *kdaddr, size_t len, size_t *done)
-{
-	struct faultbuf fb;
-	int error;
-
-	if ((error = cpu_set_onfault(&fb, EFAULT)) == 0) {
-		len = strlcpy(kdaddr, kfaddr, len);
-		cpu_unset_onfault();
-		if (done != NULL) {
-			*done = len;
-		}
-	}
-	return error;
-}
-
-int
 copyinstr(const void *uaddr, void *kaddr, size_t len, size_t *done)
 {
 	struct faultbuf fb;

Index: src/sys/arch/sh3/sh3/locore_c.c
diff -u src/sys/arch/sh3/sh3/locore_c.c:1.31 src/sys/arch/sh3/sh3/locore_c.c:1.32
--- src/sys/arch/sh3/sh3/locore_c.c:1.31	Fri Nov 27 03:23:13 2009
+++ src/sys/arch/sh3/sh3/locore_c.c	Tue Jun 30 16:20:02 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore_c.c,v 1.31 2009/11/27 03:23:13 rmind Exp $	*/
+/*	$NetBSD: locore_c.c,v 1.32 2020/06/30 16:20:02 maxv Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 2002, 2007 The NetBSD Foundation, Inc.
@@ -104,7 +104,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: locore_c.c,v 1.31 2009/11/27 03:23:13 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: locore_c.c,v 1.32 2020/06/30 16:20:02 maxv Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -208,31 +208,3 @@ sh4_switch_setup(struct lwp *l)
 }
 #endif /* SH4 */
 #endif /* !P1_STACK */
-
-
-/*
- * Copy a NUL-terminated string, at most maxlen characters long.
- * Return the number of characters copied (including the NUL) in
- * *lencopied.  If the string is too long, return ENAMETOOLONG,
- * else return 0.
- */
-int
-copystr(const void *kfaddr, void *kdaddr, size_t maxlen, size_t *lencopied)
-{
-	const char *from = kfaddr;
-	char *to = kdaddr;
-	int i;
-
-	for (i = 0; i < maxlen; i++) {
-		if ((*to++ = *from++) == '\0') {
-			if (lencopied)
-				*lencopied = i + 1;
-			return (0);
-		}
-	}
-
-	if (lencopied)
-		*lencopied = i;
-
-	return (ENAMETOOLONG);
-}

Index: src/sys/arch/sparc/sparc/locore.s
diff -u src/sys/arch/sparc/sparc/locore.s:1.277 src/sys/arch/sparc/sparc/locore.s:1.278
--- src/sys/arch/sparc/sparc/locore.s:1.277	Sun Jan 12 19:13:55 2020
+++ src/sys/arch/sparc/sparc/locore.s	Tue Jun 30 16:20:02 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.s,v 1.277 2020/01/12 19:13:55 ad Exp $	*/
+/*	$NetBSD: locore.s,v 1.278 2020/06/30 16:20:02 maxv Exp $	*/
 
 /*
  * Copyright (c) 1996 Paul Kranenburg
@@ -4737,41 +4737,6 @@ Lcsdone:				! done:
 	 st	%g0, [%o4 + PCB_ONFAULT]! return (error);
 
 /*
- * copystr(fromaddr, toaddr, maxlength, &lencopied)
- *
- * Copy a null terminated string from one point to another in
- * the kernel address space.  (This is a leaf procedure, but
- * it does not seem that way to the C compiler.)
- */
-ENTRY(copystr)
-	mov	%o1, %o5		!	to0 = to;
-	tst	%o2			! if (maxlength == 0)
-	beq,a	2f			!
-	 mov	ENAMETOOLONG, %o0	!	ret = ENAMETOOLONG; goto done;
-
-0:					! loop:
-	ldsb	[%o0], %o4		!	c = *from;
-	tst	%o4
-	stb	%o4, [%o1]		!	*to++ = c;
-	be	1f			!	if (c == 0)
-	 inc	%o1			!		goto ok;
-	deccc	%o2			!	if (--len > 0) {
-	bgu,a	0b			!		from++;
-	 inc	%o0			!		goto loop;
-	b	2f			!	}
-	 mov	ENAMETOOLONG, %o0	!	ret = ENAMETOOLONG; goto done;
-1:					! ok:
-	clr	%o0			!	ret = 0;
-2:
-	sub	%o1, %o5, %o1		!	len = to - to0;
-	tst	%o3			!	if (lencopied)
-	bnz,a	3f
-	 st	%o1, [%o3]		!		*lencopied = len;
-3:
-	retl
-	 nop
-
-/*
  * Copyin(src, dst, len)
  *
  * Copy specified amount of data from user space into the kernel.

Index: src/sys/arch/sparc64/sparc64/copy.S
diff -u src/sys/arch/sparc64/sparc64/copy.S:1.8 src/sys/arch/sparc64/sparc64/copy.S:1.9
--- src/sys/arch/sparc64/sparc64/copy.S:1.8	Sat Apr  6 03:06:27 2019
+++ src/sys/arch/sparc64/sparc64/copy.S	Tue Jun 30 16:20:02 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: copy.S,v 1.8 2019/04/06 03:06:27 thorpej Exp $	*/
+/*	$NetBSD: copy.S,v 1.9 2020/06/30 16:20:02 maxv Exp $	*/
 
 /*
  * Copyright (c) 2006-2010 Matthew R. Green
@@ -1158,49 +1158,3 @@ Lkcerr:
 	retl				! and return error indicator
 	 membar	#StoreStore|#StoreLoad
 	NOTREACHED
-
-/*
- * copystr(fromaddr, toaddr, maxlength, &lencopied)
- *
- * Copy a null terminated string from one point to another in
- * the kernel address space.  (This is a leaf procedure, but
- * it does not seem that way to the C compiler.)
- */
-ENTRY(copystr)
-	brgz,pt	%o2, 0f	! Make sure len is valid
-	 mov	%o1, %o5		!	to0 = to;
-	retl
-	 mov	ENAMETOOLONG, %o0
-0:					! loop:
-	ldsb	[%o0], %o4		!	c = *from;
-	tst	%o4
-	stb	%o4, [%o1]		!	*to++ = c;
-	be	1f			!	if (c == 0)
-	 inc	%o1			!		goto ok;
-	deccc	%o2			!	if (--len > 0) {
-	bg,a	0b			!		from++;
-	 inc	%o0			!		goto loop;
-	b	2f			!	}
-	 mov	ENAMETOOLONG, %o0	!	ret = ENAMETOOLONG; goto done;
-1:					! ok:
-	clr	%o0			!	ret = 0;
-2:
-	sub	%o1, %o5, %o1		!	len = to - to0;
-	tst	%o3			!	if (lencopied)
-	bnz,a	3f
-	 STPTR	%o1, [%o3]		!		*lencopied = len;
-3:
-	retl
-	 nop
-#ifdef DIAGNOSTIC
-4:
-	sethi	%hi(5f), %o0
-	call	_C_LABEL(panic)
-	 or	%lo(5f), %o0, %o0
-	.data
-5:
-	.asciz	"copystr"
-	_ALIGN
-	.text
-#endif
-

Index: src/sys/arch/usermode/usermode/copy.c
diff -u src/sys/arch/usermode/usermode/copy.c:1.11 src/sys/arch/usermode/usermode/copy.c:1.12
--- src/sys/arch/usermode/usermode/copy.c:1.11	Wed Apr 10 04:10:54 2019
+++ src/sys/arch/usermode/usermode/copy.c	Tue Jun 30 16:20:02 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: copy.c,v 1.11 2019/04/10 04:10:54 thorpej Exp $ */
+/* $NetBSD: copy.c,v 1.12 2020/06/30 16:20:02 maxv Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: copy.c,v 1.11 2019/04/10 04:10:54 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: copy.c,v 1.12 2020/06/30 16:20:02 maxv Exp $");
 
 #define	__UFETCHSTORE_PRIVATE
 #define	__UCAS_PRIVATE
@@ -76,16 +76,6 @@ copyoutstr(const void *kaddr, void *uadd
 }
 
 int
-copystr(const void *kfaddr, void *kdaddr, size_t len, size_t *done)
-{
-	len = uimin(strnlen(kfaddr, len), len) + 1;
-	strncpy(kdaddr, kfaddr, len);
-	if (done)
-		*done = len;
-	return 0;
-}
-
-int
 kcopy(const void *src, void *dst, size_t len)
 {
 	memcpy(dst, src, len);

Index: src/sys/arch/vax/vax/subr.S
diff -u src/sys/arch/vax/vax/subr.S:1.37 src/sys/arch/vax/vax/subr.S:1.38
--- src/sys/arch/vax/vax/subr.S:1.37	Wed Jan  8 17:38:42 2020
+++ src/sys/arch/vax/vax/subr.S	Tue Jun 30 16:20:02 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr.S,v 1.37 2020/01/08 17:38:42 ad Exp $	   */
+/*	$NetBSD: subr.S,v 1.38 2020/06/30 16:20:02 maxv Exp $	   */
 
 /*
  * Copyright (c) 1994 Ludd, University of Lule}, Sweden.
@@ -477,7 +477,6 @@ ENTRY(copyoutstr, 0)
 	bgeq	8f		# no, continue
 	brb	6b		# yes, return EFAULT
 
-ENTRY(copystr,0)
 8:	movl	4(%ap),%r5	# from
 	movl	8(%ap),%r4	# to
 	movl	12(%ap),%r3	# len

Index: src/sys/kern/subr_asan.c
diff -u src/sys/kern/subr_asan.c:1.21 src/sys/kern/subr_asan.c:1.22
--- src/sys/kern/subr_asan.c:1.21	Mon Apr 13 07:09:51 2020
+++ src/sys/kern/subr_asan.c	Tue Jun 30 16:20:02 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_asan.c,v 1.21 2020/04/13 07:09:51 maxv Exp $	*/
+/*	$NetBSD: subr_asan.c,v 1.22 2020/06/30 16:20:02 maxv Exp $	*/
 
 /*
  * Copyright (c) 2018-2020 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_asan.c,v 1.21 2020/04/13 07:09:51 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_asan.c,v 1.22 2020/06/30 16:20:02 maxv Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -539,18 +539,15 @@ kasan_strrchr(const char *s, int c)
 }
 
 #undef kcopy
-#undef copystr
 #undef copyinstr
 #undef copyoutstr
 #undef copyin
 
 int	kasan_kcopy(const void *, void *, size_t);
-int	kasan_copystr(const void *, void *, size_t, size_t *);
 int	kasan_copyinstr(const void *, void *, size_t, size_t *);
 int	kasan_copyoutstr(const void *, void *, size_t, size_t *);
 int	kasan_copyin(const void *, void *, size_t);
 int	kcopy(const void *, void *, size_t);
-int	copystr(const void *, void *, size_t, size_t *);
 int	copyinstr(const void *, void *, size_t, size_t *);
 int	copyoutstr(const void *, void *, size_t, size_t *);
 int	copyin(const void *, void *, size_t);
@@ -564,13 +561,6 @@ kasan_kcopy(const void *src, void *dst, 
 }
 
 int
-kasan_copystr(const void *kfaddr, void *kdaddr, size_t len, size_t *done)
-{
-	kasan_shadow_check((unsigned long)kdaddr, len, true, __RET_ADDR);
-	return copystr(kfaddr, kdaddr, len, done);
-}
-
-int
 kasan_copyin(const void *uaddr, void *kaddr, size_t len)
 {
 	kasan_shadow_check((unsigned long)kaddr, len, true, __RET_ADDR);

Index: src/sys/kern/subr_csan.c
diff -u src/sys/kern/subr_csan.c:1.8 src/sys/kern/subr_csan.c:1.9
--- src/sys/kern/subr_csan.c:1.8	Wed Apr 15 17:28:26 2020
+++ src/sys/kern/subr_csan.c	Tue Jun 30 16:20:02 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_csan.c,v 1.8 2020/04/15 17:28:26 maxv Exp $	*/
+/*	$NetBSD: subr_csan.c,v 1.9 2020/06/30 16:20:02 maxv Exp $	*/
 
 /*
  * Copyright (c) 2019 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_csan.c,v 1.8 2020/04/15 17:28:26 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_csan.c,v 1.9 2020/06/30 16:20:02 maxv Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -322,20 +322,17 @@ kcsan_strlen(const char *str)
 }
 
 #undef kcopy
-#undef copystr
 #undef copyinstr
 #undef copyoutstr
 #undef copyin
 #undef copyout
 
 int	kcsan_kcopy(const void *, void *, size_t);
-int	kcsan_copystr(const void *, void *, size_t, size_t *);
 int	kcsan_copyinstr(const void *, void *, size_t, size_t *);
 int	kcsan_copyoutstr(const void *, void *, size_t, size_t *);
 int	kcsan_copyin(const void *, void *, size_t);
 int	kcsan_copyout(const void *, void *, size_t);
 int	kcopy(const void *, void *, size_t);
-int	copystr(const void *, void *, size_t, size_t *);
 int	copyinstr(const void *, void *, size_t, size_t *);
 int	copyoutstr(const void *, void *, size_t, size_t *);
 int	copyin(const void *, void *, size_t);
@@ -350,13 +347,6 @@ kcsan_kcopy(const void *src, void *dst, 
 }
 
 int
-kcsan_copystr(const void *kfaddr, void *kdaddr, size_t len, size_t *done)
-{
-	kcsan_access((uintptr_t)kdaddr, len, true, false, __RET_ADDR);
-	return copystr(kfaddr, kdaddr, len, done);
-}
-
-int
 kcsan_copyin(const void *uaddr, void *kaddr, size_t len)
 {
 	kcsan_access((uintptr_t)kaddr, len, true, false, __RET_ADDR);

Index: src/sys/kern/subr_msan.c
diff -u src/sys/kern/subr_msan.c:1.11 src/sys/kern/subr_msan.c:1.12
--- src/sys/kern/subr_msan.c:1.11	Fri May 15 07:47:53 2020
+++ src/sys/kern/subr_msan.c	Tue Jun 30 16:20:02 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_msan.c,v 1.11 2020/05/15 07:47:53 maxv Exp $	*/
+/*	$NetBSD: subr_msan.c,v 1.12 2020/06/30 16:20:02 maxv Exp $	*/
 
 /*
  * Copyright (c) 2019-2020 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_msan.c,v 1.11 2020/05/15 07:47:53 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_msan.c,v 1.12 2020/06/30 16:20:02 maxv Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -799,21 +799,18 @@ kmsan_strrchr(const char *s, int c)
 }
 
 #undef kcopy
-#undef copystr
 #undef copyin
 #undef copyout
 #undef copyinstr
 #undef copyoutstr
 
 int	kmsan_kcopy(const void *, void *, size_t);
-int	kmsan_copystr(const void *, void *, size_t, size_t *);
 int	kmsan_copyin(const void *, void *, size_t);
 int	kmsan_copyout(const void *, void *, size_t);
 int	kmsan_copyinstr(const void *, void *, size_t, size_t *);
 int	kmsan_copyoutstr(const void *, void *, size_t, size_t *);
 
 int	kcopy(const void *, void *, size_t);
-int	copystr(const void *, void *, size_t, size_t *);
 int	copyin(const void *, void *, size_t);
 int	copyout(const void *, void *, size_t);
 int	copyinstr(const void *, void *, size_t, size_t *);
@@ -832,26 +829,6 @@ kmsan_kcopy(const void *src, void *dst, 
 }
 
 int
-kmsan_copystr(const void *kfaddr, void *kdaddr, size_t len, size_t *done)
-{
-	size_t _done;
-	int ret;
-
-	kmsan_check_arg(sizeof(kfaddr) + sizeof(kdaddr) +
-	    sizeof(len) + sizeof(done), "copystr():args");
-	ret = copystr(kfaddr, kdaddr, len, &_done);
-	if (ret == 0)
-		kmsan_meta_copy(kdaddr, kfaddr, _done);
-	if (done != NULL) {
-		*done = _done;
-		kmsan_shadow_fill(done, KMSAN_STATE_INITED, sizeof(size_t));
-	}
-	kmsan_init_ret(sizeof(int));
-
-	return ret;
-}
-
-int
 kmsan_copyin(const void *uaddr, void *kaddr, size_t len)
 {
 	int ret;

Index: src/sys/lib/libkern/Makefile.libkern
diff -u src/sys/lib/libkern/Makefile.libkern:1.48 src/sys/lib/libkern/Makefile.libkern:1.49
--- src/sys/lib/libkern/Makefile.libkern:1.48	Thu Apr 30 03:28:19 2020
+++ src/sys/lib/libkern/Makefile.libkern	Tue Jun 30 16:20:02 2020
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile.libkern,v 1.48 2020/04/30 03:28:19 riastradh Exp $
+#	$NetBSD: Makefile.libkern,v 1.49 2020/06/30 16:20:02 maxv Exp $
 
 #
 # Variable definitions for libkern.
@@ -59,6 +59,7 @@ SRCS+=	pmatch.c mcount.c crc32.c
 
 SRCS+=	ppath_kmem_alloc.c
 
+SRCS+=	copystr.c
 SRCS+=	strsep.c strstr.c
 SRCS+=	strlcpy.c strlcat.c
 

Index: src/sys/sys/systm.h
diff -u src/sys/sys/systm.h:1.294 src/sys/sys/systm.h:1.295
--- src/sys/sys/systm.h:1.294	Sat Apr  4 19:50:54 2020
+++ src/sys/sys/systm.h	Tue Jun 30 16:20:03 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: systm.h,v 1.294 2020/04/04 19:50:54 christos Exp $	*/
+/*	$NetBSD: systm.h,v 1.295 2020/06/30 16:20:03 maxv Exp $	*/
 
 /*-
  * Copyright (c) 1982, 1988, 1991, 1993
@@ -286,40 +286,34 @@ int	kcopy(const void *, void *, size_t);
 #define bcmp(a, b, len)		memcmp((a), (b), (len))
 #endif /* KERNEL */
 
+int	copystr(const void *, void *, size_t, size_t *);
 #if defined(_KERNEL) && defined(KASAN)
-int	kasan_copystr(const void *, void *, size_t, size_t *);
 int	kasan_copyinstr(const void *, void *, size_t, size_t *);
 int	kasan_copyoutstr(const void *, void *, size_t, size_t *);
 int	kasan_copyin(const void *, void *, size_t);
 int	copyout(const void *, void *, size_t);
-#define copystr		kasan_copystr
 #define copyinstr	kasan_copyinstr
 #define copyoutstr	kasan_copyoutstr
 #define copyin		kasan_copyin
 #elif defined(_KERNEL) && defined(KCSAN)
-int	kcsan_copystr(const void *, void *, size_t, size_t *);
 int	kcsan_copyinstr(const void *, void *, size_t, size_t *);
 int	kcsan_copyoutstr(const void *, void *, size_t, size_t *);
 int	kcsan_copyin(const void *, void *, size_t);
 int	kcsan_copyout(const void *, void *, size_t);
-#define copystr		kcsan_copystr
 #define copyinstr	kcsan_copyinstr
 #define copyoutstr	kcsan_copyoutstr
 #define copyin		kcsan_copyin
 #define copyout		kcsan_copyout
 #elif defined(_KERNEL) && defined(KMSAN)
-int	kmsan_copystr(const void *, void *, size_t, size_t *);
 int	kmsan_copyinstr(const void *, void *, size_t, size_t *);
 int	kmsan_copyoutstr(const void *, void *, size_t, size_t *);
 int	kmsan_copyin(const void *, void *, size_t);
 int	kmsan_copyout(const void *, void *, size_t);
-#define copystr		kmsan_copystr
 #define copyinstr	kmsan_copyinstr
 #define copyoutstr	kmsan_copyoutstr
 #define copyin		kmsan_copyin
 #define copyout		kmsan_copyout
 #else
-int	copystr(const void *, void *, size_t, size_t *);
 int	copyinstr(const void *, void *, size_t, size_t *);
 int	copyoutstr(const void *, void *, size_t, size_t *);
 int	copyin(const void *, void *, size_t);

Added files:

Index: src/sys/lib/libkern/copystr.c
diff -u /dev/null src/sys/lib/libkern/copystr.c:1.1
--- /dev/null	Tue Jun 30 16:20:03 2020
+++ src/sys/lib/libkern/copystr.c	Tue Jun 30 16:20:02 2020
@@ -0,0 +1,54 @@
+/*	$NetBSD: copystr.c,v 1.1 2020/06/30 16:20:02 maxv Exp $	*/
+
+/*
+ * Copyright (c) 2020 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Maxime Villard.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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 <sys/systm.h>
+#include <sys/errno.h>
+
+int
+copystr(const void *kfaddr, void *kdaddr, size_t len, size_t *done)
+{
+	const char *src = kfaddr;
+	char *dst = kdaddr;
+	size_t i;
+
+	for (i = 0; i < len; i++) {
+		if ((*dst++ = *src++) == '\0') {
+			if (done)
+				*done = i + 1;
+			return 0;
+		}
+	}
+
+	if (done)
+		*done = i;
+
+	return ENAMETOOLONG;
+}

Reply via email to