[OpenBIOS] [commit] r877 - trunk/openbios-devel/arch/sparc64

repository service svn at openbios.org
Sun Oct 3 11:37:14 CEST 2010


Author: mcayland
Date: Sun Oct  3 11:37:13 2010
New Revision: 877
URL: http://tracker.coreboot.org/trac/openbios/changeset/877

Log:
Implement pgmap@ for SPARC64 since it is required for OpenSolaris.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at siriusit.co.uk>

Modified:
   trunk/openbios-devel/arch/sparc64/lib.c

Modified: trunk/openbios-devel/arch/sparc64/lib.c
==============================================================================
--- trunk/openbios-devel/arch/sparc64/lib.c	Sun Oct  3 08:54:04 2010	(r876)
+++ trunk/openbios-devel/arch/sparc64/lib.c	Sun Oct  3 11:37:13 2010	(r877)
@@ -135,6 +135,43 @@
     }
 }
 
+/*
+ * D5.3 pgmap@ ( va -- tte )
+ */
+static void
+pgmap_fetch(void)
+{
+	translation_t *t = *g_ofmem_translations;
+	unsigned long va, tte_data;
+
+	va = POP();
+
+	/* Search the ofmem linked list for this virtual address */
+	while (t != NULL) {
+		/* Find the correct range */
+		if (va >= t->virt && va < (t->virt + t->size)) {
+
+			/* valid tte, 8k size */
+			tte_data = 0x8000000000000000UL;
+
+			/* mix in phys address mode */
+			tte_data |= t->mode;
+
+			/* mix in page physical address = t->phys + offset */
+			tte_data |= t->phys + (va - t->virt);
+
+			/* return tte_data */
+			PUSH(tte_data);
+
+			return;
+		}
+		t = t->next;
+	}
+
+	/* If we get here, there was no entry */
+	PUSH(0);
+}
+
 static void
 dtlb_load2(unsigned long vaddr, unsigned long tte_data)
 {
@@ -185,7 +222,6 @@
 dtlb_miss_handler(void)
 {
 	unsigned long faultva, tte_data = 0;
-	translation_t *t = *g_ofmem_translations;
 
 	/* Grab fault address from MMU and round to nearest 8k page */
 	faultva = dtlb_faultva();
@@ -193,30 +229,17 @@
 	faultva <<= 13;
 
 	/* Search the ofmem linked list for this virtual address */
-	while (t != NULL) {
-		/* Find the correct range */
-		if (faultva >= t->virt && faultva < (t->virt + t->size)) {
-
-			/* valid tte, 8k size */
-			tte_data = 0x8000000000000000UL;
-
-			/* mix in phys address mode */
-			tte_data |= t->mode;
-
-			/* mix in page physical address = t->phys + offset */
-			tte_data |= t->phys + (faultva - t->virt);
-
-			/* Update MMU */
-			dtlb_load2(faultva, tte_data);
-
-			return;
-		}
-
-		t = t->next;
+	PUSH(faultva);
+	pgmap_fetch();
+	tte_data = POP();
+
+	if (tte_data) {
+		/* Update MMU */
+		dtlb_load2(faultva, tte_data);
+	} else {
+		/* If we got here, there was no translation so fail */
+		bug();
 	}
-
-	/* If we got here, there was no translation so fail */
-	bug();
 }
 
 static void
@@ -238,6 +261,20 @@
           "r" (tte_data), "r" (tte_index << 3), "i" (ASI_ITLB_DATA_ACCESS));
 }
 
+/*
+  ( index tte_data vaddr -- ? )
+*/
+static void
+itlb_load(void)
+{
+    unsigned long vaddr, tte_data, idx;
+
+    vaddr = POP();
+    tte_data = POP();
+    idx = POP();
+    itlb_load3(vaddr, tte_data, idx);
+}
+
 static unsigned long
 itlb_faultva(void)
 {
@@ -255,7 +292,6 @@
 itlb_miss_handler(void)
 {
 	unsigned long faultva, tte_data = 0;
-	translation_t *t = *g_ofmem_translations;
 
 	/* Grab fault address from MMU and round to nearest 8k page */
 	faultva = itlb_faultva();
@@ -263,45 +299,17 @@
 	faultva <<= 13;
 
 	/* Search the ofmem linked list for this virtual address */
-	while (t != NULL) {
-		/* Find the correct range */
-		if (faultva >= t->virt && faultva < (t->virt + t->size)) {
-
-			/* valid tte, 8k size */
-			tte_data = 0x8000000000000000UL;
-
-			/* mix in phys address mode */
-			tte_data |= t->mode;
-
-			/* mix in page physical address = t->phys + offset */
-			tte_data |= t->phys + (faultva - t->virt);
-
-			/* Update MMU */
-			itlb_load2(faultva, tte_data);
-
-			return;
-		}
-
-		t = t->next;
+	PUSH(faultva);
+	pgmap_fetch();
+	tte_data = POP();
+
+	if (tte_data) {
+		/* Update MMU */
+		itlb_load2(faultva, tte_data);
+	} else {
+		/* If we got here, there was no translation so fail */
+		bug();
 	}
-
-	/* If we got here, there was no translation so fail */
-	bug();
-}
-
-
-/*
-  ( index tte_data vaddr -- ? )
-*/
-static void
-itlb_load(void)
-{
-    unsigned long vaddr, tte_data, idx;
-
-    vaddr = POP();
-    tte_data = POP();
-    idx = POP();
-    itlb_load3(vaddr, tte_data, idx);
 }
 
 static void
@@ -604,4 +612,9 @@
     fword("find-device");
     bind_func("cif-claim", ciface_claim);
     bind_func("cif-release", ciface_release);
+
+    /* Other MMU functions */
+    PUSH(0);
+    fword("active-package!");
+    bind_func("pgmap@", pgmap_fetch);
 }



More information about the OpenBIOS mailing list