> 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,

Reply via email to