aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/xen/enlighten.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index 70b355d3a86c..5776dc270297 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -301,10 +301,21 @@ static void xen_load_gdt(const struct desc_ptr *dtr)
301 frames = mcs.args; 301 frames = mcs.args;
302 302
303 for (f = 0; va < dtr->address + size; va += PAGE_SIZE, f++) { 303 for (f = 0; va < dtr->address + size; va += PAGE_SIZE, f++) {
304 frames[f] = arbitrary_virt_to_mfn((void *)va); 304 int level;
305 pte_t *ptep = lookup_address(va, &level);
306 unsigned long pfn, mfn;
307 void *virt;
308
309 BUG_ON(ptep == NULL);
310
311 pfn = pte_pfn(*ptep);
312 mfn = pfn_to_mfn(pfn);
313 virt = __va(PFN_PHYS(pfn));
314
315 frames[f] = mfn;
305 316
306 make_lowmem_page_readonly((void *)va); 317 make_lowmem_page_readonly((void *)va);
307 make_lowmem_page_readonly(mfn_to_virt(frames[f])); 318 make_lowmem_page_readonly(virt);
308 } 319 }
309 320
310 MULTI_set_gdt(mcs.mc, frames, size / sizeof(struct desc_struct)); 321 MULTI_set_gdt(mcs.mc, frames, size / sizeof(struct desc_struct));