[Crash-utility] [PATCH v3 2/6] x86_64: Extract public page table mapping code

Dou Liyang douly.fnst at cn.fujitsu.com
Mon Jan 29 10:51:39 UTC 2018


Currently, page table mapping code is scattered everywhere. Extract public
page table mapping code and prepare for 5-level page. this patch is no
functionality change.

Signed-off-by: Dou Liyang <douly.fnst at cn.fujitsu.com>
---
 x86_64.c | 410 ++++++++++++++++++++++++++++++---------------------------------
 1 file changed, 193 insertions(+), 217 deletions(-)

diff --git a/x86_64.c b/x86_64.c
index 467b5d7..e3a8db7 100644
--- a/x86_64.c
+++ b/x86_64.c
@@ -79,6 +79,11 @@ static void x86_64_calc_phys_base(void);
 static int x86_64_is_module_addr(ulong);
 static int x86_64_is_kvaddr(ulong);
 static int x86_64_is_uvaddr(ulong, struct task_context *);
+static ulong *x86_64_kpgd_offset(ulong, int, int);
+static ulong x86_64_upgd_offset(struct task_context *, ulong, int, int);
+static ulong x86_64_pud_offset(ulong, ulong, int, int);
+static ulong x86_64_pmd_offset(ulong, ulong, int, int);
+static ulong x86_64_pte_offset(ulong, ulong, int, int);
 void x86_64_compiler_warning_stub(void);
 static void x86_64_init_kernel_pgd(void);
 static void x86_64_cpu_pda_init(void);
@@ -1575,6 +1580,153 @@ x86_64_is_uvaddr(ulong addr, struct task_context *tc)
         return (addr < USERSPACE_TOP);
 }
 
+/*
+ * Find the kernel pgd entry..
+ * pgd = pgd_offset_k(addr);
+ */
+static ulong *
+x86_64_kpgd_offset(ulong kvaddr, int verbose, int IS_XEN)
+{
+	ulong *pgd;
+
+	FILL_PML4();
+	pgd = ((ulong *)machdep->machspec->pml4) + pml4_index(kvaddr);
+	if (verbose) {
+		fprintf(fp, "PGD DIRECTORY: %lx\n", vt->kernel_pgd[0]);
+		if(IS_XEN)
+			fprintf(fp, "PAGE DIRECTORY: %lx [machine]\n", *pgd);
+		else
+			fprintf(fp, "PAGE DIRECTORY: %lx\n", *pgd);
+	}
+
+	return pgd;
+}
+
+/*
+ * Find the user pgd entry..
+ * pgd = pgd_offset(mm, address);
+ */
+static ulong
+x86_64_upgd_offset(struct task_context *tc, ulong uvaddr, int verbose, int IS_XEN)
+{
+	ulong *pgd;
+	ulong pgd_paddr;
+	ulong pgd_pte;
+
+        if (task_mm(tc->task, TRUE))
+                pgd = ULONG_PTR(tt->mm_struct + OFFSET(mm_struct_pgd));
+        else
+                readmem(tc->mm_struct + OFFSET(mm_struct_pgd), KVADDR, &pgd,
+                        sizeof(long), "mm_struct pgd", FAULT_ON_ERROR);
+
+        pgd_paddr = x86_64_VTOP((ulong)pgd);
+        FILL_UPML(pgd_paddr, PHYSADDR, PAGESIZE());
+	pgd = ((ulong *)pgd_paddr) + pml4_index(uvaddr);
+	pgd_pte = ULONG(machdep->machspec->pml4 + PAGEOFFSET(pgd));
+        if (verbose) {
+		if(IS_XEN)
+			fprintf(fp, "   PGD: %lx => %lx [machine]\n", (ulong)pgd, pgd_pte);
+		else
+			fprintf(fp, "   PGD: %lx => %lx\n", (ulong)pgd, pgd_pte);
+        }
+
+	return pgd_pte;
+}
+
+/*
+ * Find an entry in the third-level page table..
+ * pud = pud_offset(pgd, address);
+ */
+static ulong
+x86_64_pud_offset(ulong pgd_pte, ulong vaddr, int verbose, int IS_XEN)
+{
+	ulong *pud;
+	ulong pud_paddr;
+	ulong pud_pte;
+
+	pud_paddr = pgd_pte & PHYSICAL_PAGE_MASK;
+
+	if(IS_XEN) {
+		pud_paddr = xen_m2p(pud_paddr);
+		if (verbose)
+			fprintf(fp, "	PGD: %lx\n", pud_paddr);
+	}
+
+	FILL_PUD(pud_paddr, PHYSADDR, PAGESIZE());
+	pud = ((ulong *)pud_paddr) + pgd_index(vaddr);
+	pud_pte = ULONG(machdep->pud + PAGEOFFSET(pud));
+	if (verbose) {
+		if(IS_XEN)
+			fprintf(fp, "   PUD: %lx => %lx [machine]\n", (ulong)pud, pud_pte);
+		else
+			fprintf(fp, "   PUD: %lx => %lx\n", (ulong)pud, pud_pte);
+        }
+
+	return pud_pte;
+}
+
+/*
+ * Find an entry in the middle page table..
+ * pmd = pmd_offset(pud, address);
+ */
+static ulong
+x86_64_pmd_offset(ulong pud_pte, ulong vaddr, int verbose, int IS_XEN)
+{
+	ulong *pmd;
+	ulong pmd_paddr;
+	ulong pmd_pte;
+
+	pmd_paddr = pud_pte & PHYSICAL_PAGE_MASK;
+
+	if(IS_XEN) {
+		pmd_paddr = xen_m2p(pmd_paddr);
+		if (verbose)
+			fprintf(fp, "	PUD: %lx\n", pmd_paddr);
+	}
+
+	FILL_PMD(pmd_paddr, PHYSADDR, PAGESIZE());
+	pmd = ((ulong *)pmd_paddr) + pmd_index(vaddr);
+	pmd_pte = ULONG(machdep->pmd + PAGEOFFSET(pmd));
+        if (verbose) {
+		if(IS_XEN)
+			fprintf(fp, "   PMD: %lx => %lx [machine]\n", (ulong)pmd, pmd_pte);
+		else
+			fprintf(fp, "   PMD: %lx => %lx\n", (ulong)pmd, pmd_pte);
+        }
+	return pmd_pte;
+}
+
+/*
+ * Find an entry in the pet page table..
+ * pmd = pmd_offset(pud, address);
+ */
+static ulong
+x86_64_pte_offset(ulong pmd_pte, ulong vaddr, int verbose, int IS_XEN)
+{
+	ulong *ptep;
+	ulong pte_paddr;
+	ulong pte;
+
+	pte_paddr = pmd_pte & PHYSICAL_PAGE_MASK;
+
+	if(IS_XEN) {
+		pte_paddr = xen_m2p(pte_paddr);
+		if (verbose)
+			fprintf(fp, "   PMD: %lx\n", pte_paddr);
+	}
+
+	FILL_PTBL(pte_paddr, PHYSADDR, PAGESIZE());
+	ptep = ((ulong *)pte_paddr) + pte_index(vaddr);
+	pte = ULONG(machdep->ptbl + PAGEOFFSET(ptep));
+	if (verbose) {
+		if(IS_XEN)
+			fprintf(fp, "   PTE: %lx => %lx [machine]\n", (ulong)ptep, pte);
+		else
+			fprintf(fp, "   PTE: %lx => %lx\n", (ulong)ptep, pte);
+	}
+
+	return pte;
+}
 
 /*
  *  Translates a user virtual address to its physical address.  cmd_vtop()
@@ -1588,18 +1740,9 @@ x86_64_is_uvaddr(ulong addr, struct task_context *tc)
 static int
 x86_64_uvtop_level4(struct task_context *tc, ulong uvaddr, physaddr_t *paddr, int verbose)
 {
-	ulong mm;
-	ulong *pml;
-	ulong pml_paddr;
-	ulong pml_pte;
-	ulong *pgd;
-	ulong pgd_paddr;
 	ulong pgd_pte;
-	ulong *pmd;
-	ulong pmd_paddr;
+	ulong pud_pte;
 	ulong pmd_pte;
-	ulong *ptep;
-	ulong pte_paddr;
 	ulong pte;
 	physaddr_t physpage;
 
@@ -1614,43 +1757,25 @@ x86_64_uvtop_level4(struct task_context *tc, ulong uvaddr, physaddr_t *paddr, in
 	if ((machdep->flags & VM_5LEVEL) && x86_64_task_uses_5level(tc))
 		return x86_64_uvtop_5level(tc, uvaddr, paddr, verbose);
 
-	if ((mm = task_mm(tc->task, TRUE)))
-		pml = ULONG_PTR(tt->mm_struct + OFFSET(mm_struct_pgd));
-	else
-		readmem(tc->mm_struct + OFFSET(mm_struct_pgd), KVADDR, &pml,
-			sizeof(long), "mm_struct pgd", FAULT_ON_ERROR);
-
-	pml_paddr = x86_64_VTOP((ulong)pml);
-	FILL_UPML(pml_paddr, PHYSADDR, PAGESIZE());
-	pml = ((ulong *)pml_paddr) + pml4_index(uvaddr); 
-	pml_pte = ULONG(machdep->machspec->upml + PAGEOFFSET(pml));
-	if (verbose) 
-		fprintf(fp, "   PML: %lx => %lx\n", (ulong)pml, pml_pte);
-	if (!(pml_pte & _PAGE_PRESENT))
+        pgd_pte = x86_64_upgd_offset(tc, uvaddr, verbose, FALSE);
+	if (!(pgd_pte & _PAGE_PRESENT))
 		goto no_upage;
 
-	pgd_paddr = pml_pte & PHYSICAL_PAGE_MASK;
-	FILL_PGD(pgd_paddr, PHYSADDR, PAGESIZE());
-	pgd = ((ulong *)pgd_paddr) + pgd_index(uvaddr); 
-	pgd_pte = ULONG(machdep->pgd + PAGEOFFSET(pgd));
-	if (verbose) 
-                fprintf(fp, "   PUD: %lx => %lx\n", (ulong)pgd, pgd_pte);
-	if (!(pgd_pte & _PAGE_PRESENT))
+	/*
+         *  pud = pud_offset(pgd, address);
+	 */
+	pud_pte = x86_64_pud_offset(pgd_pte, uvaddr, verbose, FALSE);
+	if (!(pud_pte & _PAGE_PRESENT))
 		goto no_upage;
 
 	/*
-         *  pmd = pmd_offset(pgd, address);
+         *  pmd = pmd_offset(pud, address);
 	 */
-	pmd_paddr = pgd_pte & PHYSICAL_PAGE_MASK;
-	FILL_PMD(pmd_paddr, PHYSADDR, PAGESIZE());
-	pmd = ((ulong *)pmd_paddr) + pmd_index(uvaddr);
-	pmd_pte = ULONG(machdep->pmd + PAGEOFFSET(pmd));
-        if (verbose) 
-                fprintf(fp, "   PMD: %lx => %lx\n", (ulong)pmd, pmd_pte);
+	pmd_pte = x86_64_pmd_offset(pud_pte, uvaddr, verbose, FALSE);
 	if (!(pmd_pte & (_PAGE_PRESENT | _PAGE_PROTNONE)))
 		goto no_upage;
         if (pmd_pte & _PAGE_PSE) {
-                if (verbose) {
+		if (verbose) {
                         fprintf(fp, "  PAGE: %lx  (2MB)\n\n", 
 				PAGEBASE(pmd_pte) & PHYSICAL_PAGE_MASK);
                         x86_64_translate_pte(pmd_pte, 0, 0);
@@ -1666,13 +1791,7 @@ x86_64_uvtop_level4(struct task_context *tc, ulong uvaddr, physaddr_t *paddr, in
 	 *  ptep = pte_offset_map(pmd, address);
 	 *  pte = *ptep;
 	 */
-	pte_paddr = pmd_pte & PHYSICAL_PAGE_MASK;
-	FILL_PTBL(pte_paddr, PHYSADDR, PAGESIZE());
-	ptep = ((ulong *)pte_paddr) + pte_index(uvaddr);
-	pte = ULONG(machdep->ptbl + PAGEOFFSET(ptep));
-	if (verbose)
-		fprintf(fp, "   PTE: %lx => %lx\n", (ulong)ptep, pte);
-
+	pte = x86_64_pte_offset(pmd_pte, uvaddr, verbose, FALSE);
 	if (!(pte & (_PAGE_PRESENT | _PAGE_PROTNONE))) {
 		*paddr = pte;
 
@@ -1714,19 +1833,10 @@ x86_64_uvtop_5level(struct task_context *tc, ulong uvaddr, physaddr_t *paddr, in
 static int
 x86_64_uvtop_level4_xen_wpt(struct task_context *tc, ulong uvaddr, physaddr_t *paddr, int verbose)
 {
-	ulong mm;
-	ulong *pml;
-	ulong pml_paddr;
-	ulong pml_pte;
-	ulong *pgd;
-	ulong pgd_paddr;
 	ulong pgd_pte;
-	ulong *pmd;
-	ulong pmd_paddr;
+	ulong pud_pte;
 	ulong pmd_pte;
 	ulong pseudo_pmd_pte;
-	ulong *ptep;
-	ulong pte_paddr;
 	ulong pte;
 	ulong pseudo_pte;
 	physaddr_t physpage;
@@ -1740,45 +1850,18 @@ x86_64_uvtop_level4_xen_wpt(struct task_context *tc, ulong uvaddr, physaddr_t *p
 	if (IS_KVADDR(uvaddr))
 		return x86_64_kvtop(tc, uvaddr, paddr, verbose);
 
-	if ((mm = task_mm(tc->task, TRUE)))
-		pml = ULONG_PTR(tt->mm_struct + OFFSET(mm_struct_pgd));
-	else
-		readmem(tc->mm_struct + OFFSET(mm_struct_pgd), KVADDR, &pml,
-			sizeof(long), "mm_struct pgd", FAULT_ON_ERROR);
-
-	pml_paddr = x86_64_VTOP((ulong)pml);
-	FILL_UPML(pml_paddr, PHYSADDR, PAGESIZE());
-	pml = ((ulong *)pml_paddr) + pml4_index(uvaddr); 
-	pml_pte = ULONG(machdep->machspec->upml + PAGEOFFSET(pml));
-	if (verbose) 
-		fprintf(fp, "   PML: %lx => %lx [machine]\n", (ulong)pml, pml_pte);
-	if (!(pml_pte & _PAGE_PRESENT))
+	pgd_pte = x86_64_upgd_offset(tc, uvaddr, verbose, TRUE);
+	if (!(pgd_pte & _PAGE_PRESENT))
 		goto no_upage;
 
-	pgd_paddr = pml_pte & PHYSICAL_PAGE_MASK;
-	pgd_paddr = xen_m2p(pgd_paddr);
-	if (verbose)
-		fprintf(fp, "   PML: %lx\n", pgd_paddr);
-	FILL_PGD(pgd_paddr, PHYSADDR, PAGESIZE());
-	pgd = ((ulong *)pgd_paddr) + pgd_index(uvaddr); 
-	pgd_pte = ULONG(machdep->pgd + PAGEOFFSET(pgd));
-	if (verbose) 
-                fprintf(fp, "   PUD: %lx => %lx [machine]\n", (ulong)pgd, pgd_pte);
-	if (!(pgd_pte & _PAGE_PRESENT))
+	pud_pte = x86_64_pud_offset(pgd_pte, uvaddr, verbose, TRUE);
+	if (!(pud_pte & _PAGE_PRESENT))
 		goto no_upage;
 
 	/*
-         *  pmd = pmd_offset(pgd, address);
+         *  pmd = pmd_offset(pud, address);
 	 */
-	pmd_paddr = pgd_pte & PHYSICAL_PAGE_MASK;
-	pmd_paddr = xen_m2p(pmd_paddr);
-	if (verbose)
-                fprintf(fp, "   PUD: %lx\n", pmd_paddr);
-	FILL_PMD(pmd_paddr, PHYSADDR, PAGESIZE());
-	pmd = ((ulong *)pmd_paddr) + pmd_index(uvaddr);
-	pmd_pte = ULONG(machdep->pmd + PAGEOFFSET(pmd));
-        if (verbose) 
-                fprintf(fp, "   PMD: %lx => %lx [machine]\n", (ulong)pmd, pmd_pte);
+	pmd_pte = x86_64_pmd_offset(pud_pte, uvaddr, verbose, TRUE);
 	if (!(pmd_pte & _PAGE_PRESENT))
 		goto no_upage;
         if (pmd_pte & _PAGE_PSE) {
@@ -1817,15 +1900,7 @@ x86_64_uvtop_level4_xen_wpt(struct task_context *tc, ulong uvaddr, physaddr_t *p
 	 *  ptep = pte_offset_map(pmd, address);
 	 *  pte = *ptep;
 	 */
-	pte_paddr = pmd_pte & PHYSICAL_PAGE_MASK;
-	pte_paddr = xen_m2p(pte_paddr);
-	if (verbose)
-		fprintf(fp, "   PMD: %lx\n", pte_paddr);
-	FILL_PTBL(pte_paddr, PHYSADDR, PAGESIZE());
-	ptep = ((ulong *)pte_paddr) + pte_index(uvaddr);
-	pte = ULONG(machdep->ptbl + PAGEOFFSET(ptep));
-	if (verbose)
-		fprintf(fp, "   PTE: %lx => %lx [machine]\n", (ulong)ptep, pte);
+	pte = x86_64_pte_offset(pmd_pte, uvaddr, verbose, TRUE);
 	if (!(pte & (_PAGE_PRESENT))) {
 		*paddr = pte;
 
@@ -1835,7 +1910,7 @@ x86_64_uvtop_level4_xen_wpt(struct task_context *tc, ulong uvaddr, physaddr_t *p
 		}
 		goto no_upage;
 	}
-	
+
 	pseudo_pte = xen_m2p(pte & PHYSICAL_PAGE_MASK);
 	if (verbose)
 		fprintf(fp, "   PTE: %lx\n", pseudo_pte + PAGEOFFSET(pte));
@@ -1864,12 +1939,8 @@ x86_64_uvtop_level4_rhel4_xen_wpt(struct task_context *tc, ulong uvaddr, physadd
 	ulong *pgd;
 	ulong pgd_paddr;
 	ulong pgd_pte;
-	ulong *pmd;
-	ulong pmd_paddr;
 	ulong pmd_pte;
 	ulong pseudo_pmd_pte;
-	ulong *ptep;
-	ulong pte_paddr;
 	ulong pte;
 	ulong pseudo_pte;
 	physaddr_t physpage;
@@ -1901,15 +1972,7 @@ x86_64_uvtop_level4_rhel4_xen_wpt(struct task_context *tc, ulong uvaddr, physadd
 	/*
          *  pmd = pmd_offset(pgd, address);
 	 */
-	pmd_paddr = pgd_pte & PHYSICAL_PAGE_MASK;
-	pmd_paddr = xen_m2p(pmd_paddr);
-	if (verbose)
-                fprintf(fp, "   PGD: %lx\n", pmd_paddr);
-	FILL_PMD(pmd_paddr, PHYSADDR, PAGESIZE());
-	pmd = ((ulong *)pmd_paddr) + pmd_index(uvaddr);
-	pmd_pte = ULONG(machdep->pmd + PAGEOFFSET(pmd));
-        if (verbose) 
-                fprintf(fp, "   PMD: %lx => %lx [machine]\n", (ulong)pmd, pmd_pte);
+	pmd_pte = x86_64_pmd_offset(pgd_pte, uvaddr, verbose, TRUE);
 	if (!(pmd_pte & _PAGE_PRESENT))
 		goto no_upage;
         if (pmd_pte & _PAGE_PSE) {
@@ -1948,15 +2011,7 @@ x86_64_uvtop_level4_rhel4_xen_wpt(struct task_context *tc, ulong uvaddr, physadd
 	 *  ptep = pte_offset_map(pmd, address);
 	 *  pte = *ptep;
 	 */
-	pte_paddr = pmd_pte & PHYSICAL_PAGE_MASK;
-	pte_paddr = xen_m2p(pte_paddr);
-	if (verbose)
-		fprintf(fp, "   PMD: %lx\n", pte_paddr);
-	FILL_PTBL(pte_paddr, PHYSADDR, PAGESIZE());
-	ptep = ((ulong *)pte_paddr) + pte_index(uvaddr);
-	pte = ULONG(machdep->ptbl + PAGEOFFSET(ptep));
-	if (verbose)
-		fprintf(fp, "   PTE: %lx => %lx [machine]\n", (ulong)ptep, pte);
+	pte = x86_64_pte_offset(pmd_pte, uvaddr, verbose, TRUE);
 	if (!(pte & (_PAGE_PRESENT))) {
 		*paddr = pte;
 
@@ -1995,11 +2050,7 @@ x86_64_uvtop(struct task_context *tc, ulong uvaddr, physaddr_t *paddr, int verbo
         ulong *pgd;
 	ulong pgd_paddr;
 	ulong pgd_pte;
-	ulong *pmd;
-	ulong pmd_paddr;
 	ulong pmd_pte;
-        ulong *ptep;
-        ulong pte_paddr;
         ulong pte;
         physaddr_t physpage;
 
@@ -2032,12 +2083,7 @@ x86_64_uvtop(struct task_context *tc, ulong uvaddr, physaddr_t *paddr, int verbo
 	/*
          *  pmd = pmd_offset(pgd, address);
 	 */
-	pmd_paddr = pgd_pte & PHYSICAL_PAGE_MASK;
-	FILL_PMD(pmd_paddr, PHYSADDR, PAGESIZE());
-	pmd = ((ulong *)pmd_paddr) + pmd_index(uvaddr);
-	pmd_pte = ULONG(machdep->pmd + PAGEOFFSET(pmd));
-        if (verbose) 
-                fprintf(fp, "   PMD: %lx => %lx\n", (ulong)pmd, pmd_pte);
+	pmd_pte = x86_64_pmd_offset(pgd_pte, uvaddr, verbose, FALSE);
 	if (!(pmd_pte & _PAGE_PRESENT))
 		goto no_upage;
         if (pmd_pte & _PAGE_PSE) {
@@ -2057,12 +2103,7 @@ x86_64_uvtop(struct task_context *tc, ulong uvaddr, physaddr_t *paddr, int verbo
 	 *  ptep = pte_offset_map(pmd, address);
          *  pte = *ptep;
 	 */
-        pte_paddr = pmd_pte & PHYSICAL_PAGE_MASK;
-        FILL_PTBL(pte_paddr, PHYSADDR, PAGESIZE());
-        ptep = ((ulong *)pte_paddr) + pte_index(uvaddr);
-        pte = ULONG(machdep->ptbl + PAGEOFFSET(ptep));
-        if (verbose)
-                fprintf(fp, "   PTE: %lx => %lx\n", (ulong)ptep, pte);
+	pte = x86_64_pte_offset(pmd_pte, uvaddr, verbose, FALSE);
         if (!(pte & (_PAGE_PRESENT))) {
 		*paddr = pte;
 
@@ -2088,7 +2129,6 @@ no_upage:
 	return FALSE;
 }
 
-
 /*
  *  Translates a kernel virtual address to its physical address.  cmd_vtop()
  *  sets the verbose flag so that the pte translation gets displayed; all
@@ -2098,14 +2138,8 @@ static int
 x86_64_kvtop(struct task_context *tc, ulong kvaddr, physaddr_t *paddr, int verbose)
 {
 	ulong *pml4;
-        ulong *pgd;
-	ulong pgd_paddr;
-	ulong pgd_pte;
-	ulong *pmd;
-	ulong pmd_paddr;
+	ulong pud_pte;
 	ulong pmd_pte;
-	ulong *ptep;
-	ulong pte_paddr;
 	ulong pte;
 	physaddr_t physpage;
 
@@ -2116,12 +2150,7 @@ x86_64_kvtop(struct task_context *tc, ulong kvaddr, physaddr_t *paddr, int verbo
 		 * stage phys_base is not initialized yet and x86_64_VTOP()
 		 * does not work. Jump to the code of pagetable translation.
 		 */
-		FILL_PML4();
-		pml4 = ((ulong *)machdep->machspec->pml4) + pml4_index(kvaddr);
-		if (verbose) {
-			fprintf(fp, "PML4 DIRECTORY: %lx\n", vt->kernel_pgd[0]);
-			fprintf(fp, "PAGE DIRECTORY: %lx\n", *pml4);
-		}
+		pgd = x86_64_kpgd_offset(kvaddr, verbose, FALSE);
 		goto start_vtop_with_pagetable;
 	}
 
@@ -2164,35 +2193,21 @@ x86_64_kvtop(struct task_context *tc, ulong kvaddr, physaddr_t *paddr, int verbo
  		/*	
 		 *  pgd = pgd_offset_k(addr);
 		 */
-		FILL_PML4();
-		pml4 = ((ulong *)machdep->machspec->pml4) + pml4_index(kvaddr);  
-        	if (verbose) {
-			fprintf(fp, "PML4 DIRECTORY: %lx\n", vt->kernel_pgd[0]);
-               		fprintf(fp, "PAGE DIRECTORY: %lx\n", *pml4);
-		}
+		pgd = x86_64_kpgd_offset(kvaddr, verbose, FALSE);
 	}
 
 start_vtop_with_pagetable:
 	if (!(*pml4 & _PAGE_PRESENT))
 		goto no_kpage;
-	pgd_paddr = (*pml4) & PHYSICAL_PAGE_MASK;
-	FILL_PGD(pgd_paddr, PHYSADDR, PAGESIZE());
-	pgd = ((ulong *)pgd_paddr) + pgd_index(kvaddr); 
-	pgd_pte = ULONG(machdep->pgd + PAGEOFFSET(pgd));
-        if (verbose) 
-                fprintf(fp, "   PUD: %lx => %lx\n", (ulong)pgd, pgd_pte);
-	if (!(pgd_pte & _PAGE_PRESENT))
+
+	pud_pte = x86_64_pud_offset(*pml4, kvaddr, verbose, FALSE);
+	if (!(pud_pte & _PAGE_PRESENT))
 		goto no_kpage;
 
 	/*
-	 *  pmd = pmd_offset(pgd, addr); 
+         *  pmd = pmd_offset(pud, address);
 	 */
-	pmd_paddr = pgd_pte & PHYSICAL_PAGE_MASK;
-	FILL_PMD(pmd_paddr, PHYSADDR, PAGESIZE());
-	pmd = ((ulong *)pmd_paddr) + pmd_index(kvaddr);
-	pmd_pte = ULONG(machdep->pmd + PAGEOFFSET(pmd));
-        if (verbose) 
-                fprintf(fp, "   PMD: %lx => %lx\n", (ulong)pmd, pmd_pte);
+	pmd_pte = x86_64_pmd_offset(pud_pte, kvaddr, verbose, FALSE);
 	if (!(pmd_pte & _PAGE_PRESENT))
 		goto no_kpage;
 	if (pmd_pte & _PAGE_PSE) {
@@ -2212,12 +2227,7 @@ start_vtop_with_pagetable:
 	 *  ptep = pte_offset_map(pmd, addr);
 	 *  pte = *ptep;
 	 */
-	pte_paddr = pmd_pte & PHYSICAL_PAGE_MASK;
-	FILL_PTBL(pte_paddr, PHYSADDR, PAGESIZE());
-	ptep = ((ulong *)pte_paddr) + pte_index(kvaddr);
-	pte = ULONG(machdep->ptbl + PAGEOFFSET(ptep));
-        if (verbose) 
-                fprintf(fp, "   PTE: %lx => %lx\n", (ulong)ptep, pte);
+	pte = x86_64_pte_offset(pmd_pte, kvaddr, verbose, FALSE);
         if (!(pte & (_PAGE_PRESENT))) {
                 if (pte && verbose) {
                         fprintf(fp, "\n");
@@ -2251,15 +2261,9 @@ static int
 x86_64_kvtop_xen_wpt(struct task_context *tc, ulong kvaddr, physaddr_t *paddr, int verbose)
 {
 	ulong *pml4;
-        ulong *pgd;
-	ulong pgd_paddr;
-	ulong pgd_pte;
-	ulong *pmd;
-	ulong pmd_paddr;
+	ulong pud_pte;
 	ulong pmd_pte;
 	ulong pseudo_pmd_pte;
-	ulong *ptep;
-	ulong pte_paddr;
 	ulong pte;
 	ulong pseudo_pte;
 	physaddr_t physpage;
@@ -2268,38 +2272,18 @@ x86_64_kvtop_xen_wpt(struct task_context *tc, ulong kvaddr, physaddr_t *paddr, i
  	/*	
 	 *  pgd = pgd_offset_k(addr);
 	 */
-	FILL_PML4();
-	pml4 = ((ulong *)machdep->machspec->pml4) + pml4_index(kvaddr);  
-        if (verbose) {
-		fprintf(fp, "PML4 DIRECTORY: %lx\n", vt->kernel_pgd[0]);
-                fprintf(fp, "PAGE DIRECTORY: %lx [machine]\n", *pml4);
-	}
+	pml4 = x86_64_kpgd_offset(kvaddr, verbose, TRUE);
 	if (!(*pml4 & _PAGE_PRESENT))
 		goto no_kpage;
-	pgd_paddr = (*pml4) & PHYSICAL_PAGE_MASK;
-	pgd_paddr = xen_m2p(pgd_paddr);
-	if (verbose)
-                fprintf(fp, "PAGE DIRECTORY: %lx\n", pgd_paddr);
-	FILL_PGD(pgd_paddr, PHYSADDR, PAGESIZE());
-	pgd = ((ulong *)pgd_paddr) + pgd_index(kvaddr); 
-	pgd_pte = ULONG(machdep->pgd + PAGEOFFSET(pgd));
-        if (verbose) 
-                fprintf(fp, "   PUD: %lx => %lx [machine]\n", (ulong)pgd, pgd_pte);
-	if (!(pgd_pte & _PAGE_PRESENT))
+
+	pud_pte = x86_64_pud_offset(*pml4, kvaddr, verbose, TRUE);
+	if (!(pud_pte & _PAGE_PRESENT))
 		goto no_kpage;
 
 	/*
 	 *  pmd = pmd_offset(pgd, addr); 
 	 */
-	pmd_paddr = pgd_pte & PHYSICAL_PAGE_MASK;
-	pmd_paddr = xen_m2p(pmd_paddr);
-	if (verbose)
-                fprintf(fp, "   PUD: %lx\n", pmd_paddr);
-	FILL_PMD(pmd_paddr, PHYSADDR, PAGESIZE());
-	pmd = ((ulong *)pmd_paddr) + pmd_index(kvaddr);
-	pmd_pte = ULONG(machdep->pmd + PAGEOFFSET(pmd));
-        if (verbose) 
-                fprintf(fp, "   PMD: %lx => %lx [machine]\n", (ulong)pmd, pmd_pte);
+	pmd_pte = x86_64_pmd_offset(pud_pte, kvaddr, verbose, TRUE);
 	if (!(pmd_pte & _PAGE_PRESENT))
 		goto no_kpage;
 	if (pmd_pte & _PAGE_PSE) {
@@ -2338,15 +2322,7 @@ x86_64_kvtop_xen_wpt(struct task_context *tc, ulong kvaddr, physaddr_t *paddr, i
 	 *  ptep = pte_offset_map(pmd, addr);
 	 *  pte = *ptep;
 	 */
-	pte_paddr = pmd_pte & PHYSICAL_PAGE_MASK;
-	pte_paddr = xen_m2p(pte_paddr);
-	if (verbose)
-		fprintf(fp, "   PMD: %lx\n", pte_paddr); 
-	FILL_PTBL(pte_paddr, PHYSADDR, PAGESIZE());
-	ptep = ((ulong *)pte_paddr) + pte_index(kvaddr);
-	pte = ULONG(machdep->ptbl + PAGEOFFSET(ptep));
-        if (verbose) 
-                fprintf(fp, "   PTE: %lx => %lx [machine]\n", (ulong)ptep, pte);
+	pte = x86_64_pte_offset(pmd_pte, kvaddr, verbose, TRUE);
         if (!(pte & (_PAGE_PRESENT))) {
                 if (pte && verbose) {
                         fprintf(fp, "\n");
-- 
2.14.3






More information about the Crash-utility mailing list