From 7070094a31e4f8dd5518731cc3f5b1225a4082fb Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Wed, 7 Dec 2016 11:13:53 +0900 Subject: [PATCH] ihk_mc_pt_print_pte(): handle large pages correctly --- arch/x86/kernel/memory.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/arch/x86/kernel/memory.c b/arch/x86/kernel/memory.c index 5afece43..4f8c1c32 100644 --- a/arch/x86/kernel/memory.c +++ b/arch/x86/kernel/memory.c @@ -558,28 +558,34 @@ int ihk_mc_pt_print_pte(struct page_table *pt, void *virt) GET_VIRT_INDICES(v, l4idx, l3idx, l2idx, l1idx); + __kprintf("l4 table: 0x%lX l4idx: %d \n", virt_to_phys(pt), l4idx); if (!(pt->entry[l4idx] & PFL4_PRESENT)) { __kprintf("0x%lX l4idx not present! \n", (unsigned long)virt); - __kprintf("l4 entry: 0x%lX\n", pt->entry[l4idx]); return -EFAULT; } + __kprintf("l4 entry: 0x%lX\n", pt->entry[l4idx]); pt = phys_to_virt(pt->entry[l4idx] & PAGE_MASK); __kprintf("l3 table: 0x%lX l3idx: %d \n", virt_to_phys(pt), l3idx); if (!(pt->entry[l3idx] & PFL3_PRESENT)) { __kprintf("0x%lX l3idx not present! \n", (unsigned long)virt); - __kprintf("l3 entry: 0x%lX\n", pt->entry[l3idx]); return -EFAULT; } + __kprintf("l3 entry: 0x%lX\n", pt->entry[l3idx]); + if ((pt->entry[l3idx] & PFL3_SIZE)) { + __kprintf("l3 entry is 1G page\n"); + return 0; + } pt = phys_to_virt(pt->entry[l3idx] & PAGE_MASK); __kprintf("l2 table: 0x%lX l2idx: %d \n", virt_to_phys(pt), l2idx); if (!(pt->entry[l2idx] & PFL2_PRESENT)) { __kprintf("0x%lX l2idx not present! \n", (unsigned long)virt); - __kprintf("l2 entry: 0x%lX\n", pt->entry[l2idx]); return -EFAULT; } + __kprintf("l2 entry: 0x%lX\n", pt->entry[l2idx]); if ((pt->entry[l2idx] & PFL2_SIZE)) { + __kprintf("l2 entry is 2M page\n"); return 0; } pt = phys_to_virt(pt->entry[l2idx] & PAGE_MASK);