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,