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