This patch moves the common code for traversing through the PGD, PTE
tables in userspace virtual address translation and vmalloc address translation
to a new routine. This will help us to make changes to the common code
at a single place. This will be used for board based definitions for address
translation

Signed-off-by: Suzuki K. Poulose <[email protected]>
---

 ppc.c |  184 +++++++++++++++++++++++------------------------------------------
 1 files changed, 65 insertions(+), 119 deletions(-)

diff --git a/ppc.c b/ppc.c
index 9e704d0..cfa3f5f 100755
--- a/ppc.c
+++ b/ppc.c
@@ -262,6 +262,69 @@ ppc_dump_machdep_table(ulong arg)
        fprintf(fp, "           machspec: %lx\n", (ulong)machdep->machspec);
 }
 
+static int
+ppc_pgd_vtop(ulong *pgd, ulong vaddr, physaddr_t *paddr, int verbose)
+{
+       ulong *page_dir;
+       ulong *page_middle;
+       ulong *page_table;
+       ulong pgd_pte;
+       ulong pte;
+
+       if (verbose) 
+               fprintf(fp, "PAGE DIRECTORY: %lx\n", (ulong)pgd);
+
+       page_dir = pgd + (vaddr >> PGDIR_SHIFT);
+
+        FILL_PGD(PAGEBASE(pgd), KVADDR, PAGESIZE());
+        pgd_pte = ULONG(machdep->pgd + PAGEOFFSET(page_dir));
+
+       if (verbose)
+               fprintf(fp, "  PGD: %lx => %lx\n", (ulong)page_dir, pgd_pte);
+
+       if (!pgd_pte)
+               goto no_page;
+
+       page_middle = (ulong *)pgd_pte;
+
+       if (machdep->flags & CPU_BOOKE)
+               page_table = page_middle + (BTOP(vaddr) & (PTRS_PER_PTE - 1));
+       else {
+               page_table = (ulong *)((pgd_pte & (ulong)machdep->pagemask) + 
machdep->kvbase);
+               page_table += ((ulong)BTOP(vaddr) & (PTRS_PER_PTE-1));
+       }
+
+       if (verbose)
+               fprintf(fp, "  PMD: %lx => %lx\n", (ulong)page_middle, 
+                       (ulong)page_table);
+
+        FILL_PTBL(PAGEBASE(page_table), KVADDR, PAGESIZE());
+        pte = ULONG(machdep->ptbl + PAGEOFFSET(page_table));
+
+       if (verbose) 
+               fprintf(fp, "  PTE: %lx => %lx\n", (ulong)page_table, pte);
+
+       if (!(pte & _PAGE_PRESENT)) { 
+               if (pte && verbose) {
+                       fprintf(fp, "\n");
+                       ppc_translate_pte(pte, 0, 0);
+               }
+               goto no_page;
+       }
+
+       if (verbose) {
+               fprintf(fp, " PAGE: %lx\n\n", PAGEBASE(pte));
+               ppc_translate_pte(pte, 0, 0);
+       }
+
+       *paddr = PAGEBASE(pte) + PAGEOFFSET(vaddr);
+
+       return TRUE;
+
+no_page:
+       return FALSE;
+
+}
 
 /*
  *  Translates a user virtual address to its physical address.  cmd_vtop()
@@ -278,11 +341,6 @@ ppc_uvtop(struct task_context *tc, ulong vaddr, physaddr_t 
*paddr, int verbose)
 {
        ulong mm, active_mm;
        ulong *pgd;
-       ulong *page_dir;
-       ulong *page_middle;
-       ulong *page_table;
-       ulong pgd_pte;
-       ulong pte;
 
        if (!tc)
                error(FATAL, "current context invalid\n");
@@ -318,62 +376,7 @@ ppc_uvtop(struct task_context *tc, ulong vaddr, physaddr_t 
*paddr, int verbose)
                                FAULT_ON_ERROR);
        }
 
-       if (verbose) 
-               fprintf(fp, "PAGE DIRECTORY: %lx\n", (ulong)pgd);
-
-       page_dir = pgd + (vaddr >> PGDIR_SHIFT);
-
-       FILL_PGD(PAGEBASE(pgd), KVADDR, PAGESIZE());
-       pgd_pte = ULONG(machdep->pgd + PAGEOFFSET(page_dir));
-
-       if (verbose)
-               fprintf(fp, "  PGD: %lx => %lx\n", (ulong)page_dir, pgd_pte);
-
-       if (!pgd_pte)
-               goto no_upage;
-
-       page_middle = (ulong *)pgd_pte;
-
-       if (machdep->flags & CPU_BOOKE)
-               page_table = page_middle + (BTOP(vaddr) & (PTRS_PER_PTE - 1));
-       else {
-               page_table = (ulong *)((pgd_pte & (ulong)machdep->pagemask) + 
machdep->kvbase);
-               page_table += ((ulong)BTOP(vaddr) & (PTRS_PER_PTE-1));
-       }
-
-       if (verbose)
-               fprintf(fp, "  PMD: %lx => %lx\n",(ulong)page_middle, 
-                       (ulong)page_table);
-       
-        FILL_PTBL(PAGEBASE(page_table), KVADDR, PAGESIZE());
-       pte = ULONG(machdep->ptbl + PAGEOFFSET(page_table));
-
-        if (verbose) 
-                fprintf(fp, "  PTE: %lx => %lx\n", (ulong)page_table, pte);
-
-       if (!(pte & _PAGE_PRESENT)) {
-               *paddr = pte;
-               if (pte && verbose) {
-                       fprintf(fp, "\n");
-                       ppc_translate_pte(pte, 0, 0);
-               }
-               goto no_upage;
-       }
-
-       if (!pte)
-               goto no_upage;
-
-       *paddr = PAGEBASE(pte) + PAGEOFFSET(vaddr);
-
-        if (verbose) {
-                fprintf(fp, " PAGE: %lx\n\n", PAGEBASE(pte));
-               ppc_translate_pte(pte, 0, 0);
-       }
-
-       return TRUE;
-
-no_upage:
-       return FALSE;
+       return ppc_pgd_vtop(pgd, vaddr, paddr, verbose);
 }
 
 /*
@@ -385,11 +388,6 @@ static int
 ppc_kvtop(struct task_context *tc, ulong kvaddr, physaddr_t *paddr, int 
verbose)
 {
        ulong *pgd;
-       ulong *page_dir;
-       ulong *page_middle;
-       ulong *page_table;
-        ulong pgd_pte;
-        ulong pte;
 
        if (!IS_KVADDR(kvaddr))
                return FALSE;
@@ -406,59 +404,7 @@ ppc_kvtop(struct task_context *tc, ulong kvaddr, 
physaddr_t *paddr, int verbose)
        }
 
        pgd = (ulong *)vt->kernel_pgd[0];
-
-       if (verbose) 
-               fprintf(fp, "PAGE DIRECTORY: %lx\n", (ulong)pgd);
-
-       page_dir = pgd + (kvaddr >> PGDIR_SHIFT);
-
-        FILL_PGD(PAGEBASE(pgd), KVADDR, PAGESIZE());
-        pgd_pte = ULONG(machdep->pgd + PAGEOFFSET(page_dir));
-
-       if (verbose)
-               fprintf(fp, "  PGD: %lx => %lx\n", (ulong)page_dir, pgd_pte);
-
-       if (!pgd_pte)
-               goto no_kpage;
-
-       page_middle = (ulong *)pgd_pte;
-
-       if (machdep->flags & CPU_BOOKE)
-               page_table = page_middle + (BTOP(kvaddr) & (PTRS_PER_PTE - 1));
-       else {
-               page_table = (ulong *)((pgd_pte & (ulong)machdep->pagemask) + 
machdep->kvbase);
-               page_table += ((ulong)BTOP(kvaddr) & (PTRS_PER_PTE-1));
-       }
-
-       if (verbose)
-               fprintf(fp, "  PMD: %lx => %lx\n", (ulong)page_middle, 
-                       (ulong)page_table);
-
-        FILL_PTBL(PAGEBASE(page_table), KVADDR, PAGESIZE());
-        pte = ULONG(machdep->ptbl + PAGEOFFSET(page_table));
-
-       if (verbose) 
-               fprintf(fp, "  PTE: %lx => %lx\n", (ulong)page_table, pte);
-
-       if (!(pte & _PAGE_PRESENT)) { 
-               if (pte && verbose) {
-                       fprintf(fp, "\n");
-                       ppc_translate_pte(pte, 0, 0);
-               }
-               goto no_kpage;
-       }
-
-       if (verbose) {
-               fprintf(fp, " PAGE: %lx\n\n", PAGEBASE(pte));
-               ppc_translate_pte(pte, 0, 0);
-       }
-
-       *paddr = PAGEBASE(pte) + PAGEOFFSET(kvaddr);
-
-       return TRUE;
-
-no_kpage:
-       return FALSE;
+       return ppc_pgd_vtop(pgd, kvaddr, paddr, verbose);
 }
 
 /*

--
Crash-utility mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/crash-utility

Reply via email to