> Date: Wed, 18 May 2011 18:41:02 +0200
> From: Ariane van der Steldt <[email protected]>
>
> 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,