]> rtime.felk.cvut.cz Git - jailhouse.git/commitdiff
core: Fix page_map_get_guest_page for non-identically mapped guests
authorJan Kiszka <jan.kiszka@siemens.com>
Fri, 7 Feb 2014 09:42:29 +0000 (10:42 +0100)
committerJan Kiszka <jan.kiszka@siemens.com>
Fri, 7 Feb 2014 10:06:05 +0000 (11:06 +0100)
We were missing a final gphys-to-phys translation before mapping the
guest page.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
hypervisor/paging.c

index 3a685c0f14f093ae8d2ce36c2cab4e7d984e3589..d9e18225919b476ca6eff8621e7587441447c954 100644 (file)
@@ -280,7 +280,7 @@ void *page_map_get_guest_page(struct per_cpu *cpu_data,
                              unsigned long page_table_gphys,
                              unsigned long virt, unsigned long flags)
 {
-       unsigned long page_virt, phys;
+       unsigned long page_virt, phys, gphys;
        pt_entry_t pte;
        int err;
 
@@ -303,13 +303,16 @@ void *page_map_get_guest_page(struct per_cpu *cpu_data,
                pte = paging->get_entry((page_table_t)page_virt, virt);
                if (!paging->entry_valid(pte))
                        return NULL;
-               phys = paging->get_phys(pte, virt);
-               if (phys != INVALID_PHYS_ADDR)
+               gphys = paging->get_phys(pte, virt);
+               if (gphys != INVALID_PHYS_ADDR)
                        break;
                page_table_gphys = paging->get_next_pt(pte);
                paging++;
        }
 
+       phys = arch_page_map_gphys2phys(cpu_data, gphys);
+       if (phys == INVALID_PHYS_ADDR)
+               return NULL;
        /* map guest page */
        err = page_map_create(&hv_paging_structs, phys, PAGE_SIZE, page_virt,
                              flags, PAGE_MAP_NON_COHERENT);