From 176f6d23a95ff6086c08733f7147860f77bc902b Mon Sep 17 00:00:00 2001 From: NAKAMURA Gou Date: Thu, 21 Apr 2016 22:25:46 +0900 Subject: [PATCH] ihk_mc_pt_virt_to_pagemap: refactor --- arch/x86/kernel/memory.c | 45 ++++++++-------------------------------- 1 file changed, 9 insertions(+), 36 deletions(-) diff --git a/arch/x86/kernel/memory.c b/arch/x86/kernel/memory.c index f7300cc5..7ddaa64d 100644 --- a/arch/x86/kernel/memory.c +++ b/arch/x86/kernel/memory.c @@ -504,48 +504,21 @@ static int __clear_pt_page(struct page_table *pt, void *virt, int largepage) uint64_t ihk_mc_pt_virt_to_pagemap(struct page_table *pt, unsigned long virt) { - int l4idx, l3idx, l2idx, l1idx; - unsigned long v = (unsigned long)virt; - uint64_t ret = 0; + int error; + unsigned long phys; + uint64_t pagemap; - if (!pt) { - pt = init_pt; + error = ihk_mc_pt_virt_to_phys(pt, (void *)virt, &phys); + if (error) { + return 0; } - GET_VIRT_INDICES(v, l4idx, l3idx, l2idx, l1idx); + pagemap = PM_PFRAME(phys >> PAGE_SHIFT); + pagemap |= PM_PSHIFT(PAGE_SHIFT) | PM_PRESENT; - if (!(pt->entry[l4idx] & PFL4_PRESENT)) { - return ret; - } - pt = phys_to_virt(pt->entry[l4idx] & PAGE_MASK); - - if (!(pt->entry[l3idx] & PFL3_PRESENT)) { - return ret; - } - pt = phys_to_virt(pt->entry[l3idx] & PAGE_MASK); - - if (!(pt->entry[l2idx] & PFL2_PRESENT)) { - return ret; - } - if ((pt->entry[l2idx] & PFL2_SIZE)) { - - ret = PM_PFRAME(((pt->entry[l2idx] & LARGE_PAGE_MASK) + - (v & (LARGE_PAGE_SIZE - 1))) >> PAGE_SHIFT); - ret |= PM_PSHIFT(PAGE_SHIFT) | PM_PRESENT; - return ret; - } - pt = phys_to_virt(pt->entry[l2idx] & PAGE_MASK); - - if (!(pt->entry[l1idx] & PFL1_PRESENT)) { - return ret; - } - - ret = PM_PFRAME((pt->entry[l1idx] & PT_PHYSMASK) >> PAGE_SHIFT); - ret |= PM_PSHIFT(PAGE_SHIFT) | PM_PRESENT; - return ret; + return pagemap; } - int ihk_mc_pt_virt_to_phys(struct page_table *pt, const void *virt, unsigned long *phys) {