ihk_mc_pt_virt_to_pagemap: refactor
This commit is contained in:
@@ -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)
|
uint64_t ihk_mc_pt_virt_to_pagemap(struct page_table *pt, unsigned long virt)
|
||||||
{
|
{
|
||||||
int l4idx, l3idx, l2idx, l1idx;
|
int error;
|
||||||
unsigned long v = (unsigned long)virt;
|
unsigned long phys;
|
||||||
uint64_t ret = 0;
|
uint64_t pagemap;
|
||||||
|
|
||||||
if (!pt) {
|
error = ihk_mc_pt_virt_to_phys(pt, (void *)virt, &phys);
|
||||||
pt = init_pt;
|
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 pagemap;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int ihk_mc_pt_virt_to_phys(struct page_table *pt,
|
int ihk_mc_pt_virt_to_phys(struct page_table *pt,
|
||||||
const void *virt, unsigned long *phys)
|
const void *virt, unsigned long *phys)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user