Hi,

When the sparc64 iommu fails to lookup a vaddr, it prints a message and
returns EFBIG. This cannot be recovered from and is usually indicative
of damaged pmap. Therefor, panic right here instead.

Tested on sparc64, where this diff means the difference between dropping
into single-user mode versus getting a pretty, traceable panic.

Ok?
-- 
Ariane


Index: iommu.c
===================================================================
RCS file: /cvs/src/sys/arch/sparc64/dev/iommu.c,v
retrieving revision 1.63
diff -u -d -p -r1.63 iommu.c
--- iommu.c     7 Apr 2011 15:30:16 -0000       1.63
+++ iommu.c     18 May 2011 16:35:27 -0000
@@ -713,11 +713,8 @@ iommu_dvmamap_load(bus_dma_tag_t t, bus_
                for (a = trunc_page(addr); a < aend; a += PAGE_SIZE) {
                        paddr_t pa;
 
-                       if (pmap_extract(pmap, a, &pa) == FALSE) {
-                               printf("iomap pmap error addr 0x%llx\n", a);
-                               iommu_iomap_clear_pages(ims);
-                               return (EFBIG);
-                       }
+                       if (pmap_extract(pmap, a, &pa) == FALSE)
+                               panic("iomap pmap error addr 0x%llx\n", a);
 
                        err = iommu_iomap_insert_page(ims, pa);
                        if (err) {
@@ -791,11 +788,8 @@ iommu_dvmamap_load(bus_dma_tag_t t, bus_
                        int pglen;
 
                        /* Yuck... Redoing the same pmap_extract... */
-                       if (pmap_extract(pmap, a, &pa) == FALSE) {
-                               printf("iomap pmap error addr 0x%llx\n", a);
-                               err =  EFBIG;
-                               break;
-                       }
+                       if (pmap_extract(pmap, a, &pa) == FALSE)
+                               panic("iomap pmap error addr 0x%llx\n", a);
 
                        pgstart = pa | (MAX(a, addr) & PAGE_MASK);
                        pgend = pa | (MIN(a + PAGE_SIZE - 1,
Index: viommu.c
===================================================================
RCS file: /cvs/src/sys/arch/sparc64/dev/viommu.c,v
retrieving revision 1.11
diff -u -d -p -r1.11 viommu.c
--- viommu.c    7 Apr 2011 15:30:16 -0000       1.11
+++ viommu.c    18 May 2011 16:35:27 -0000
@@ -327,11 +327,8 @@ viommu_dvmamap_load(bus_dma_tag_t t, bus
                for (a = trunc_page(addr); a < aend; a += PAGE_SIZE) {
                        paddr_t pa;
 
-                       if (pmap_extract(pmap, a, &pa) == FALSE) {
-                               printf("iomap pmap error addr 0x%llx\n", a);
-                               iommu_iomap_clear_pages(ims);
-                               return (EFBIG);
-                       }
+                       if (pmap_extract(pmap, a, &pa) == FALSE)
+                               panic("iomap pmap error addr 0x%llx\n", a);
 
                        err = iommu_iomap_insert_page(ims, pa);
                        if (err) {
@@ -400,11 +397,8 @@ viommu_dvmamap_load(bus_dma_tag_t t, bus
                        int pglen;
 
                        /* Yuck... Redoing the same pmap_extract... */
-                       if (pmap_extract(pmap, a, &pa) == FALSE) {
-                               printf("iomap pmap error addr 0x%llx\n", a);
-                               err = EFBIG;
-                               break;
-                       }
+                       if (pmap_extract(pmap, a, &pa) == FALSE)
+                               panic("iomap pmap error addr 0x%llx\n", a);
 
                        pgstart = pa | (MAX(a, addr) & PAGE_MASK);
                        pgend = pa | (MIN(a + PAGE_SIZE - 1,

Reply via email to