Hi,

Currently gdb over BDI (and I've seen other reports on this list) fails to
translate virtual->physical addresses on PPC 8xx:

*** MMU: address translation for 0xC000C66C failed
*** MMU: address translation for 0xC000C66C failed

Thats because the v2.6 kernel was changed to use physical addresses on the
first level page.

Dan informed me there might be a firmware update available to address 
this problem. Is this true?

With the following the kernel stores the virtual address on the PMD 
getting the BDI "to work".

A newer firmware would be much better though.

--- linux-2.6.14-rc4.orig/arch/ppc/kernel/head_8xx.S    2005-10-18 
16:59:34.000000000 -0500
+++ linux-2.6.14-rc4/arch/ppc/kernel/head_8xx.S 2005-11-01 05:45:00.000000000 
-0600
@@ -320,11 +320,12 @@ InstructionTLBMiss:
        lwz     r11, 0(r10)     /* Get the level 1 entry */
        rlwinm. r10, r11,0,0,19 /* Extract page descriptor page address */
        beq     2f              /* If zero, don't try to find a pte */
+       tophys(r11,r11)
 
        /* We have a pte table, so load the MI_TWC with the attributes
         * for this "segment."
         */
-       ori     r11,r11,1               /* Set valid bit */
+       /*ori   r11,r11,1                Set valid bit */
        DO_8xx_CPU6(0x2b80, r3)
        mtspr   SPRN_MI_TWC, r11        /* Set segment attributes */
        DO_8xx_CPU6(0x3b80, r3)
@@ -379,6 +380,7 @@ DataStoreTLBMiss:
        lwz     r11, 0(r10)     /* Get the level 1 entry */
        rlwinm. r10, r11,0,0,19 /* Extract page descriptor page address */
        beq     2f              /* If zero, don't try to find a pte */
+       tophys(r11,r11)
 
        /* We have a pte table, so load fetch the pte from the table.
         */
@@ -493,6 +495,7 @@ DataTLBError:
        lwz     r11, 0(r10)     /* Get the level 1 entry */
        rlwinm. r10, r11,0,0,19 /* Extract page descriptor page address */
        beq     2f              /* If zero, bail */
+       tophys(r11,r11)
 
        /* We have a pte table, so fetch the pte from the table.
         */
diff -Nur -p --exclude-from=linux-2.6.14-rc4/Documentation/dontdiff 
linux-2.6.14-rc4.orig/include/asm-ppc/pgalloc.h 
linux-2.6.14-rc4/include/asm-ppc/pgalloc.h
--- linux-2.6.14-rc4.orig/include/asm-ppc/pgalloc.h     2005-10-18 
17:00:09.000000000 -0500
+++ linux-2.6.14-rc4/include/asm-ppc/pgalloc.h  2005-11-01 08:02:08.000000000 
-0600
@@ -19,16 +19,16 @@ extern void pgd_free(pgd_t *pgd);
 #define __pmd_free_tlb(tlb,x)          do { } while (0)
 #define pgd_populate(mm, pmd, pte)      BUG()
 
-#ifndef CONFIG_BOOKE
+#if defined(CONFIG_BOOKE) || defined(CONFIG_8xx)
 #define pmd_populate_kernel(mm, pmd, pte)      \
-               (pmd_val(*(pmd)) = __pa(pte) | _PMD_PRESENT)
+               (pmd_val(*(pmd)) = (unsigned long)pte | _PMD_PRESENT)
 #define pmd_populate(mm, pmd, pte)     \
-               (pmd_val(*(pmd)) = (page_to_pfn(pte) << PAGE_SHIFT) | 
_PMD_PRESENT)
+               (pmd_val(*(pmd)) = (unsigned long)page_to_virt(pte) | 
_PMD_PRESENT)
 #else
 #define pmd_populate_kernel(mm, pmd, pte)      \
-               (pmd_val(*(pmd)) = (unsigned long)pte | _PMD_PRESENT)
+               (pmd_val(*(pmd)) = __pa(pte) | _PMD_PRESENT)
 #define pmd_populate(mm, pmd, pte)     \
-               (pmd_val(*(pmd)) = (unsigned long)page_to_virt(pte) | 
_PMD_PRESENT)
+               (pmd_val(*(pmd)) = (page_to_pfn(pte) << PAGE_SHIFT) | 
_PMD_PRESENT)
 #endif
 
 extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr);
diff -Nur -p --exclude-from=linux-2.6.14-rc4/Documentation/dontdiff 
linux-2.6.14-rc4.orig/include/asm-ppc/pgtable.h 
linux-2.6.14-rc4/include/asm-ppc/pgtable.h
--- linux-2.6.14-rc4.orig/include/asm-ppc/pgtable.h     2005-10-18 
17:00:09.000000000 -0500
+++ linux-2.6.14-rc4/include/asm-ppc/pgtable.h  2005-11-01 08:01:34.000000000 
-0600
@@ -719,16 +719,16 @@ extern pgprot_t phys_mem_access_prot(str
  * handler).  On everything else the pmd contains the physical address
  * of the pte page.  -- paulus
  */
-#ifndef CONFIG_BOOKE
+#if defined (CONFIG_BOOKE) || defined CONFIG_8xx
 #define pmd_page_kernel(pmd)   \
-       ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK))
+       ((unsigned long) (pmd_val(pmd) & PAGE_MASK))
 #define pmd_page(pmd)          \
-       (mem_map + (pmd_val(pmd) >> PAGE_SHIFT))
+       (mem_map + (__pa(pmd_val(pmd)) >> PAGE_SHIFT))
 #else
 #define pmd_page_kernel(pmd)   \
-       ((unsigned long) (pmd_val(pmd) & PAGE_MASK))
+       ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK))
 #define pmd_page(pmd)          \
-       (mem_map + (__pa(pmd_val(pmd)) >> PAGE_SHIFT))
+       (mem_map + (pmd_val(pmd) >> PAGE_SHIFT))
 #endif
 
 /* to find an entry in a kernel page-table-directory */









Reply via email to