> Date: Wed, 18 May 2011 18:41:02 +0200 > From: Ariane van der Steldt <ari...@stack.nl> > > 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?
ok kettenis@ > 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,