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; +}