On Sun, 3 Apr 2016, Philip Guenther wrote:
> amd64's savectx() only updates pcb_rsp and pcb_rbp, which in cpu_fork() 
> are promptly overwriten in the child's pcb, so do the same 
> simplification as on i386.

Thinking about this more, I believe these savectx() calls date from when 
cpu_fork() worked completely differently, with the child actually 
returning back through cpu_fork().  Now, the child's stack frame is 
updated to make it start in proc_trampoline() when it's first switched to, 
so the registers that savectx() saves (stack/frame pointers, maybe 
callee-saved registers) are useless to the child.

On that theory, I'm going to test the mips64 part of this diff.  I don't 
have arm or m88k to test; anyone?

(This reduces savectx to almost only being called from dumpsys().  I don't 
understand why mips64 and m88k platforms call it from boot(); something 
evil about the reset stuff, or just debug bits?  m88k also calls it from 
cpu_switchto; other archs have inlined it...)


Philip Guenther


Index: arm/arm/vm_machdep.c
===================================================================
RCS file: /cvs/src/sys/arch/arm/arm/vm_machdep.c,v
retrieving revision 1.16
diff -u -p -r1.16 vm_machdep.c
--- arm/arm/vm_machdep.c        15 Aug 2015 22:20:20 -0000      1.16
+++ arm/arm/vm_machdep.c        3 Apr 2016 19:34:00 -0000
@@ -108,11 +108,6 @@ cpu_fork(p1, p2, stack, stacksize, func,
        struct trapframe *tf;
        struct switchframe *sf;
 
-       if (p1 == curproc) {
-               /* Sync the PCB before we copy it. */
-               savectx(curpcb);
-       }
-
        /* Copy the pcb */
        *pcb = p1->p_addr->u_pcb;
 
Index: m88k/m88k/vm_machdep.c
===================================================================
RCS file: /cvs/src/sys/arch/m88k/m88k/vm_machdep.c,v
retrieving revision 1.24
diff -u -p -r1.24 vm_machdep.c
--- m88k/m88k/vm_machdep.c      5 May 2015 02:13:47 -0000       1.24
+++ m88k/m88k/vm_machdep.c      3 Apr 2016 19:34:00 -0000
@@ -86,13 +86,8 @@ cpu_fork(p1, p2, stack, stacksize, func,
        } *ksfp;
        extern void proc_trampoline(void);
 
-       /* Copy pcb from p1 to p2. */
-       if (p1 == curproc) {
-               /* Sync the PCB before we copy it. */
-               savectx(curpcb);
-       }
 #ifdef DIAGNOSTIC
-       else if (p1 != &proc0)
+       if (p1 != curproc && p1 != &proc0)
                panic("cpu_fork: curproc");
 #endif
 
Index: mips64/mips64/vm_machdep.c
===================================================================
RCS file: /cvs/src/sys/arch/mips64/mips64/vm_machdep.c,v
retrieving revision 1.33
diff -u -p -r1.33 vm_machdep.c
--- mips64/mips64/vm_machdep.c  6 Mar 2016 19:42:27 -0000       1.33
+++ mips64/mips64/vm_machdep.c  3 Apr 2016 19:34:00 -0000
@@ -104,13 +104,8 @@ cpu_fork(p1, p2, stack, stacksize, func,
        KASSERT((p2->p_md.md_flags & MDP_FPUSED) == 0);
 #endif
 
-       /* Copy pcb from p1 to p2 */
-       if (p1 == curproc) {
-               /* Sync the PCB before we copy it. */
-               savectx(p1->p_addr, 0);
-       }
 #ifdef DIAGNOSTIC
-       else if (p1 != &proc0)
+       if (p1 != curproc && p1 != &proc0)
                panic("cpu_fork: curproc");
 #endif
        *pcb = p1->p_addr->u_pcb;

Reply via email to