-----Original Message-----
在 2020年06月12日 00:00, crash-utility-request(a)redhat.com 写道:
> Looks good to me, thank you Li RongQing. Please wait for another ack.
The v2 looks good to me.
Acked-by: Lianbo Jiang <lijiang(a)redhat.com>
>
> Acked-by: Kazuhito Hagio <k-hagio-ab(a)nec.com>
>
> If someone can comment or create a patch for Xen, please let us know.
> I cannot test it, but I think we can integrate it with this patch if any.
Anyway, this is a draft patch, but not sure if the patch happens to work
on the Xen. I don't have the Xen environment to confirm it.
If Xen engineers would like to verify the draft patch, that would be nice.
Thank you for your draft patch!
If there is no response to the Xen patch until tomorrow morning, I think
to apply only Li's patch separately for now.
And one more thing, as we discussed internally, we'd like to introduce a
title line to crash's commit log for --oneline readability and add helpful
information more if available. On the other hand, I also would like to
maintain the crash changelog [0] and its format for searchability.
[0]
https://crash-utility.github.io/crash.changelog.html
So, for Li's patch, I'll merge it with something like:
[commit log]
x86_64: Add support for 1GB huge pages to "vtop" command
Add support for 1GB huge page to "vtop" command on x86_64. Without
this patch, the command with a user virtual address corresponding to
a 1GB huge page fails with the error message "vtop: seek error:
physical address: <address> type: "page table"".
crash> vtop 7f6e40000000
VIRTUAL PHYSICAL
vtop: seek error: physical address: 3f53f000f000 type: "page table"
[crash.changelog]
- Add support for 1GB huge page to "vtop" command on x86_64. Without
this patch, the command with a user virtual address corresponding to
a 1GB huge page fails with the error message "vtop: seek error:
physical address: <address> type: "page table"".
(lirongqing(a)baidu.com, chukaiping(a)foxmail.com)
If you have any problems, please let me know.
Thanks,
Kazu
Thanks.
Lianbo
diff --git a/x86_64.c b/x86_64.c
index fc05e8af5695..90361a7c39c8 100644
--- a/x86_64.c
+++ b/x86_64.c
@@ -2087,6 +2087,7 @@ x86_64_uvtop_level4_xen_wpt(struct task_context *tc, ulong uvaddr,
physaddr_t *p
{
ulong pgd_pte;
ulong pud_pte;
+ ulong pseudo_pud_pte;
ulong pmd_pte;
ulong pseudo_pmd_pte;
ulong pte;
@@ -2110,6 +2111,38 @@ x86_64_uvtop_level4_xen_wpt(struct task_context *tc, ulong uvaddr,
physaddr_t *p
if (!(pud_pte & _PAGE_PRESENT))
goto no_upage;
+ if (pud_pte & _PAGE_PSE) {
+ if (verbose)
+ fprintf(fp, " PAGE: %lx (1GB) [machine]\n",
+ PAGEBASE(pud_pte) & PHYSICAL_PAGE_MASK);
+
+ pseudo_pud_pte = xen_m2p(PAGEBASE(pud_pte));
+
+ if (pseudo_pud_pte == XEN_MACHADDR_NOT_FOUND) {
+ if (verbose)
+ fprintf(fp, " PAGE: page not available\n");
+ *paddr = PADDR_NOT_AVAILABLE;
+ return FALSE;
+ }
+
+ pseudo_pud_pte |= PAGEOFFSET(pud_pte);
+
+ if (verbose) {
+ fprintf(fp, " PAGE: %s (1GB)\n\n",
+ mkstring(buf, VADDR_PRLEN, RJUST|LONG_HEX,
+ MKSTR(PAGEBASE(pseudo_pud_pte) &
+ PHYSICAL_PAGE_MASK)));
+
+ x86_64_translate_pte(pseudo_pud_pte, 0, 0);
+ }
+
+ physpage = (PAGEBASE(pseudo_pud_pte) & PHYSICAL_PAGE_MASK) +
+ (uvaddr & ~_1GB_PAGE_MASK);
+
+ *paddr = physpage;
+ return TRUE;
+ }
+
/*
* pmd = pmd_offset(pud, address);
*/
@@ -2504,8 +2537,9 @@ no_kpage:
static int
x86_64_kvtop_xen_wpt(struct task_context *tc, ulong kvaddr, physaddr_t *paddr, int
verbose)
{
- ulong *pgd;
+ ulong *pgd;
ulong pud_pte;
+ ulong pseudo_pud_pte;
ulong pmd_pte;
ulong pseudo_pmd_pte;
ulong pte;
@@ -2524,6 +2558,36 @@ x86_64_kvtop_xen_wpt(struct task_context *tc, ulong kvaddr,
physaddr_t *paddr, i
if (!(pud_pte & _PAGE_PRESENT))
goto no_kpage;
+ if (pud_pte & _PAGE_PSE) {
+ if (verbose)
+ fprintf(fp, " PAGE: %lx (1GB) [machine]\n",
+ PAGEBASE(pud_pte) & PHYSICAL_PAGE_MASK);
+
+ pseudo_pud_pte = xen_m2p(PAGEBASE(pud_pte));
+
+ if (pseudo_pud_pte == XEN_MACHADDR_NOT_FOUND) {
+ if (verbose)
+ fprintf(fp, " PAGE: page not available\n");
+ *paddr = PADDR_NOT_AVAILABLE;
+ return FALSE;
+ }
+
+ pseudo_pud_pte |= PAGEOFFSET(pud_pte);
+ if (verbose) {
+ fprintf(fp, " PAGE: %s (1GB)\n\n",
+ mkstring(buf, VADDR_PRLEN, RJUST|LONG_HEX,
+ MKSTR(PAGEBASE(pseudo_pud_pte) &
+ PHYSICAL_PAGE_MASK)));
+
+ x86_64_translate_pte(pseudo_pud_pte, 0, 0);
+ }
+ physpage = (PAGEBASE(pseudo_pud_pte) & PHYSICAL_PAGE_MASK) +
+ (kvaddr & ~_1GB_PAGE_MASK);
+
+ *paddr = physpage;
+ return TRUE;
+ }
+
/*
* pmd = pmd_offset(pgd, addr);
*/