PERFORCE change 211454 for review

Robert Watson rwatson at FreeBSD.org
Sun May 20 22:09:33 UTC 2012


http://p4web.freebsd.org/@@211454?ac=10

Change 211454 by rwatson at rwatson_svr_ctsrd_mipsbuild on 2012/05/20 22:08:44

	When creating and maintaining kernel and user contexts, force
	coprocessor 2 to be enabled.  In a few places comment on the
	paucity of this approach.  In the future we will want to
	conditionally manage CHERI CP2 context as is done for CP1 and
	Octeon CP2 support, reducing context switch costs when the
	features aren't in active use.

Affected files ...

.. //depot/projects/ctsrd/cheribsd/src/sys/mips/mips/pm_machdep.c#2 edit
.. //depot/projects/ctsrd/cheribsd/src/sys/mips/mips/vm_machdep.c#3 edit

Differences ...

==== //depot/projects/ctsrd/cheribsd/src/sys/mips/mips/pm_machdep.c#2 (text+ko) ====

@@ -523,6 +523,9 @@
 	td->td_frame->sr |= MIPS_SR_PX | MIPS_SR_UX |
 	    MIPS_SR_KX | MIPS_SR_SX;
 #endif
+#if defined(CPU_CHERI)
+	td->td_frame->sr |= MIPS_SR_COP_2_BIT;
+#endif
 	/*
 	 * FREEBSD_DEVELOPERS_FIXME:
 	 * Setup any other CPU-Specific registers (Not MIPS Standard)

==== //depot/projects/ctsrd/cheribsd/src/sys/mips/mips/vm_machdep.c#3 (text+ko) ====

@@ -165,7 +165,12 @@
 	td2->td_md.md_saved_intr = MIPS_SR_INT_IE;
 	td2->td_md.md_spinlock_count = 1;
 #ifdef CPU_CHERI
-	/* XXXRW: CP2 state management here. */
+	/*
+	 * XXXRW: Ensure capability coprocessor is enabled for both kernel and
+	 * userspace in child.
+	 */
+	td2->td_frame->sr |= MIPS_SR_COP_2_BIT;
+	pcb2->pcb_context[PCB_REG_SR] |= MIPS_SR_COP_2_BIT;
 #endif
 #ifdef CPU_CNMIPS
 	if (td1->td_md.md_flags & MDTD_COP2USED) {
@@ -411,6 +416,13 @@
 	pcb2->pcb_context[PCB_REG_SR] = mips_rd_status() &
 	    (MIPS_SR_KX | MIPS_SR_UX | MIPS_SR_INT_MASK);
 
+#ifdef CPU_CHERI
+	/*
+	 * XXXRW: Interesting that we just set pcb_context here and not also
+	 * the trap frame.
+	 */
+	pcb2->pcb_context[PCB_REG_SR] |= MIPS_SR_COP_2_BIT;
+#endif
 #ifdef CPU_CNMIPS
 	pcb2->pcb_context[PCB_REG_SR] |= MIPS_SR_COP_0_BIT |
 	  MIPS_SR_PX | MIPS_SR_UX | MIPS_SR_KX | MIPS_SR_SX;
@@ -470,6 +482,9 @@
 
 	/*
 	 * Keep interrupt mask
+	 *
+	 * XXXRW: I'm a bit puzzled by the code below and feel that even if it
+	 * works, it can't really be right.
 	 */
 	td->td_frame->sr = MIPS_SR_KSU_USER | MIPS_SR_EXL | MIPS_SR_INT_IE |
 	    (mips_rd_status() & MIPS_SR_INT_MASK);
@@ -478,6 +493,9 @@
 #elif  defined(__mips_n64)
 	td->td_frame->sr |= MIPS_SR_PX | MIPS_SR_UX | MIPS_SR_KX;
 #endif
+#ifdef CPU_CHERI
+	tf->sr |= MIPS_SR_COP_2_BIT;
+#endif
 #ifdef CPU_CNMIPS
 	tf->sr |=  MIPS_SR_INT_IE | MIPS_SR_COP_0_BIT | MIPS_SR_PX | MIPS_SR_UX |
 	  MIPS_SR_KX;


More information about the p4-projects mailing list