Author: marcel
Date: Mon Feb 18 05:05:01 2013
New Revision: 246937
URL: http://svnweb.freebsd.org/changeset/base/246937

Log:
  MFC r246715:
  Eliminate the PC_CURTHREAD symbol and load the current thread's
  thread structure pointer atomically from r13 (the pcpu pointer)
  for the current CPU/core.

Modified:
  stable/9/sys/ia64/ia64/genassym.c
  stable/9/sys/ia64/ia64/machdep.c
  stable/9/sys/ia64/ia64/support.S
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/ia64/ia64/genassym.c
==============================================================================
--- stable/9/sys/ia64/ia64/genassym.c   Mon Feb 18 04:33:45 2013        
(r246936)
+++ stable/9/sys/ia64/ia64/genassym.c   Mon Feb 18 05:05:01 2013        
(r246937)
@@ -96,7 +96,6 @@ ASSYM(PAGE_SHIFT,     PAGE_SHIFT);
 ASSYM(PAGE_SIZE,       PAGE_SIZE);
 
 ASSYM(PC_CURRENT_PMAP, offsetof(struct pcpu, pc_md.current_pmap));
-ASSYM(PC_CURTHREAD,    offsetof(struct pcpu, pc_curthread));
 ASSYM(PC_IDLETHREAD,   offsetof(struct pcpu, pc_idlethread));
 
 ASSYM(PCB_CURRENT_PMAP,        offsetof(struct pcb, pcb_current_pmap));

Modified: stable/9/sys/ia64/ia64/machdep.c
==============================================================================
--- stable/9/sys/ia64/ia64/machdep.c    Mon Feb 18 04:33:45 2013        
(r246936)
+++ stable/9/sys/ia64/ia64/machdep.c    Mon Feb 18 05:05:01 2013        
(r246937)
@@ -98,6 +98,22 @@ __FBSDID("$FreeBSD$");
 #include <machine/unwind.h>
 #include <machine/vmparam.h>
 
+/*
+ * For atomicity reasons, we demand that pc_curthread is the first
+ * field in the struct pcpu. It allows us to read the pointer with
+ * a single atomic instruction:
+ *     ld8 %curthread = [r13]
+ * Otherwise we would first have to calculate the load address and
+ * store the result in a temporary register and that for the load:
+ *     add %temp = %offsetof(struct pcpu), r13
+ *     ld8 %curthread = [%temp]
+ * A context switch inbetween the add and the ld8 could have the
+ * thread migrate to a different core. In that case,  %curthread
+ * would be the thread running on the original core and not actually
+ * the current thread.
+ */
+CTASSERT(offsetof(struct pcpu, pc_curthread) == 0);
+
 SYSCTL_NODE(_hw, OID_AUTO, freq, CTLFLAG_RD, 0, "");
 SYSCTL_NODE(_machdep, OID_AUTO, cpu, CTLFLAG_RD, 0, "");
 

Modified: stable/9/sys/ia64/ia64/support.S
==============================================================================
--- stable/9/sys/ia64/ia64/support.S    Mon Feb 18 04:33:45 2013        
(r246936)
+++ stable/9/sys/ia64/ia64/support.S    Mon Feb 18 05:05:01 2013        
(r246937)
@@ -73,26 +73,25 @@ END(fusufault)
  */
 ENTRY(casuword, 3)
 {      .mlx
-       add             r15=PC_CURTHREAD,r13
+       ld8.acq         r15=[r13]               // r15 = curthread
        movl            r14=VM_MAXUSER_ADDRESS
        ;;
 }
 {      .mib
-       ld8             r15=[r15]               // r15 = curthread
+       add             r15=TD_PCB,r15
        cmp.geu         p6,p0=in0,r14
 (p6)   br.dpnt.few     1f
        ;;
 }
 {      .mlx
-       add             r15=TD_PCB,r15
+       ld8             r15=[r15]               // r15 = PCB
        movl            r14=fusufault
        ;;
 }
 {      .mmi
-       ld8             r15=[r15]               // r15 = PCB
-       ;;
        mov             ar.ccv=in1
        add             r15=PCB_ONFAULT,r15
+       nop             0
        ;;
 }
 {      .mmi
@@ -123,12 +122,11 @@ END(casuword)
  */
 ENTRY(casuword32, 3)
 {      .mlx
-       add             r15=PC_CURTHREAD,r13
        movl            r14=VM_MAXUSER_ADDRESS
        ;;
 }
 {      .mib
-       ld8             r15=[r15]               // r15 = curthread
+       ld8.acq         r15=[r13]               // r15 = curthread
        cmp.geu         p6,p0=in0,r14
 (p6)   br.dpnt.few     1f
        ;;
@@ -177,12 +175,11 @@ END(casuword32)
 
 ENTRY(subyte, 2)
 {      .mlx
-       add             r15=PC_CURTHREAD,r13
        movl            r14=VM_MAXUSER_ADDRESS
        ;;
 }
 {      .mib
-       ld8             r15=[r15]               // r15 = curthread
+       ld8.acq         r15=[r13]               // r15 = curthread
        cmp.geu         p6,p0=in0,r14
 (p6)   br.dpnt.few     1f
        ;;
@@ -223,12 +220,11 @@ END(subyte)
 
 ENTRY(suword16, 2)
 {      .mlx
-       add             r15=PC_CURTHREAD,r13
        movl            r14=VM_MAXUSER_ADDRESS
        ;;
 }
 {      .mib
-       ld8             r15=[r15]               // r15 = curthread
+       ld8.acq         r15=[r13]               // r15 = curthread
        cmp.geu         p6,p0=in0,r14
 (p6)   br.dpnt.few     1f
        ;;
@@ -269,12 +265,11 @@ END(suword16)
 
 ENTRY(suword32, 2)
 {      .mlx
-       add             r15=PC_CURTHREAD,r13
        movl            r14=VM_MAXUSER_ADDRESS
        ;;
 }
 {      .mib
-       ld8             r15=[r15]               // r15 = curthread
+       ld8.acq         r15=[r13]               // r15 = curthread
        cmp.geu         p6,p0=in0,r14
 (p6)   br.dpnt.few     1f
        ;;
@@ -316,12 +311,11 @@ END(suword32)
 ENTRY(suword64, 2)
 XENTRY(suword)
 {      .mlx
-       add             r15=PC_CURTHREAD,r13
        movl            r14=VM_MAXUSER_ADDRESS
        ;;
 }
 {      .mib
-       ld8             r15=[r15]               // r15 = curthread
+       ld8.acq         r15=[r13]               // r15 = curthread
        cmp.geu         p6,p0=in0,r14
 (p6)   br.dpnt.few     1f
        ;;
@@ -370,12 +364,11 @@ END(suword64)
 
 ENTRY(fubyte, 1)
 {      .mlx
-       add             r15=PC_CURTHREAD,r13
        movl            r14=VM_MAXUSER_ADDRESS
        ;;
 }
 {      .mib
-       ld8             r15=[r15]               // r15 = curthread
+       ld8.acq         r15=[r13]               // r15 = curthread
        cmp.geu         p6,p0=in0,r14
 (p6)   br.dpnt.few     1f
        ;;
@@ -416,12 +409,11 @@ END(fubyte)
 
 ENTRY(fuword16, 2)
 {      .mlx
-       add             r15=PC_CURTHREAD,r13
        movl            r14=VM_MAXUSER_ADDRESS
        ;;
 }
 {      .mib
-       ld8             r15=[r15]               // r15 = curthread
+       ld8.acq         r15=[r13]               // r15 = curthread
        cmp.geu         p6,p0=in0,r14
 (p6)   br.dpnt.few     1f
        ;;
@@ -462,12 +454,11 @@ END(fuword16)
 
 ENTRY(fuword32, 2)
 {      .mlx
-       add             r15=PC_CURTHREAD,r13
        movl            r14=VM_MAXUSER_ADDRESS
        ;;
 }
 {      .mib
-       ld8             r15=[r15]               // r15 = curthread
+       ld8.acq         r15=[r13]               // r15 = curthread
        cmp.geu         p6,p0=in0,r14
 (p6)   br.dpnt.few     1f
        ;;
@@ -509,12 +500,11 @@ END(fuword32)
 ENTRY(fuword64, 2)
 XENTRY(fuword)
 {      .mlx
-       add             r15=PC_CURTHREAD,r13
        movl            r14=VM_MAXUSER_ADDRESS
        ;;
 }
 {      .mib
-       ld8             r15=[r15]               // r15 = curthread
+       ld8.acq         r15=[r13]               // r15 = curthread
        cmp.geu         p6,p0=in0,r14
 (p6)   br.dpnt.few     1f
        ;;
@@ -630,10 +620,8 @@ ENTRY(copyinstr, 4)
        cmp.geu p6,p0=in0,loc2                  // is in user space.
        ;; 
 (p6)   br.cond.spnt.few copyerr                // if it's not, error out.
+       ld8.acq r15=[r13]
        movl    r14=copyerr                     // set up fault handler.
-       add     r15=PC_CURTHREAD,r13            // find curthread
-       ;;
-       ld8     r15=[r15]
        ;;
        add     r15=TD_PCB,r15                  // find pcb
        ;;
@@ -743,10 +731,8 @@ ENTRY(copyin, 3)
        cmp.geu p6,p0=in0,loc2                  // is in user space.
        ;; 
 (p6)   br.cond.spnt.few copyerr                // if it's not, error out.
+       ld8.acq r15=[r13]
        movl    r14=copyerr                     // set up fault handler.
-       add     r15=PC_CURTHREAD,r13            // find curthread
-       ;;
-       ld8     r15=[r15]
        ;;
        add     r15=TD_PCB,r15                  // find pcb
        ;;
@@ -781,10 +767,8 @@ ENTRY(copyout, 3)
        cmp.geu p6,p0=in1,loc2                  // is in user space.
        ;; 
 (p6)   br.cond.spnt.few copyerr                // if it's not, error out.
+       ld8.acq r15=[r13]
        movl    r14=copyerr                     // set up fault handler.
-       add     r15=PC_CURTHREAD,r13            // find curthread
-       ;;
-       ld8     r15=[r15]
        ;;
        add     r15=TD_PCB,r15                  // find pcb
        ;;
@@ -806,8 +790,7 @@ ENTRY(copyout, 3)
 END(copyout)
 
 ENTRY(copyerr, 0)
-       add     r14=PC_CURTHREAD,r13 ;;         // find curthread
-       ld8     r14=[r14] ;;
+       ld8.acq r14=[r13] ;;
        add     r14=TD_PCB,r14 ;;               // curthread->td_addr
        ld8     r14=[r14] ;;
        add     r14=PCB_ONFAULT,r14 ;;          // 
&curthread->td_pcb->pcb_onfault
_______________________________________________
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