Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/netbsd-9]: src/sys/arch/powerpc/booke Pull up following revision(s) (req...
details: https://anonhg.NetBSD.org/src/rev/2864e481f0bc
branches: netbsd-9
changeset: 1001568:2864e481f0bc
user: martin <martin%NetBSD.org@localhost>
date: Mon Mar 09 10:11:40 2020 +0000
description:
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.
diffstat:
sys/arch/powerpc/booke/copyout.c | 60 +++++++++++++++++++++++++++++++--------
1 files changed, 47 insertions(+), 13 deletions(-)
diffs (98 lines):
diff -r c418209ddec6 -r 2864e481f0bc sys/arch/powerpc/booke/copyout.c
--- a/sys/arch/powerpc/booke/copyout.c Mon Mar 09 09:55:52 2020 +0000
+++ b/sys/arch/powerpc/booke/copyout.c Mon Mar 09 10:11:40 2020 +0000
@@ -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,6 +400,50 @@
return 0;
}
+#if 1
+int
+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 (done)
+ *done = 0;
+ return 0;
+ }
+
+ rv = setfault(&env);
+ if (rv != 0) {
+ pcb->pcb_onfault = NULL;
+ if (done)
+ *done = 0;
+ return rv;
+ }
+
+ const register_t ds_msr = mfmsr() | PSL_DS;
+ const uint8_t *ksaddr8 = ksaddr;
+ size_t copylen = 0;
+
+ uint8_t *udaddr8 = (void *)udaddr;
+
+ while (copylen++ < len) {
+ const uint8_t data = *ksaddr8++;
+ copyout_uint8(udaddr8++, data, ds_msr);
+ if (data == 0)
+ 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)
{
@@ -423,16 +467,6 @@
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;
- }
-#else
uint32_t *udaddr32 = (void *)((uintptr_t)udaddr & ~3);
size_t boff = (uintptr_t)udaddr & 3;
@@ -523,10 +557,10 @@
copyout_le32_with_mask(udaddr32, data, mask, ds_msr);
copylen += wlen;
}
-#endif
pcb->pcb_onfault = NULL;
if (lenp)
*lenp = copylen;
return 0;
}
+#endif
Home |
Main Index |
Thread Index |
Old Index