Author: kib
Date: Wed Dec 15 15:25:56 2010
New Revision: 216458
URL: http://svn.freebsd.org/changeset/base/216458

Log:
  MFC r216255:
  Update some comments related to use of amd64 full context switch.
  In exec_linux_setregs(), use locally cached pointer to pcb to set
  pcb_full_iret.
  In set_regs(), note that full return is needed when code that sets
  segment registers is enabled.
  
  Approved by:  re (bz)

Modified:
  stable/8/sys/amd64/amd64/machdep.c
  stable/8/sys/amd64/amd64/vm_machdep.c
  stable/8/sys/amd64/linux32/linux32_sysvec.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)

Modified: stable/8/sys/amd64/amd64/machdep.c
==============================================================================
--- stable/8/sys/amd64/amd64/machdep.c  Wed Dec 15 15:23:25 2010        
(r216457)
+++ stable/8/sys/amd64/amd64/machdep.c  Wed Dec 15 15:25:56 2010        
(r216458)
@@ -1895,6 +1895,7 @@ set_regs(struct thread *td, struct reg *
                tp->tf_fs = regs->r_fs;
                tp->tf_gs = regs->r_gs;
                tp->tf_flags = TF_HASSEGS;
+               td->td_pcb->pcb_full_iret = 1;
        }
        return (0);
 }

Modified: stable/8/sys/amd64/amd64/vm_machdep.c
==============================================================================
--- stable/8/sys/amd64/amd64/vm_machdep.c       Wed Dec 15 15:23:25 2010        
(r216457)
+++ stable/8/sys/amd64/amd64/vm_machdep.c       Wed Dec 15 15:25:56 2010        
(r216458)
@@ -339,10 +339,9 @@ cpu_set_syscall_retval(struct thread *td
                 * Reconstruct pc, we know that 'syscall' is 2 bytes,
                 * lcall $X,y is 7 bytes, int 0x80 is 2 bytes.
                 * We saved this in tf_err.
-                * We have to do a full context restore so that %r10
-                * (which was holding the value of %rcx) is restored
+                * %r10 (which was holding the value of %rcx) is restored
                 * for the next iteration.
-                * r10 restore is only required for freebsd/amd64 processes,
+                * %r10 restore is only required for freebsd/amd64 processes,
                 * but shall be innocent for any ia32 ABI.
                 */
                td->td_frame->tf_rip -= td->td_frame->tf_err;

Modified: stable/8/sys/amd64/linux32/linux32_sysvec.c
==============================================================================
--- stable/8/sys/amd64/linux32/linux32_sysvec.c Wed Dec 15 15:23:25 2010        
(r216457)
+++ stable/8/sys/amd64/linux32/linux32_sysvec.c Wed Dec 15 15:25:56 2010        
(r216458)
@@ -875,13 +875,13 @@ exec_linux_setregs(td, entry, stack, ps_
        regs->tf_flags = TF_HASSEGS;
        regs->tf_cs = _ucode32sel;
        regs->tf_rbx = ps_strings;
-       td->td_pcb->pcb_full_iret = 1;
        load_cr0(rcr0() | CR0_MP | CR0_TS);
        fpstate_drop(td);
 
-       /* Return via doreti so that we can change to a different %cs */
+       /* Do full restore on return so that we can change to a different %cs */
        pcb->pcb_flags |= PCB_32BIT;
        pcb->pcb_flags &= ~PCB_GS32BIT;
+       pcb->pcb_full_iret = 1;
        td->td_retval[1] = 0;
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to