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(a)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