Module Name:    src
Committed By:   matt
Date:           Thu Dec  1 23:59:14 UTC 2011

Modified Files:
        src/sys/arch/mips/mips [matt-nb5-mips64]: vm_machdep.c

Log Message:
Add code to deal with direct mapped uareas.


To generate a diff of this commit:
cvs rdiff -u -r1.121.6.1.2.22 -r1.121.6.1.2.23 \
    src/sys/arch/mips/mips/vm_machdep.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/mips/mips/vm_machdep.c
diff -u src/sys/arch/mips/mips/vm_machdep.c:1.121.6.1.2.22 src/sys/arch/mips/mips/vm_machdep.c:1.121.6.1.2.23
--- src/sys/arch/mips/mips/vm_machdep.c:1.121.6.1.2.22	Tue Nov 29 07:48:31 2011
+++ src/sys/arch/mips/mips/vm_machdep.c	Thu Dec  1 23:59:14 2011
@@ -122,6 +122,11 @@ cpu_lwp_fork(struct lwp *l1, struct lwp 
 	l2->l_md.md_flags = l1->l_md.md_flags & MDP_FPUSED;
 
 	bool direct_mapped_p = MIPS_KSEG0_P(ua2);
+#ifdef ENABLE_MIPS_KSEGX
+	if (!direct_mapped_p)
+		direct_mapped_p = VM_KSEGX_ADDRESS <= ua2
+		    && ua2 < VM_KSEGX_ADDRESS + VM_KSEGX_SIZE;
+#endif
 #ifdef _LP64
 	direct_mapped_p = direct_mapped_p || MIPS_XKPHYS_P(ua2);
 #endif
@@ -195,6 +200,16 @@ cpu_uarea_remap(struct lwp *l)
 	 * Grab the starting physical address of the uarea.
 	 */
 	va = (vaddr_t)l->l_addr;
+	if (MIPS_KSEG0_P(va))
+		return;
+#ifdef _LP64
+	if (MIPS_XKPHYS_P(va))
+		return;
+#elif defined(ENABLE_MIPS_KSEGX)
+	if (VM_KSEGX_ADDRESS <= va && va < VM_KSEGX_ADDRESS + VM_KSEGX_SIZE)
+		return;
+#endif
+
 	if (!pmap_extract(pmap_kernel(), va, &pa))
 		panic("%s: pmap_extract(%#"PRIxVADDR") failed", __func__, va);
 
@@ -287,6 +302,20 @@ cpu_swapin(struct lwp *l)
 {
 	pt_entry_t *pte;
 	int i, x;
+	vaddr_t kva = (vaddr_t) lwp_getpcb(l);
+
+#ifdef _LP64
+	if (MIPS_XKPHYS_P(kva))
+		return;
+#else
+	if (MIPS_KSEG0_P(kva))
+		return;
+	
+#ifdef ENABLE_MIPS_KSEGX
+	if (VM_KSEGX_ADDRESS <= kva && kva < VM_KSEGX_ADDRESS + VM_KSEGX_SIZE)
+		return;
+#endif
+#endif
 
 	/*
 	 * Cache the PTEs for the user area in the machine dependent
@@ -296,7 +325,7 @@ cpu_swapin(struct lwp *l)
 	x = (MIPS_HAS_R4K_MMU) ?
 	    (MIPS3_PG_G | MIPS3_PG_RO | MIPS3_PG_WIRED) :
 	    MIPS1_PG_G;
-	pte = kvtopte(l->l_addr);
+	pte = kvtopte(kva);
 	for (i = 0; i < UPAGES; i++)
 		l->l_md.md_upte[i] = pte[i].pt_entry &~ x;
 }

Reply via email to