Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 20 Feb 2009 19:48:39 GMT
From:      Arnar Mar Sig <antab@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 157989 for review
Message-ID:  <200902201948.n1KJmdlh009749@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=157989

Change 157989 by antab@antab_farm on 2009/02/20 19:48:34

	Little fix to cpu_switch. switching to p1 is done but its pmap has no mappings.

Affected files ...

.. //depot/projects/avr32/src/sys/avr32/avr32/pmap.c#5 edit
.. //depot/projects/avr32/src/sys/avr32/avr32/switch.S#4 edit

Differences ...

==== //depot/projects/avr32/src/sys/avr32/avr32/pmap.c#5 (text+ko) ====

@@ -96,6 +96,8 @@
 		kernel_pmap->pm_pd[j] = (pd_entry_t)(pagetables + (i * NPTEPG));
 	}
 
+	kernel_vm_end = VM_MAX_KERNEL_ADDRESS;
+
 	/* Enable paging */
 	tlb_flush();
 	sysreg_write(PTBR, (uint32_t)kernel_pmap->pm_pd);
@@ -382,7 +384,6 @@
 	pt_entry_t origpte, newpte;
 	vm_page_t mpte, om;
 
-
 	vm_page_lock_queues();
 	PMAP_LOCK(pmap);
 
@@ -437,7 +438,7 @@
 		}
 		if (page_is_managed(opa)) {
 			om = PHYS_TO_VM_PAGE(opa);
-	//		pmap_remove_entry(pmap, om, va);
+			pmap_remove_entry(pmap, om, va);
 		}
 		if (mpte) {
 			mpte->wire_count--;
@@ -679,7 +680,6 @@
 	 */
 	pmap->pm_stats.resident_count++;
 	ptepa = VM_PAGE_TO_PHYS(m);
-	printf("****: page: %x\n", ptepa);
 	pmap->pm_pd[ptepindex] = (pd_entry_t)ptepa;
 	avr32_impl();
 	return m;
@@ -827,12 +827,13 @@
 	}
 
 	if (!ent || !*ent) {
-		printf("\nTLB miss: %x\n", ecr);
+		breakpoint();
+	/*	printf("\nTLB miss: %x\n", ecr);
 		printf("pd: %x\n", sysreg_read(PTBR));
 		printf("TLBEAR: %x\n", tlbear);
 		printf("TLBEHI: %x\n", tlbehi);
 		printf("PC: %x\n", sysreg_read(RAR_EX));
-		printf("SR: %x\n", sysreg_read(RSR_EX));
+		printf("SR: %x\n", sysreg_read(RSR_EX)); */
 
 		panic("pmap_tlb_miss: address not in pmap\n");
 	}

==== //depot/projects/avr32/src/sys/avr32/avr32/switch.S#4 (text+ko) ====

@@ -53,6 +53,7 @@
 	mov	lr, r8
 	retal	sp				/* return 0 */
 
+
 /**
  * r12: Pointer struct thread
  * r11: Pmap
@@ -70,15 +71,17 @@
 	 * r4:  Misc
 	 * r3:	tlbehi save
 	 * r2:  Address of PCB
+	 * r1:  Pointer to PD
 	 */
 
-	/* Load PCB address */
+	/* Load PCB and PD address */
 	ld.w	r2, r12[TD_PCB]
+	sub	r1, r11, -(PMAP_PD)
+	ld.w	r1, r1
 
 
 	/* Check if stack is in stack is is P3 */
-	mov	r10, r12
-	sub	r10, -(TD_KSTACK)
+	sub	r10, r12, -(TD_KSTACK)
 	ld.w	r10, r10
 	mov	r9, r10
 	lsr	r9, 29
@@ -86,14 +89,12 @@
 	brne	restore_finish
 
 	/* Add ASID and V flag to kstack value */
-	mov	r4, r11
-	sub	r4, -(PMAP_ASID)
+	sub	r4, r11, -(PMAP_ASID)
 	ld.w	r4, r4
 	add	r10, r4
 	sbr	r10, AT32_SYS_TLBEHI_V
 
-	mov	r9, r12
-	sub	r9, -(TD_KPTE)			/* Add KPTE offset to thread struct pointer */
+	sub	r9, r12, -(TD_KPTE)		/* Add KPTE offset to thread struct pointer */
 	mov	r8, KSTACK_PAGES		/* Iterate thru thru all kstack pages */
 
 	mfsr	r3, AT32_SYS_TLBEHI
@@ -137,10 +138,7 @@
 	brne	1b				/* Or not */
 
 restore_finish:
-	/* Restore old context */
-	sub	r11, -(PMAP_PD)
-	ld.w	r11, r11
-	mtsr	AT32_SYS_PTBR, r11		/* Point lookups to new pmap */
+	mtsr	AT32_SYS_PTBR, r1		/* Point lookups to new pmap */
 	mtsr	AT32_SYS_TLBEHI, r10		/* Set TLBEHI (ASID for new td) */
 	nop					/* Wait for mtsr */
 	ld.w	r4, r2++			/* Load status register */
@@ -151,3 +149,4 @@
 	frs					/* Flush the return stack */
 	sub	pc, -2				/* Flush the pipeline */
 	retal	pc				/* return 1 */
+



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200902201948.n1KJmdlh009749>