Repace the PML4 and UPML with the common PGD and Use PUD macro in the 4-level paging table in x86_64. make the x86_64_vtop_xxx() uniform for the different situation. Signed-off-by: Dou Liyang <douly.fnst@xxxxxxxxxxxxxx> --- defs.h | 53 ++++++------- sadump.c | 9 ++- x86_64.c | 260 ++++++++++++++++++++++++++++++--------------------------------- 3 files changed, 148 insertions(+), 174 deletions(-) diff --git a/defs.h b/defs.h index e0b77ce..5804206 100644 --- a/defs.h +++ b/defs.h @@ -3332,56 +3332,44 @@ struct arm64_stackframe { #define VTOP(X) x86_64_VTOP((ulong)(X)) #define IS_VMALLOC_ADDR(X) x86_64_IS_VMALLOC_ADDR((ulong)(X)) -#define PML4_SHIFT 39 -#define PTRS_PER_PML4 512 +/* origin level page */ #define PGDIR_SHIFT 30 #define PTRS_PER_PGD 512 #define PMD_SHIFT 21 #define PTRS_PER_PMD 512 #define PTRS_PER_PTE 512 +/* 4 level page */ +#define PGDIR_SHIFT_4LEVEL 39 +#define PTRS_PER_PGD_4LEVEL 512 +#define PUD_SHIFT 30 +#define PTRS_PER_PUD 512 + +/* 5 level page */ #define PGDIR_SHIFT_5LEVEL 48 #define PTRS_PER_PGD_5LEVEL 512 #define P4D_SHIFT 39 #define PTRS_PER_P4D 512 #define __PGDIR_SHIFT (machdep->machspec->pgdir_shift) +#define __PTRS_PER_PGD (machdep->machspec->ptrs_per_pgd) -#define pml4_index(address) (((address) >> PML4_SHIFT) & (PTRS_PER_PML4-1)) +#define pgd_index(address) (((address) >> __PGDIR_SHIFT) & (__PTRS_PER_PGD-1)) #define p4d_index(address) (((address) >> P4D_SHIFT) & (PTRS_PER_P4D - 1)) -#define pgd_index(address) (((address) >> __PGDIR_SHIFT) & (PTRS_PER_PGD-1)) +#define pud_index(address) (((address) >> PUD_SHIFT) & (PTRS_PER_PUD - 1)) #define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1)) #define pte_index(address) (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) -#define IS_LAST_PML4_READ(pml4) ((ulong)(pml4) == machdep->machspec->last_pml4_read) - -#define FILL_PML4() \ - if (!(pc->flags & RUNTIME) || ACTIVE()) { \ - if (!IS_LAST_PML4_READ(vt->kernel_pgd[0])) { \ - readmem(vt->kernel_pgd[0], KVADDR, machdep->machspec->pml4, \ - PAGESIZE(), "init_level4_pgt", FAULT_ON_ERROR); \ - machdep->machspec->last_pml4_read = (ulong)(vt->kernel_pgd[0]); \ - } \ +#define FILL_TOP_PGD() \ + if (!(pc->flags & RUNTIME) || ACTIVE()) { \ + FILL_PGD(vt->kernel_pgd[0], KVADDR, PAGESIZE()); \ } -#define FILL_PML4_HYPER() \ - if (!machdep->machspec->last_pml4_read) { \ - unsigned long idle_pg_table = symbol_exists("idle_pg_table_4") ? \ - symbol_value("idle_pg_table_4") : \ - symbol_value("idle_pg_table"); \ - readmem(idle_pg_table, KVADDR, machdep->machspec->pml4, PAGESIZE(), \ - "idle_pg_table", FAULT_ON_ERROR); \ - machdep->machspec->last_pml4_read = idle_pg_table; \ - } - -#define IS_LAST_UPML_READ(pml) ((ulong)(pml) == machdep->machspec->last_upml_read) - -#define FILL_UPML(PML, TYPE, SIZE) \ - if (!IS_LAST_UPML_READ(PML)) { \ - readmem((ulonglong)((ulong)(PML)), TYPE, machdep->machspec->upml, \ - SIZE, "pml page", FAULT_ON_ERROR); \ - machdep->machspec->last_upml_read = (ulong)(PML); \ - } +#define FILL_TOP_PGD_HYPER() \ + unsigned long idle_pg_table = symbol_exists("idle_pg_table_4") ? \ + symbol_value("idle_pg_table_4") : \ + symbol_value("idle_pg_table"); \ + FILL_PGD(idle_pg_table, KVADDR, PAGESIZE()); #define IS_LAST_P4D_READ(p4d) ((ulong)(p4d) == machdep->machspec->last_p4d_read) @@ -5749,7 +5737,7 @@ struct machine_specific { ulong modules_vaddr; ulong modules_end; ulong phys_base; - char *pml4; + char *pml4; char *upml; ulong last_upml_read; ulong last_pml4_read; @@ -5773,6 +5761,7 @@ struct machine_specific { ulong irq_stack_gap; ulong kpti_entry_stack; ulong kpti_entry_stack_size; + ulong ptrs_per_pgd; }; #define KSYMS_START (0x1) diff --git a/sadump.c b/sadump.c index 25cefe9..17cfd93 100644 --- a/sadump.c +++ b/sadump.c @@ -2057,10 +2057,11 @@ sadump_calc_kaslr_offset(ulong *kaslr_offset) * TODO: XEN and 5-level is not supported */ vt->kernel_pgd[0] = pgd; - machdep->machspec->last_pml4_read = vt->kernel_pgd[0]; + machdep->last_pgd_read = vt->kernel_pgd[0]; machdep->machspec->physical_mask_shift = __PHYSICAL_MASK_SHIFT_2_6; - machdep->machspec->pgdir_shift = PGDIR_SHIFT; - if (!readmem(pgd, PHYSADDR, machdep->machspec->pml4, PAGESIZE(), + machdep->machspec->pgdir_shift = PGDIR_SHIFT_4LEVEL; + machdep->machspec->ptrs_per_pgd = PTRS_PER_PGD_4LEVEL; + if (!readmem(pgd, PHYSADDR, machdep->pgd, PAGESIZE(), "pgd", RETURN_ON_ERROR)) goto quit; @@ -2108,7 +2109,7 @@ sadump_calc_kaslr_offset(ulong *kaslr_offset) ret = TRUE; quit: vt->kernel_pgd[0] = 0; - machdep->machspec->last_pml4_read = 0; + machdep->last_pgd_read = 0; return ret; } #else diff --git a/x86_64.c b/x86_64.c index e3a8db7..f5e70b5 100644 --- a/x86_64.c +++ b/x86_64.c @@ -168,20 +168,17 @@ x86_64_init(int when) machdep->pageoffset = machdep->pagesize - 1; machdep->pagemask = ~((ulonglong)machdep->pageoffset); machdep->stacksize = machdep->pagesize * 2; - if ((machdep->machspec->upml = (char *)malloc(PAGESIZE())) == NULL) - error(FATAL, "cannot malloc upml space."); - if ((machdep->pgd = (char *)malloc(PAGESIZE())) == NULL) + if ((machdep->pgd = (char *)malloc(PAGESIZE())) == NULL) error(FATAL, "cannot malloc pgd space."); + if ((machdep->pud = (char *)malloc(PAGESIZE())) == NULL) + error(FATAL, "cannot malloc pud space."); if ((machdep->pmd = (char *)malloc(PAGESIZE())) == NULL) error(FATAL, "cannot malloc pmd space."); if ((machdep->ptbl = (char *)malloc(PAGESIZE())) == NULL) error(FATAL, "cannot malloc ptbl space."); - if ((machdep->machspec->pml4 = - (char *)malloc(PAGESIZE()*2)) == NULL) - error(FATAL, "cannot malloc pml4 space."); - machdep->machspec->last_upml_read = 0; - machdep->machspec->last_pml4_read = 0; + machdep->last_pgd_read = 0; + machdep->last_pud_read = 0; machdep->last_pmd_read = 0; machdep->last_ptbl_read = 0; machdep->verify_paddr = x86_64_verify_paddr; @@ -235,12 +232,10 @@ x86_64_init(int when) machdep->machspec->modules_vaddr = MODULES_VADDR_ORIG; machdep->machspec->modules_end = MODULES_END_ORIG; - free(machdep->machspec->upml); - machdep->machspec->upml = NULL; - machdep->uvtop = x86_64_uvtop; machdep->machspec->physical_mask_shift = __PHYSICAL_MASK_SHIFT_2_6; machdep->machspec->pgdir_shift = PGDIR_SHIFT; + machdep->machspec->ptrs_per_pgd = PTRS_PER_PGD; break; case VM_2_6_11: @@ -266,7 +261,8 @@ x86_64_init(int when) machdep->uvtop = x86_64_uvtop_level4; machdep->machspec->physical_mask_shift = __PHYSICAL_MASK_SHIFT_2_6; - machdep->machspec->pgdir_shift = PGDIR_SHIFT; + machdep->machspec->pgdir_shift = PGDIR_SHIFT_4LEVEL; + machdep->machspec->ptrs_per_pgd = PTRS_PER_PGD_4LEVEL; break; case VM_XEN: @@ -278,7 +274,6 @@ x86_64_init(int when) machdep->machspec->modules_vaddr = MODULES_VADDR_XEN; machdep->machspec->modules_end = MODULES_END_XEN; machdep->machspec->physical_mask_shift = __PHYSICAL_MASK_SHIFT_XEN; - machdep->machspec->pgdir_shift = PGDIR_SHIFT; break; case VM_XEN_RHEL4: @@ -290,7 +285,6 @@ x86_64_init(int when) machdep->machspec->modules_vaddr = MODULES_VADDR_XEN_RHEL4; machdep->machspec->modules_end = MODULES_END_XEN_RHEL4; machdep->machspec->physical_mask_shift = __PHYSICAL_MASK_SHIFT_XEN; - machdep->machspec->pgdir_shift = PGDIR_SHIFT; break; case VM_5LEVEL: @@ -304,6 +298,7 @@ x86_64_init(int when) machdep->machspec->vmemmap_end = VMEMMAP_END_5LEVEL; machdep->machspec->physical_mask_shift = __PHYSICAL_MASK_SHIFT_5LEVEL; machdep->machspec->pgdir_shift = PGDIR_SHIFT_5LEVEL; + machdep->machspec->ptrs_per_pgd = PTRS_PER_PGD_5LEVEL; if ((machdep->machspec->p4d = (char *)malloc(PAGESIZE())) == NULL) error(FATAL, "cannot malloc p4d space."); machdep->machspec->last_p4d_read = 0; @@ -631,14 +626,21 @@ x86_64_init(int when) case VM_XEN: case VM_2_6_11: machdep->uvtop = x86_64_uvtop_level4_xen_wpt; + machdep->machspec->pgdir_shift = PGDIR_SHIFT_4LEVEL; + machdep->machspec->ptrs_per_pgd = PTRS_PER_PGD_4LEVEL; break; case VM_XEN_RHEL4: machdep->uvtop = x86_64_uvtop_level4_rhel4_xen_wpt; + machdep->machspec->pgdir_shift = PGDIR_SHIFT; + machdep->machspec->ptrs_per_pgd = PTRS_PER_PGD; break; } machdep->machspec->physical_mask_shift = __PHYSICAL_MASK_SHIFT_XEN; - } else - machdep->uvtop = x86_64_uvtop_level4; + } else { + machdep->uvtop = x86_64_uvtop_level4; + machdep->machspec->pgdir_shift = PGDIR_SHIFT_4LEVEL; + machdep->machspec->ptrs_per_pgd = PTRS_PER_PGD_4LEVEL; + } MEMBER_OFFSET_INIT(vcpu_guest_context_user_regs, "vcpu_guest_context", "user_regs"); ASSIGN_OFFSET(cpu_user_regs_rsp) = @@ -816,9 +818,11 @@ x86_64_dump_machdep_table(ulong arg) fprintf(fp, " value_to_symbol: x86_64_value_to_symbol()\n"); fprintf(fp, " in_alternate_stack: x86_64_in_alternate_stack()\n"); fprintf(fp, " last_pgd_read: %lx\n", machdep->last_pgd_read); + fprintf(fp, " last_pud_read: %lx\n", machdep->last_pud_read); fprintf(fp, " last_pmd_read: %lx\n", machdep->last_pmd_read); fprintf(fp, " last_ptbl_read: %lx\n", machdep->last_ptbl_read); fprintf(fp, " pgd: %lx\n", (ulong)machdep->pgd); + fprintf(fp, " pud: %lx\n", (ulong)machdep->pud); fprintf(fp, " pmd: %lx\n", (ulong)machdep->pmd); fprintf(fp, " ptbl: %lx\n", (ulong)machdep->ptbl); fprintf(fp, " ptrs_per_pgd: %d\n", machdep->ptrs_per_pgd); @@ -853,15 +857,25 @@ x86_64_dump_machdep_table(ulong arg) fprintf(fp, " pgdir_shift: %ld\n", ms->pgdir_shift); fprintf(fp, " GART_start: %lx\n", ms->GART_start); fprintf(fp, " GART_end: %lx\n", ms->GART_end); - fprintf(fp, " pml4: %lx\n", (ulong)ms->pml4); - fprintf(fp, " last_pml4_read: %lx\n", (ulong)ms->last_pml4_read); + + /* pml4 and upml is legacy for extension modules */ + if (ms->pml4) { + fprintf(fp, " pml4: %lx\n", (ulong)ms->pml4); + fprintf(fp, " last_pml4_read: %lx\n", (ulong)ms->last_pml4_read); + + } else { + fprintf(fp, " pml4: (unused)\n"); + fprintf(fp, " last_pml4_read: (unused)\n"); + } + if (ms->upml) { - fprintf(fp, " upml: %lx\n", (ulong)ms->upml); - fprintf(fp, " last_upml_read: %lx\n", (ulong)ms->last_upml_read); + fprintf(fp, " upml: %lx\n", (ulong)ms->upml); + fprintf(fp, " last_upml_read: %lx\n", (ulong)ms->last_upml_read); } else { - fprintf(fp, " upml: (unused)\n"); - fprintf(fp, " last_upml_read: (unused)\n"); + fprintf(fp, " upml: (unused)\n"); + fprintf(fp, " last_upml_read: (unused)\n"); } + if (ms->p4d) { fprintf(fp, " p4d: %lx\n", (ulong)ms->p4d); fprintf(fp, " last_p4d_read: %lx\n", (ulong)ms->last_p4d_read); @@ -1529,7 +1543,7 @@ x86_64_init_kernel_pgd(void) for (i = 0; i < NR_CPUS; i++) vt->kernel_pgd[i] = kernel_pgt; - FILL_PML4(); + FILL_TOP_PGD(); } /* @@ -1589,8 +1603,8 @@ x86_64_kpgd_offset(ulong kvaddr, int verbose, int IS_XEN) { ulong *pgd; - FILL_PML4(); - pgd = ((ulong *)machdep->machspec->pml4) + pml4_index(kvaddr); + FILL_TOP_PGD(); + pgd = ((ulong *)machdep->pgd) + pgd_index(kvaddr); if (verbose) { fprintf(fp, "PGD DIRECTORY: %lx\n", vt->kernel_pgd[0]); if(IS_XEN) @@ -1613,16 +1627,16 @@ x86_64_upgd_offset(struct task_context *tc, ulong uvaddr, int verbose, int IS_XE 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); + 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)); + pgd_paddr = x86_64_VTOP((ulong)pgd); + FILL_PGD(pgd_paddr, PHYSADDR, PAGESIZE()); + pgd = ((ulong *)pgd_paddr) + pgd_index(uvaddr); + pgd_pte = ULONG(machdep->pgd + PAGEOFFSET(pgd)); if (verbose) { if(IS_XEN) fprintf(fp, " PGD: %lx => %lx [machine]\n", (ulong)pgd, pgd_pte); @@ -1653,7 +1667,7 @@ x86_64_pud_offset(ulong pgd_pte, ulong vaddr, int verbose, int IS_XEN) } FILL_PUD(pud_paddr, PHYSADDR, PAGESIZE()); - pud = ((ulong *)pud_paddr) + pgd_index(vaddr); + pud = ((ulong *)pud_paddr) + pud_index(vaddr); pud_pte = ULONG(machdep->pud + PAGEOFFSET(pud)); if (verbose) { if(IS_XEN) @@ -1935,9 +1949,6 @@ no_upage: static int x86_64_uvtop_level4_rhel4_xen_wpt(struct task_context *tc, ulong uvaddr, physaddr_t *paddr, int verbose) { - ulong mm; - ulong *pgd; - ulong pgd_paddr; ulong pgd_pte; ulong pmd_pte; ulong pseudo_pmd_pte; @@ -1954,18 +1965,7 @@ x86_64_uvtop_level4_rhel4_xen_wpt(struct task_context *tc, ulong uvaddr, physadd if (IS_KVADDR(uvaddr)) return x86_64_kvtop(tc, uvaddr, paddr, verbose); - if ((mm = 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_PGD(pgd_paddr, PHYSADDR, PAGESIZE()); - pgd = ((ulong *)pgd_paddr) + pgd_index(uvaddr); - pgd_pte = ULONG(machdep->pgd + PAGEOFFSET(pgd)); - if (verbose) - fprintf(fp, " PGD: %lx => %lx [machine]\n", (ulong)pgd, pgd_pte); + pgd_pte = x86_64_upgd_offset(tc, uvaddr, verbose, TRUE); if (!(pgd_pte & _PAGE_PRESENT)) goto no_upage; @@ -2046,9 +2046,6 @@ no_upage: static int x86_64_uvtop(struct task_context *tc, ulong uvaddr, physaddr_t *paddr, int verbose) { - ulong mm; - ulong *pgd; - ulong pgd_paddr; ulong pgd_pte; ulong pmd_pte; ulong pte; @@ -2062,21 +2059,10 @@ x86_64_uvtop(struct task_context *tc, ulong uvaddr, physaddr_t *paddr, int verbo if (IS_KVADDR(uvaddr)) return x86_64_kvtop(tc, uvaddr, paddr, verbose); - /* - * pgd = pgd_offset(mm, address); - */ - if ((mm = 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_PGD(pgd_paddr, PHYSADDR, PAGESIZE()); - pgd = ((ulong *)pgd_paddr) + pgd_index(uvaddr); - pgd_pte = ULONG(machdep->pgd + PAGEOFFSET(pgd)); - if (verbose) - fprintf(fp, " PGD: %lx => %lx\n", (ulong)pgd, pgd_pte); + /* + * pgd = pgd_offset(mm, address); + */ + pgd_pte = x86_64_upgd_offset(tc, uvaddr, verbose, FALSE); if (!(pgd_pte & _PAGE_PRESENT)) goto no_upage; @@ -2137,7 +2123,7 @@ no_upage: static int x86_64_kvtop(struct task_context *tc, ulong kvaddr, physaddr_t *paddr, int verbose) { - ulong *pml4; + ulong *pgd; ulong pud_pte; ulong pmd_pte; ulong pte; @@ -2166,11 +2152,11 @@ x86_64_kvtop(struct task_context *tc, ulong kvaddr, physaddr_t *paddr, int verbo *paddr = kvaddr - DIRECTMAP_VIRT_START; return TRUE; } - FILL_PML4_HYPER(); - pml4 = ((ulong *)machdep->machspec->pml4) + pml4_index(kvaddr); + FILL_TOP_PGD_HYPER(); + pgd = ((ulong *)machdep->pgd) + pgd_index(kvaddr); if (verbose) { - fprintf(fp, "PML4 DIRECTORY: %lx\n", vt->kernel_pgd[0]); - fprintf(fp, "PAGE DIRECTORY: %lx\n", *pml4); + fprintf(fp, "PGD DIRECTORY: %lx\n", vt->kernel_pgd[0]); + fprintf(fp, "PAGE DIRECTORY: %lx\n", *pgd); } } else { if (!vt->vmalloc_start) { @@ -2197,10 +2183,10 @@ x86_64_kvtop(struct task_context *tc, ulong kvaddr, physaddr_t *paddr, int verbo } start_vtop_with_pagetable: - if (!(*pml4 & _PAGE_PRESENT)) + if (!(*pgd & _PAGE_PRESENT)) goto no_kpage; - pud_pte = x86_64_pud_offset(*pml4, kvaddr, verbose, FALSE); + pud_pte = x86_64_pud_offset(*pgd, kvaddr, verbose, FALSE); if (!(pud_pte & _PAGE_PRESENT)) goto no_kpage; @@ -2260,7 +2246,7 @@ x86_64_kvtop_5level(struct task_context *tc, ulong kvaddr, physaddr_t *paddr, in static int x86_64_kvtop_xen_wpt(struct task_context *tc, ulong kvaddr, physaddr_t *paddr, int verbose) { - ulong *pml4; + ulong *pgd; ulong pud_pte; ulong pmd_pte; ulong pseudo_pmd_pte; @@ -2272,11 +2258,11 @@ x86_64_kvtop_xen_wpt(struct task_context *tc, ulong kvaddr, physaddr_t *paddr, i /* * pgd = pgd_offset_k(addr); */ - pml4 = x86_64_kpgd_offset(kvaddr, verbose, TRUE); - if (!(*pml4 & _PAGE_PRESENT)) + pgd = x86_64_kpgd_offset(kvaddr, verbose, TRUE); + if (!(*pgd & _PAGE_PRESENT)) goto no_kpage; - pud_pte = x86_64_pud_offset(*pml4, kvaddr, verbose, TRUE); + pud_pte = x86_64_pud_offset(*pgd, kvaddr, verbose, TRUE); if (!(pud_pte & _PAGE_PRESENT)) goto no_kpage; @@ -5865,7 +5851,8 @@ parse_cmdline_args(void) void x86_64_clear_machdep_cache(void) { - machdep->machspec->last_upml_read = 0; + if (machdep->last_pgd_read != vt->kernel_pgd[0]) + machdep->last_pgd_read = 0; } #define PUSH_RBP_MOV_RSP_RBP 0xe5894855 @@ -6244,12 +6231,12 @@ use_cr3: if (CRASHDEBUG(1)) fprintf(fp, "x86_64_xen_kdump_p2m_create: cr3: %lx\n", xkd->cr3); - if (!readmem(PTOB(xkd->cr3), PHYSADDR, machdep->machspec->pml4, + if (!readmem(PTOB(xkd->cr3), PHYSADDR, machdep->pgd, PAGESIZE(), "xen kdump cr3 page", RETURN_ON_ERROR)) error(FATAL, "cannot read xen kdump cr3 page\n"); if (CRASHDEBUG(7)) - x86_64_debug_dump_page(fp, machdep->machspec->pml4, + x86_64_debug_dump_page(fp, machdep->pgd, "contents of PML4 page:"); /* @@ -6284,7 +6271,7 @@ use_cr3: if (CRASHDEBUG(1)) fprintf(fp, "phys_to_machine_mapping: %lx\n", kvaddr); - machdep->last_pgd_read = BADADDR; + machdep->last_pud_read = BADADDR; machdep->last_pmd_read = BADADDR; machdep->last_ptbl_read = BADADDR; @@ -6299,7 +6286,7 @@ use_cr3: fprintf(fp, "\n"); } - machdep->last_pgd_read = 0; + machdep->last_pud_read = 0; machdep->last_ptbl_read = 0; machdep->last_pmd_read = 0; pc->curcmd_flags &= ~XEN_MACHINE_ADDR; @@ -6313,33 +6300,33 @@ static char * x86_64_xen_kdump_load_page(ulong kvaddr, char *pgbuf) { ulong mfn; - ulong *pml4, *pgd, *pmd, *ptep; + ulong *pgd, *pud, *pmd, *ptep; - pml4 = ((ulong *)machdep->machspec->pml4) + pml4_index(kvaddr); - mfn = ((*pml4) & PHYSICAL_PAGE_MASK) >> PAGESHIFT(); + pgd = ((ulong *)machdep->pgd) + pgd_index(kvaddr); + mfn = ((*pgd) & PHYSICAL_PAGE_MASK) >> PAGESHIFT(); if (CRASHDEBUG(3)) fprintf(fp, - "[%lx] pml4: %lx mfn: %lx pml4_index: %lx\n", - kvaddr, *pml4, mfn, pml4_index(kvaddr)); + "[%lx] pgd: %lx mfn: %lx pgd_index: %lx\n", + kvaddr, *pgd, mfn, pgd_index(kvaddr)); - if (!readmem(PTOB(mfn), PHYSADDR, machdep->pgd, PAGESIZE(), + if (!readmem(PTOB(mfn), PHYSADDR, machdep->pud, PAGESIZE(), "xen kdump pud page", RETURN_ON_ERROR)) error(FATAL, "cannot read/find pud page\n"); - machdep->last_pgd_read = mfn; + machdep->last_pud_read = mfn; if (CRASHDEBUG(7)) - x86_64_debug_dump_page(fp, machdep->pgd, + x86_64_debug_dump_page(fp, machdep->pud, "contents of page upper directory page:"); - pgd = ((ulong *)machdep->pgd) + pgd_index(kvaddr); - mfn = ((*pgd) & PHYSICAL_PAGE_MASK) >> PAGESHIFT(); + pud = ((ulong *)machdep->pud) + pud_index(kvaddr); + mfn = ((*pud) & PHYSICAL_PAGE_MASK) >> PAGESHIFT(); if (CRASHDEBUG(3)) fprintf(fp, - "[%lx] pgd: %lx mfn: %lx pgd_index: %lx\n", - kvaddr, *pgd, mfn, pgd_index(kvaddr)); + "[%lx] pud: %lx mfn: %lx pud_index: %lx\n", + kvaddr, *pgd, mfn, pud_index(kvaddr)); if (!readmem(PTOB(mfn), PHYSADDR, machdep->pmd, PAGESIZE(), "xen kdump pmd page", RETURN_ON_ERROR)) @@ -6392,21 +6379,21 @@ static ulong x86_64_xen_kdump_page_mfn(ulong kvaddr) { ulong mfn; - ulong *pml4, *pgd, *pmd, *ptep; + ulong *pgd, *pud, *pmd, *ptep; - pml4 = ((ulong *)machdep->machspec->pml4) + pml4_index(kvaddr); - mfn = ((*pml4) & PHYSICAL_PAGE_MASK) >> PAGESHIFT(); + pgd = ((ulong *)machdep->pgd) + pgd_index(kvaddr); + mfn = ((*pgd) & PHYSICAL_PAGE_MASK) >> PAGESHIFT(); - if ((mfn != machdep->last_pgd_read) && - !readmem(PTOB(mfn), PHYSADDR, machdep->pgd, PAGESIZE(), + if ((mfn != machdep->last_pud_read) && + !readmem(PTOB(mfn), PHYSADDR, machdep->pud, PAGESIZE(), "xen kdump pud entry", RETURN_ON_ERROR)) error(FATAL, "cannot read/find pud page\n"); - machdep->last_pgd_read = mfn; + machdep->last_pud_read = mfn; - pgd = ((ulong *)machdep->pgd) + pgd_index(kvaddr); - mfn = ((*pgd) & PHYSICAL_PAGE_MASK) >> PAGESHIFT(); + pud = ((ulong *)machdep->pud) + pud_index(kvaddr); + mfn = ((*pud) & PHYSICAL_PAGE_MASK) >> PAGESHIFT(); - if ((mfn != machdep->last_pmd_read) && + if ((mfn != machdep->last_pmd_read) && !readmem(PTOB(mfn), PHYSADDR, machdep->pmd, PAGESIZE(), "xen kdump pmd entry", RETURN_ON_ERROR)) error(FATAL, "cannot read/find pmd page\n"); @@ -6761,12 +6748,12 @@ x86_64_xendump_p2m_create(struct xendump_data *xd) mfn = ctrlreg[3] >> PAGESHIFT(); - if (!xc_core_mfn_to_page(mfn, machdep->machspec->pml4)) + if (!xc_core_mfn_to_page(mfn, machdep->pgd)) error(FATAL, "cannot read/find cr3 page\n"); if (CRASHDEBUG(7)) - x86_64_debug_dump_page(xd->ofp, machdep->machspec->pml4, - "contents of PML4 page:"); + x86_64_debug_dump_page(xd->ofp, machdep->pgd, + "contents of PGD page:"); /* * kernel version < 2.6.27 => end_pfn @@ -6847,12 +6834,12 @@ x86_64_pvops_xendump_p2m_create(struct xendump_data *xd) mfn = ctrlreg[3] >> PAGESHIFT(); - if (!xc_core_mfn_to_page(mfn, machdep->machspec->pml4)) + if (!xc_core_mfn_to_page(mfn, machdep->pgd)) error(FATAL, "cannot read/find cr3 page\n"); if (CRASHDEBUG(7)) - x86_64_debug_dump_page(xd->ofp, machdep->machspec->pml4, - "contents of PML4 page:"); + x86_64_debug_dump_page(xd->ofp, machdep->pgd, + "contents of PGD page:"); /* * kernel version < 2.6.27 => end_pfn @@ -7028,32 +7015,32 @@ static char * x86_64_xendump_load_page(ulong kvaddr, struct xendump_data *xd) { ulong mfn; - ulong *pml4, *pgd, *pmd, *ptep; + ulong *pgd, *pud, *pmd, *ptep; - pml4 = ((ulong *)machdep->machspec->pml4) + pml4_index(kvaddr); - mfn = ((*pml4) & PHYSICAL_PAGE_MASK) >> PAGESHIFT(); + pgd = ((ulong *)machdep->pgd) + pgd_index(kvaddr); + mfn = ((*pgd) & PHYSICAL_PAGE_MASK) >> PAGESHIFT(); if (CRASHDEBUG(3)) fprintf(xd->ofp, - "[%lx] pml4: %lx mfn: %lx pml4_index: %lx\n", - kvaddr, *pml4, mfn, pml4_index(kvaddr)); + "[%lx] pgd: %lx mfn: %lx pgd_index: %lx\n", + kvaddr, *pgd, mfn, pgd_index(kvaddr)); - if (!xc_core_mfn_to_page(mfn, machdep->pgd)) + if (!xc_core_mfn_to_page(mfn, machdep->pud)) error(FATAL, "cannot read/find pud page\n"); - machdep->last_pgd_read = mfn; + machdep->last_pud_read = mfn; if (CRASHDEBUG(7)) - x86_64_debug_dump_page(xd->ofp, machdep->pgd, + x86_64_debug_dump_page(xd->ofp, machdep->pud, "contents of page upper directory page:"); - pgd = ((ulong *)machdep->pgd) + pgd_index(kvaddr); - mfn = ((*pgd) & PHYSICAL_PAGE_MASK) >> PAGESHIFT(); + pud = ((ulong *)machdep->pud) + pud_index(kvaddr); + mfn = ((*pud) & PHYSICAL_PAGE_MASK) >> PAGESHIFT(); if (CRASHDEBUG(3)) fprintf(xd->ofp, - "[%lx] pgd: %lx mfn: %lx pgd_index: %lx\n", - kvaddr, *pgd, mfn, pgd_index(kvaddr)); + "[%lx] pud: %lx mfn: %lx pud_index: %lx\n", + kvaddr, *pud, mfn, pud_index(kvaddr)); if (!xc_core_mfn_to_page(mfn, machdep->pmd)) error(FATAL, "cannot read/find pmd page\n"); @@ -7107,18 +7094,18 @@ x86_64_xendump_page_index(ulong kvaddr, struct xendump_data *xd) { int idx; ulong mfn; - ulong *pml4, *pgd, *pmd, *ptep; + ulong *pgd, *pud, *pmd, *ptep; - pml4 = ((ulong *)machdep->machspec->pml4) + pml4_index(kvaddr); - mfn = ((*pml4) & PHYSICAL_PAGE_MASK) >> PAGESHIFT(); + pgd = ((ulong *)machdep->pgd) + pgd_index(kvaddr); + mfn = ((*pgd) & PHYSICAL_PAGE_MASK) >> PAGESHIFT(); - if ((mfn != machdep->last_pgd_read) && - !xc_core_mfn_to_page(mfn, machdep->pgd)) + if ((mfn != machdep->last_pud_read) && + !xc_core_mfn_to_page(mfn, machdep->pud)) error(FATAL, "cannot read/find pud page\n"); - machdep->last_pgd_read = mfn; + machdep->last_pud_read = mfn; - pgd = ((ulong *)machdep->pgd) + pgd_index(kvaddr); - mfn = ((*pgd) & PHYSICAL_PAGE_MASK) >> PAGESHIFT(); + pud = ((ulong *)machdep->pud) + pud_index(kvaddr); + mfn = ((*pud) & PHYSICAL_PAGE_MASK) >> PAGESHIFT(); if ((mfn != machdep->last_pmd_read) && !xc_core_mfn_to_page(mfn, machdep->pmd)) @@ -7609,20 +7596,17 @@ x86_64_init_hyper(int when) machdep->pageoffset = machdep->pagesize - 1; machdep->pagemask = ~((ulonglong)machdep->pageoffset); machdep->stacksize = machdep->pagesize * 2; - if ((machdep->machspec->upml = (char *)malloc(PAGESIZE())) == NULL) - error(FATAL, "cannot malloc upml space."); if ((machdep->pgd = (char *)malloc(PAGESIZE())) == NULL) error(FATAL, "cannot malloc pgd space."); + if ((machdep->pud = (char *)malloc(PAGESIZE())) == NULL) + error(FATAL, "cannot malloc pud space."); if ((machdep->pmd = (char *)malloc(PAGESIZE())) == NULL) error(FATAL, "cannot malloc pmd space."); if ((machdep->ptbl = (char *)malloc(PAGESIZE())) == NULL) error(FATAL, "cannot malloc ptbl space."); - if ((machdep->machspec->pml4 = - (char *)malloc(PAGESIZE()*2)) == NULL) - error(FATAL, "cannot malloc pml4 space."); - machdep->machspec->last_upml_read = 0; - machdep->machspec->last_pml4_read = 0; + machdep->last_pgd_read = 0; + machdep->last_pud_read = 0; machdep->last_pmd_read = 0; machdep->last_ptbl_read = 0; machdep->verify_paddr = generic_verify_paddr; -- 2.14.3 -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility