From ed300b74998e0923313e4fd14b9a41e305942b44 Mon Sep 17 00:00:00 2001 From: Nakajima Akira Date: Tue, 22 Dec 2015 15:46:42 +0900 Subject: [PATCH] Fix that particular kvaddr is converted to wrong paddr BUG INFO Particular kvaddr is converted to wrong paddr. You can see this bug on RHEL6_x86_64. (at present only RHEL6) (I checked RHEL5, RHEL7, Fedora21, Fedora23) from /proc/kallsyms ffffffffff6008c0 D __jiffies /////////// wrong /////////// crash> vtop ffffffffff6008c0 VIRTUAL PHYSICAL ffffffffff6008c0 7f6008c0 PAGE PHYSICAL MAPPING INDEX CNT FLAGS ffffea00000623b8 1c11000 0 0 1 20000000000400 reserved crash> rd ffffffffff6008c0 ffffffffff6008c0: 0000000000000000 ........ /////////// correct /////////// crash> vtop ffffffffff6008c0 VIRTUAL PHYSICAL ffffffffff6008c0 1c118c0 PAGE PHYSICAL MAPPING INDEX CNT FLAGS ffffea00000623b8 1c11000 0 0 1 20000000000400 reserved crash> rd ffffffffff6008c0 ffffffffff6008c0: 00000000ffffe43a :....... Reported-by: Nakajima Akira Signed-off-by: Nakajima Akira --- x86_64.c | 28 +++++++++++++++------------- 1 files changed, 15 insertions(+), 13 deletions(-) diff --git a/x86_64.c b/x86_64.c index ff6fdd5..dab4d43 100644 --- a/x86_64.c +++ b/x86_64.c @@ -1872,19 +1872,21 @@ x86_64_kvtop(struct task_context *tc, ulong kvaddr, physaddr_t *paddr, int verbo fprintf(fp, "PAGE DIRECTORY: %lx\n", *pml4); } } else { - if (!vt->vmalloc_start) { - *paddr = x86_64_VTOP(kvaddr); - return TRUE; - } - - if (!IS_VMALLOC_ADDR(kvaddr)) { - *paddr = x86_64_VTOP(kvaddr); - if (!verbose) - return TRUE; - } - - if (XEN() && (kt->xen_flags & WRITABLE_PAGE_TABLES)) - return (x86_64_kvtop_xen_wpt(tc, kvaddr, paddr, verbose)); + if (kvaddr < MODULES_END) { + if (!vt->vmalloc_start) { + *paddr = x86_64_VTOP(kvaddr); + return TRUE; + } + + if (!IS_VMALLOC_ADDR(kvaddr)) { + *paddr = x86_64_VTOP(kvaddr); + if (!verbose) + return TRUE; + } + + if (XEN() && (kt->xen_flags & WRITABLE_PAGE_TABLES)) + return (x86_64_kvtop_xen_wpt(tc, kvaddr, paddr, verbose)); + } /* * pgd = pgd_offset_k(addr); -- 1.7.1