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,