diff options
author | nwhitehorn <nwhitehorn@FreeBSD.org> | 2010-10-31 22:55:51 +0000 |
---|---|---|
committer | nwhitehorn <nwhitehorn@FreeBSD.org> | 2010-10-31 22:55:51 +0000 |
commit | bd1e7d8ed8160529af7733432a1f7c35f9861ec2 (patch) | |
tree | d5abe6bcaa7a1d25ea37ca42fc954918d4141caf /sys/powerpc | |
parent | 46c88a1892c929cf359c6b6d6ff2d2b4dcae9272 (diff) | |
download | FreeBSD-src-bd1e7d8ed8160529af7733432a1f7c35f9861ec2.zip FreeBSD-src-bd1e7d8ed8160529af7733432a1f7c35f9861ec2.tar.gz |
Next-to-leading-order perturbation of synchronization operations for
switching the user segment register. All races should now be closed and
a minimum of pipelines flushes be required to close them.
Diffstat (limited to 'sys/powerpc')
-rw-r--r-- | sys/powerpc/aim/copyinout.c | 4 | ||||
-rw-r--r-- | sys/powerpc/aim/swtch32.S | 2 | ||||
-rw-r--r-- | sys/powerpc/aim/swtch64.S | 4 |
3 files changed, 5 insertions, 5 deletions
diff --git a/sys/powerpc/aim/copyinout.c b/sys/powerpc/aim/copyinout.c index c6fa83c..8451f80 100644 --- a/sys/powerpc/aim/copyinout.c +++ b/sys/powerpc/aim/copyinout.c @@ -117,9 +117,9 @@ set_user_sr(pmap_t pm, const void *addr) if (curthread->td_pcb->pcb_cpu.aim.usr_vsid == vsid) return; - __asm __volatile ("sync; mtsr %0,%1; sync; isync" :: "n"(USER_SR), - "r"(vsid)); + __asm __volatile("isync"); curthread->td_pcb->pcb_cpu.aim.usr_vsid = vsid; + __asm __volatile("mtsr %0,%1; isync" :: "n"(USER_SR), "r"(vsid)); } #endif diff --git a/sys/powerpc/aim/swtch32.S b/sys/powerpc/aim/swtch32.S index f5dba2a..3b608f8 100644 --- a/sys/powerpc/aim/swtch32.S +++ b/sys/powerpc/aim/swtch32.S @@ -89,7 +89,6 @@ ENTRY(cpu_switch) mflr %r16 /* Save the link register */ stw %r16,PCB_LR(%r6) mfsr %r16,USER_SR /* Save USER_SR for copyin/out */ - isync stw %r16,PCB_AIM_USR_VSID(%r6) stw %r1,PCB_SP(%r6) /* Save the stack pointer */ stw %r2,PCB_TOC(%r6) /* Save the TOC pointer */ @@ -162,6 +161,7 @@ blocked_loop: lwz %r5,PCB_LR(%r3) /* Load the link register */ mtlr %r5 lwz %r5,PCB_AIM_USR_VSID(%r3) /* Load the USER_SR segment reg */ + isync mtsr USER_SR,%r5 isync lwz %r1,PCB_SP(%r3) /* Load the stack pointer */ diff --git a/sys/powerpc/aim/swtch64.S b/sys/powerpc/aim/swtch64.S index 4ffc8fa..f1af24e 100644 --- a/sys/powerpc/aim/swtch64.S +++ b/sys/powerpc/aim/swtch64.S @@ -113,7 +113,6 @@ ENTRY(cpu_switch) li %r15,0 /* Save user segment for copyin/out */ li %r16,USER_SLB_SLOT slbmfev %r15, %r16 - isync std %r15,PCB_AIM_USR_VSID(%r6) mr %r14,%r3 /* Copy the old thread ptr... */ @@ -222,6 +221,7 @@ blocked_loop: ori %r5,%r5,USER_ADDR@highera sldi %r5,%r5,32 oris %r5,%r5,USER_ADDR@ha + isync slbie %r5 lis %r6,USER_SLB_SLBE@highesta ori %r6,%r6,USER_SLB_SLBE@highera @@ -230,8 +230,8 @@ blocked_loop: ori %r6,%r6,USER_SLB_SLBE@l ld %r5,PCB_AIM_USR_VSID(%r3) slbmte %r5,%r6 - isync + /* * Perform a dummy stdcx. to clear any reservations we may have * inherited from the previous thread. It doesn't matter if the |