Pull up following revision(s) (requested by rin in ticket #772): sys/arch/powerpc/ibm4xx/copyinstr.c: revision 1.12 sys/arch/powerpc/ibm4xx/copyinstr.c: revision 1.13 sys/arch/powerpc/ibm4xx/copyoutstr.c: revision 1.10 sys/arch/powerpc/ibm4xx/copyoutstr.c: revision 1.11 sys/arch/powerpc/ibm4xx/copyoutstr.c: revision 1.12 sys/arch/powerpc/ibm4xx/copyoutstr.c: revision 1.13 sys/arch/powerpc/ibm4xx/copyinstr.c: revision 1.10 sys/arch/powerpc/ibm4xx/copyinstr.c: revision 1.11 copy{in,out}str: sync style with booke. - early return in case of len == 0 - *done = 0 on fault copy{in,out}str: Correctly return ENAMETOOLONG if source is not NUL-terminated. Use dcbst instead of dcbf to flush cache; the former does not invalidate the cache line, which should be used immediately in most cases. Cosmetic changes. No binary changes.diff -r1.9 -r1.9.64.1 src/sys/arch/powerpc/ibm4xx/copyinstr.c
(martin)
--- src/sys/arch/powerpc/ibm4xx/copyinstr.c 2010/03/20 23:31:29 1.9
+++ src/sys/arch/powerpc/ibm4xx/copyinstr.c 2020/03/09 11:52:14 1.9.64.1
@@ -1,14 +1,14 @@ | @@ -1,14 +1,14 @@ | |||
1 | /* $NetBSD: copyinstr.c,v 1.9 2010/03/20 23:31:29 chs Exp $ */ | 1 | /* $NetBSD: copyinstr.c,v 1.9.64.1 2020/03/09 11:52:14 martin Exp $ */ | |
2 | 2 | |||
3 | /* | 3 | /* | |
4 | * Copyright 2001 Wasabi Systems, Inc. | 4 | * Copyright 2001 Wasabi Systems, Inc. | |
5 | * All rights reserved. | 5 | * All rights reserved. | |
6 | * | 6 | * | |
7 | * Written by Eduardo Horvath and Simon Burge for Wasabi Systems, Inc. | 7 | * Written by Eduardo Horvath and Simon Burge for Wasabi Systems, Inc. | |
8 | * | 8 | * | |
9 | * Redistribution and use in source and binary forms, with or without | 9 | * Redistribution and use in source and binary forms, with or without | |
10 | * modification, are permitted provided that the following conditions | 10 | * modification, are permitted provided that the following conditions | |
11 | * are met: | 11 | * are met: | |
12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright | |
13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. | |
14 | * 2. Redistributions in binary form must reproduce the above copyright | 14 | * 2. Redistributions in binary form must reproduce the above copyright | |
@@ -26,73 +26,80 @@ | @@ -26,73 +26,80 @@ | |||
26 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | 26 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | |
27 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | 27 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
28 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC | 28 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC | |
29 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | 29 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
30 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 30 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
31 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | 31 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
32 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | 32 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
33 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 33 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
34 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 34 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
35 | * POSSIBILITY OF SUCH DAMAGE. | 35 | * POSSIBILITY OF SUCH DAMAGE. | |
36 | */ | 36 | */ | |
37 | 37 | |||
38 | #include <sys/cdefs.h> | 38 | #include <sys/cdefs.h> | |
39 | __KERNEL_RCSID(0, "$NetBSD: copyinstr.c,v 1.9 2010/03/20 23:31:29 chs Exp $"); | 39 | __KERNEL_RCSID(0, "$NetBSD: copyinstr.c,v 1.9.64.1 2020/03/09 11:52:14 martin Exp $"); | |
40 | 40 | |||
41 | #include <sys/param.h> | 41 | #include <sys/param.h> | |
42 | #include <uvm/uvm_extern.h> | 42 | #include <uvm/uvm_extern.h> | |
43 | #include <machine/pcb.h> | 43 | #include <machine/pcb.h> | |
44 | 44 | |||
45 | int | 45 | int | |
46 | copyinstr(const void *udaddr, void *kaddr, size_t len, size_t *done) | 46 | copyinstr(const void *udaddr, void *kaddr, size_t len, size_t *done) | |
47 | { | 47 | { | |
48 | struct pmap *pm = curproc->p_vmspace->vm_map.pmap; | 48 | struct pmap *pm = curproc->p_vmspace->vm_map.pmap; | |
49 | int rv, msr, pid, tmp, ctx; | 49 | size_t resid; | |
50 | int rv, msr, pid, data, ctx; | |||
50 | struct faultbuf env; | 51 | struct faultbuf env; | |
51 | 52 | |||
53 | if (__predict_false(len == 0)) { | |||
54 | if (done) | |||
55 | *done = 0; | |||
56 | return 0; | |||
57 | } | |||
58 | ||||
52 | if ((rv = setfault(&env))) { | 59 | if ((rv = setfault(&env))) { | |
53 | curpcb->pcb_onfault = NULL; | 60 | curpcb->pcb_onfault = NULL; | |
54 | /* XXXX -- len may be lost on a fault */ | |||
55 | if (done) | 61 | if (done) | |
56 | *done = len; | 62 | *done = 0; | |
57 | return rv; | 63 | return rv; | |
58 | } | 64 | } | |
59 | 65 | |||
60 | if (!(ctx = pm->pm_ctx)) { | 66 | if (!(ctx = pm->pm_ctx)) { | |
61 | /* No context -- assign it one */ | 67 | /* No context -- assign it one */ | |
62 | ctx_alloc(pm); | 68 | ctx_alloc(pm); | |
63 | ctx = pm->pm_ctx; | 69 | ctx = pm->pm_ctx; | |
64 | } | 70 | } | |
65 | 71 | |||
66 | if (len) { | 72 | resid = len; | |
67 | __asm volatile("mtctr %3;" /* Set up counter */ | 73 | __asm volatile( | |
68 | "mfmsr %0;" /* Save MSR */ | 74 | "mtctr %3;" /* Set up counter */ | |
69 | "li %1,0x20; " | 75 | "mfmsr %0;" /* Save MSR */ | |
70 | "andc %1,%0,%1; mtmsr %1;" /* Disable IMMU */ | 76 | "li %1,0x20;" | |
71 | "mfpid %1;" /* Save old PID */ | 77 | "andc %1,%0,%1; mtmsr %1;" /* Disable IMMU */ | |
72 | "sync; isync;" | 78 | "mfpid %1;" /* Save old PID */ | |
73 | 79 | "sync; isync;" | ||
74 | "li %3,0;" /* Clear len */ | 80 | ||
75 | 81 | "1: " | ||
76 | "1: " | 82 | "mtpid %4; sync;" /* Load user ctx */ | |
77 | "mtpid %4; sync;" /* Load user ctx */ | 83 | "lbz %2,0(%5); addi %5,%5,1;" /* Load byte */ | |
78 | "lbz %2,0(%5); addi %5,%5,1;" /* Load byte */ | 84 | "sync; isync;" | |
79 | "sync; isync;" | 85 | "mtpid %1; sync;" | |
80 | "mtpid %1;sync;" | 86 | "stb %2,0(%6); dcbst 0,%6; addi %6,%6,1;" | |
81 | "stb %2,0(%6); dcbf 0,%6; addi %6,%6,1;" /* Store kernel byte */ | 87 | /* Store kernel byte */ | |
82 | "sync; isync;" | 88 | "sync; isync;" | |
83 | "addi %3,%3,1;" /* Inc len */ | 89 | "or. %2,%2,%2;" | |
84 | "or. %2,%2,%2;" | 90 | "bdnzf 2,1b;" /* while(ctr-- && !zero) */ | |
85 | "bdnzf 2,1b;" /* | 91 | ||
86 | * while(ctr-- && !zero) | 92 | "mtpid %1; mtmsr %0;" /* Restore PID, MSR */ | |
87 | */ | 93 | "sync; isync;" | |
88 | 94 | "mfctr %3;" /* Restore resid */ | ||
89 | "mtpid %1; mtmsr %0;" /* Restore PID, MSR */ | 95 | : "=&r" (msr), "=&r" (pid), "=&r" (data), "+r" (resid) | |
90 | "sync; isync;" | 96 | : "r" (ctx), "b" (udaddr), "b" (kaddr)); | |
91 | : "=&r" (msr), "=&r" (pid), "=&r" (tmp), "+b" (len) | 97 | ||
92 | : "r" (ctx), "b" (udaddr), "b" (kaddr)); | |||
93 | } | |||
94 | curpcb->pcb_onfault = NULL; | 98 | curpcb->pcb_onfault = NULL; | |
95 | if (done) | 99 | if (done) | |
96 | *done = len; | 100 | *done = len - resid; | |
97 | return 0; | 101 | if (resid == 0 && (char)data != '\0') | |
102 | return ENAMETOOLONG; | |||
103 | else | |||
104 | return 0; | |||
98 | } | 105 | } |
--- src/sys/arch/powerpc/ibm4xx/copyoutstr.c 2010/03/20 23:31:29 1.9
+++ src/sys/arch/powerpc/ibm4xx/copyoutstr.c 2020/03/09 11:52:14 1.9.64.1
@@ -1,14 +1,14 @@ | @@ -1,14 +1,14 @@ | |||
1 | /* $NetBSD: copyoutstr.c,v 1.9 2010/03/20 23:31:29 chs Exp $ */ | 1 | /* $NetBSD: copyoutstr.c,v 1.9.64.1 2020/03/09 11:52:14 martin Exp $ */ | |
2 | 2 | |||
3 | /* | 3 | /* | |
4 | * Copyright 2001 Wasabi Systems, Inc. | 4 | * Copyright 2001 Wasabi Systems, Inc. | |
5 | * All rights reserved. | 5 | * All rights reserved. | |
6 | * | 6 | * | |
7 | * Written by Eduardo Horvath and Simon Burge for Wasabi Systems, Inc. | 7 | * Written by Eduardo Horvath and Simon Burge for Wasabi Systems, Inc. | |
8 | * | 8 | * | |
9 | * Redistribution and use in source and binary forms, with or without | 9 | * Redistribution and use in source and binary forms, with or without | |
10 | * modification, are permitted provided that the following conditions | 10 | * modification, are permitted provided that the following conditions | |
11 | * are met: | 11 | * are met: | |
12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright | |
13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. | |
14 | * 2. Redistributions in binary form must reproduce the above copyright | 14 | * 2. Redistributions in binary form must reproduce the above copyright | |
@@ -26,73 +26,80 @@ | @@ -26,73 +26,80 @@ | |||
26 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | 26 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | |
27 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | 27 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
28 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC | 28 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC | |
29 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | 29 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
30 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 30 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
31 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | 31 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
32 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | 32 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
33 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 33 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
34 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 34 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
35 | * POSSIBILITY OF SUCH DAMAGE. | 35 | * POSSIBILITY OF SUCH DAMAGE. | |
36 | */ | 36 | */ | |
37 | 37 | |||
38 | #include <sys/cdefs.h> | 38 | #include <sys/cdefs.h> | |
39 | __KERNEL_RCSID(0, "$NetBSD: copyoutstr.c,v 1.9 2010/03/20 23:31:29 chs Exp $"); | 39 | __KERNEL_RCSID(0, "$NetBSD: copyoutstr.c,v 1.9.64.1 2020/03/09 11:52:14 martin Exp $"); | |
40 | 40 | |||
41 | #include <sys/param.h> | 41 | #include <sys/param.h> | |
42 | #include <uvm/uvm_extern.h> | 42 | #include <uvm/uvm_extern.h> | |
43 | #include <machine/pcb.h> | 43 | #include <machine/pcb.h> | |
44 | 44 | |||
45 | int | 45 | int | |
46 | copyoutstr(const void *kaddr, void *udaddr, size_t len, size_t *done) | 46 | copyoutstr(const void *kaddr, void *udaddr, size_t len, size_t *done) | |
47 | { | 47 | { | |
48 | struct pmap *pm = curproc->p_vmspace->vm_map.pmap; | 48 | struct pmap *pm = curproc->p_vmspace->vm_map.pmap; | |
49 | int rv, msr, pid, tmp, ctx; | 49 | size_t resid; | |
50 | int rv, msr, pid, data, ctx; | |||
50 | struct faultbuf env; | 51 | struct faultbuf env; | |
51 | 52 | |||
53 | if (__predict_false(len == 0)) { | |||
54 | if (done) | |||
55 | *done = 0; | |||
56 | return 0; | |||
57 | } | |||
58 | ||||
52 | if ((rv = setfault(&env))) { | 59 | if ((rv = setfault(&env))) { | |
53 | curpcb->pcb_onfault = NULL; | 60 | curpcb->pcb_onfault = NULL; | |
54 | /* XXXX -- len may be lost on a fault */ | |||
55 | if (done) | 61 | if (done) | |
56 | *done = len; | 62 | *done = 0; | |
57 | return rv; | 63 | return rv; | |
58 | } | 64 | } | |
59 | 65 | |||
60 | if (!(ctx = pm->pm_ctx)) { | 66 | if (!(ctx = pm->pm_ctx)) { | |
61 | /* No context -- assign it one */ | 67 | /* No context -- assign it one */ | |
62 | ctx_alloc(pm); | 68 | ctx_alloc(pm); | |
63 | ctx = pm->pm_ctx; | 69 | ctx = pm->pm_ctx; | |
64 | } | 70 | } | |
65 | 71 | |||
66 | if (len) { | 72 | resid = len; | |
67 | __asm volatile("mtctr %3;" /* Set up counter */ | 73 | __asm volatile( | |
68 | "mfmsr %0;" /* Save MSR */ | 74 | "mtctr %3;" /* Set up counter */ | |
69 | "li %1,0x20; " | 75 | "mfmsr %0;" /* Save MSR */ | |
70 | "andc %1,%0,%1; mtmsr %1;" /* Disable IMMU */ | 76 | "li %1,0x20;" | |
71 | "mfpid %1;" /* Save old PID */ | 77 | "andc %1,%0,%1; mtmsr %1;" /* Disable IMMU */ | |
72 | "sync; isync;" | 78 | "mfpid %1;" /* Save old PID */ | |
73 | 79 | "sync; isync;" | ||
74 | "li %3,0;" /* Clear len */ | 80 | ||
75 | 81 | "1:" | ||
76 | "1:" | 82 | "mtpid %1; sync;" | |
77 | "mtpid %1;sync;" | 83 | "lbz %2,0(%6); addi %6,%6,1;" /* Store kernel byte */ | |
78 | "lbz %2,0(%6); addi %6,%6,1;" /* Store kernel byte */ | 84 | "sync; isync;" | |
79 | "sync; isync;" | 85 | "mtpid %4; sync;" /* Load user ctx */ | |
80 | "mtpid %4; sync;" /* Load user ctx */ | 86 | "stb %2,0(%5); dcbst 0,%5; addi %5,%5,1;" | |
81 | "stb %2,0(%5); dcbf 0,%5; addi %5,%5,1;" /* Load byte */ | 87 | /* Load byte */ | |
82 | "sync; isync;" | 88 | "sync; isync;" | |
83 | "addi %3,%3,1;" /* Inc len */ | 89 | "or. %2,%2,%2;" | |
84 | "or. %2,%2,%2;" | 90 | "bdnzf 2,1b;" /* while(ctr-- && !zero) */ | |
85 | "bdnzf 2,1b;" /* | 91 | ||
86 | * while(ctr-- && !zero) | 92 | "mtpid %1; mtmsr %0;" /* Restore PID, MSR */ | |
87 | */ | 93 | "sync; isync;" | |
88 | 94 | "mfctr %3;" /* Restore resid */ | ||
89 | "mtpid %1; mtmsr %0;" /* Restore PID, MSR */ | 95 | : "=&r" (msr), "=&r" (pid), "=&r" (data), "+r" (resid) | |
90 | "sync; isync;" | 96 | : "r" (ctx), "b" (udaddr), "b" (kaddr)); | |
91 | : "=&r" (msr), "=&r" (pid), "=&r" (tmp), "+b" (len) | 97 | ||
92 | : "r" (ctx), "b" (udaddr), "b" (kaddr)); | |||
93 | } | |||
94 | curpcb->pcb_onfault = NULL; | 98 | curpcb->pcb_onfault = NULL; | |
95 | if (done) | 99 | if (done) | |
96 | *done = len; | 100 | *done = len - resid; | |
97 | return 0; | 101 | if (resid == 0 && (char)data != '\0') | |
102 | return ENAMETOOLONG; | |||
103 | else | |||
104 | return 0; | |||
98 | } | 105 | } |