Module Name: src Committed By: martin Date: Mon Mar 9 10:11:40 UTC 2020
Modified Files: src/sys/arch/powerpc/booke [netbsd-9]: copyout.c Log Message: Pull up following revision(s) (requested by rin in ticket #771): sys/arch/powerpc/booke/copyout.c: revision 1.6 sys/arch/powerpc/booke/copyout.c: revision 1.7 sys/arch/powerpc/booke/copyout.c: revision 1.8 copyoutstr(9): sync style with copyinstr(9). - use variable name "done" instead of "lenp" - return return value from setfault() on fault, instead of hardcoded EFAULT No functional changes intended. copyoutstr(9): return ENAMETOOLONG correctly when source string is not NUL-terminated. Comment out full function of optimized version of copyoutstr(9), which has never been enabled so far. Only for clarity. No binary changes. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.5.4.1 src/sys/arch/powerpc/booke/copyout.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/booke/copyout.c diff -u src/sys/arch/powerpc/booke/copyout.c:1.5 src/sys/arch/powerpc/booke/copyout.c:1.5.4.1 --- src/sys/arch/powerpc/booke/copyout.c:1.5 Sun Apr 7 05:25:55 2019 +++ src/sys/arch/powerpc/booke/copyout.c Mon Mar 9 10:11:40 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: copyout.c,v 1.5 2019/04/07 05:25:55 thorpej Exp $ */ +/* $NetBSD: copyout.c,v 1.5.4.1 2020/03/09 10:11:40 martin Exp $ */ /*- * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc. @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: copyout.c,v 1.5 2019/04/07 05:25:55 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: copyout.c,v 1.5.4.1 2020/03/09 10:11:40 martin Exp $"); #define __UFETCHSTORE_PRIVATE @@ -400,39 +400,73 @@ copyout(const void *vksaddr, void *vudad return 0; } +#if 1 int -copyoutstr(const void *ksaddr, void *udaddr, size_t len, size_t *lenp) +copyoutstr(const void *ksaddr, void *udaddr, size_t len, size_t *done) { struct pcb * const pcb = lwp_getpcb(curlwp); struct faultbuf env; + int rv; if (__predict_false(len == 0)) { - if (lenp) - *lenp = 0; + if (done) + *done = 0; return 0; } - if (setfault(&env)) { + rv = setfault(&env); + if (rv != 0) { pcb->pcb_onfault = NULL; - if (lenp) - *lenp = 0; - return EFAULT; + if (done) + *done = 0; + return rv; } const register_t ds_msr = mfmsr() | PSL_DS; const uint8_t *ksaddr8 = ksaddr; size_t copylen = 0; -#if 1 uint8_t *udaddr8 = (void *)udaddr; while (copylen++ < len) { const uint8_t data = *ksaddr8++; copyout_uint8(udaddr8++, data, ds_msr); if (data == 0) - break; + goto out; } + rv = ENAMETOOLONG; + +out: + pcb->pcb_onfault = NULL; + if (done) + *done = copylen; + return rv; +} #else +/* XXX This version of copyoutstr(9) has never beeen enabled so far. */ +int +copyoutstr(const void *ksaddr, void *udaddr, size_t len, size_t *lenp) +{ + struct pcb * const pcb = lwp_getpcb(curlwp); + struct faultbuf env; + + if (__predict_false(len == 0)) { + if (lenp) + *lenp = 0; + return 0; + } + + if (setfault(&env)) { + pcb->pcb_onfault = NULL; + if (lenp) + *lenp = 0; + return EFAULT; + } + + const register_t ds_msr = mfmsr() | PSL_DS; + const uint8_t *ksaddr8 = ksaddr; + size_t copylen = 0; + uint32_t *udaddr32 = (void *)((uintptr_t)udaddr & ~3); size_t boff = (uintptr_t)udaddr & 3; @@ -523,10 +557,10 @@ copyoutstr(const void *ksaddr, void *uda copyout_le32_with_mask(udaddr32, data, mask, ds_msr); copylen += wlen; } -#endif pcb->pcb_onfault = NULL; if (lenp) *lenp = copylen; return 0; } +#endif