PERFORCE change 137457 for review
Peter Wemm
peter at FreeBSD.org
Wed Mar 12 01:43:16 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=137457
Change 137457 by peter at peter_melody on 2008/03/12 01:42:55
Handle arriving via cpu_throw.
Affected files ...
.. //depot/projects/hammer/sys/amd64/amd64/cpu_switch.S#44 edit
Differences ...
==== //depot/projects/hammer/sys/amd64/amd64/cpu_switch.S#44 (text+ko) ====
@@ -80,6 +80,8 @@
movq TD_PCB(%rsi),%rdx /* newtd->td_proc */
movq PCB_CR3(%rdx),%rdx
movq %rdx,%cr3 /* new address space */
+ xorl %r9d,%r9d /* Old pcb pointer */
+ movq TD_PCB(%rsi),%r8
jmp swact
END(cpu_throw)
@@ -106,10 +108,8 @@
movq %rbx,PCB_RBX(%r8)
movq %rax,PCB_RIP(%r8)
-#if 0
/* Save copy of pcb pointer */
movq %r8,%r9
-#endif
testl $PCB_32BIT,PCB_FLAGS(%r8)
jnz store_gs /* static predict not taken */
@@ -170,17 +170,22 @@
* At this point, we've switched address spaces and are ready
* to load up the rest of the next context.
*/
-#if 1
- movq TD_PCB(%rsi),%r8
-#endif
/* Skip loading user fsbase/gsbase for kthreads */
testl $TDP_KTHREAD,TD_PFLAGS(%rsi)
- jnz 2f
+ jnz do_tss
+
+ testq %r9,%r9
+ jz no_pcb
+ cmpq PCB_FSBASE(%r9),%r10
+ cmpq PCB_GSBASE(%r9),%r11
+ jmp check_bases
+no_pcb:
+ movq $-1,%r10 /* Illegal value - force reload on cpu_throw */
+ movq %r10,%r11
- movq TD_PCB(%rdi),%r9
+check_bases:
movq PCB_FSBASE(%r8),%r10
- cmpq PCB_FSBASE(%r9),%r10
jz 1f
/* Restore userland %fs */
movl $MSR_FSBASE,%ecx
@@ -189,8 +194,7 @@
wrmsr
1:
- movq PCB_GSBASE(%r8),%r10
- cmpq PCB_GSBASE(%r9),%r10
+ movq PCB_GSBASE(%r8),%r11
jz 2f
/* Restore userland %gs */
movl $MSR_KGSBASE,%ecx
@@ -198,6 +202,7 @@
movl PCB_GSBASE+4(%r8),%edx
wrmsr
2:
+do_tss:
/* Update the TSS_RSP0 pointer for the next interrupt */
movq PCPU(TSSP), %rax
More information about the p4-projects
mailing list