svn commit: r271232 - head/sys/arm/arm

Andrew Turner andrew at FreeBSD.org
Sun Sep 7 18:32:43 UTC 2014


Author: andrew
Date: Sun Sep  7 18:32:42 2014
New Revision: 271232
URL: http://svnweb.freebsd.org/changeset/base/271232

Log:
  Generalise the va to pa code and use it when starting secondary cores
  
  Reviewed by:	ian@, rpaulo@
  Differential Revision: https://reviews.freebsd.org/D736

Modified:
  head/sys/arm/arm/locore.S

Modified: head/sys/arm/arm/locore.S
==============================================================================
--- head/sys/arm/arm/locore.S	Sun Sep  7 18:30:29 2014	(r271231)
+++ head/sys/arm/arm/locore.S	Sun Sep  7 18:32:42 2014	(r271232)
@@ -152,21 +152,7 @@ Lunmapped:
 
 	/* Find the delta between VA and PA */
 	adr	r0, Lpagetable
-	ldr	r1, [r0]
-	sub	r2, r1, r0
-	/* At this point: r2 = VA - PA */
-
-	/*
-	 * Find the physical address of the table. After these two
-	 * instructions:
-	 * r1 = va(pagetable)
-	 *
-	 * r0 = va(pagetable) - (VA - PA)
-	 *    = va(pagetable) - VA + PA
-	 *    = pa(pagetable)
-	 */
-	ldr	r1, [r0, #4]
-	sub	r0, r1, r2
+	bl	translate_va_to_pa
 
 #ifndef _ARM_ARCH_6
 	/*
@@ -289,6 +275,41 @@ virt_done:
 	/* NOTREACHED */
 END(_start)
 
+#define VA_TO_PA_POINTER(name, table)	 \
+name:					;\
+	.word	.			;\
+	.word	table
+
+/*
+ * Returns the physical address of a magic va to pa pointer.
+ * r0     - The pagetable data pointer. This must be built using the
+ *          VA_TO_PA_POINTER macro.
+ *          e.g.
+ *            VA_TO_PA_POINTER(Lpagetable, pagetable)
+ *            ...
+ *            adr  r0, Lpagetable
+ *            bl   translate_va_to_pa
+ *            r0 will now contain the physical address of pagetable
+ * r1, r2 - Trashed
+ */
+translate_va_to_pa:
+	ldr	r1, [r0]
+	sub	r2, r1, r0
+	/* At this point: r2 = VA - PA */
+
+	/*
+	 * Find the physical address of the table. After these two
+	 * instructions:
+	 * r1 = va(pagetable)
+	 *
+	 * r0 = va(pagetable) - (VA - PA)
+	 *    = va(pagetable) - VA + PA
+	 *    = pa(pagetable)
+	 */
+	ldr	r1, [r0, #4]
+	sub	r0, r1, r2
+	RET
+
 /*
  * Builds the page table
  * r0 - The table base address
@@ -320,9 +341,7 @@ build_pagetables:
 
 	RET
 
-Lpagetable:
-	.word	.
-	.word	pagetable
+VA_TO_PA_POINTER(Lpagetable, pagetable)
 
 Lvirtaddr:
 	.word	KERNVIRTADDR
@@ -368,8 +387,7 @@ pagetable:
 
 .Lmpvirt_done:
 	.word	mpvirt_done
-Lstartup_pagetable_secondary:
-	.word	temp_pagetable
+VA_TO_PA_POINTER(Lstartup_pagetable_secondary, temp_pagetable)
 
 ASENTRY_NP(mpentry)
 
@@ -396,10 +414,12 @@ ASENTRY_NP(mpentry)
 	bl	armv7_idcache_inv_all	/* Modifies r0-r3, ip */
 #endif
 
-	ldr	r0, Lstartup_pagetable_secondary
-	bic	r0, r0, #0xf0000000
-	orr	r0, r0, #PHYSADDR
+	/* Load the page table physical address */
+	adr	r0, Lstartup_pagetable_secondary
+	bl	translate_va_to_pa
+	/* Load the address the secondary page table */
 	ldr	r0, [r0]
+
 	orr 	r0, r0, #2		/* Set TTB shared memory flag */
 	mcr	p15, 0, r0, c2, c0, 0	/* Set TTB */
 	mcr	p15, 0, r0, c8, c7, 0	/* Flush TLB */


More information about the svn-src-all mailing list