|
@@ -301,10 +301,21 @@ static void xen_load_gdt(const struct desc_ptr *dtr)
|
|
frames = mcs.args;
|
|
frames = mcs.args;
|
|
|
|
|
|
for (f = 0; va < dtr->address + size; va += PAGE_SIZE, f++) {
|
|
for (f = 0; va < dtr->address + size; va += PAGE_SIZE, f++) {
|
|
- frames[f] = arbitrary_virt_to_mfn((void *)va);
|
|
|
|
|
|
+ int level;
|
|
|
|
+ pte_t *ptep = lookup_address(va, &level);
|
|
|
|
+ unsigned long pfn, mfn;
|
|
|
|
+ void *virt;
|
|
|
|
+
|
|
|
|
+ BUG_ON(ptep == NULL);
|
|
|
|
+
|
|
|
|
+ pfn = pte_pfn(*ptep);
|
|
|
|
+ mfn = pfn_to_mfn(pfn);
|
|
|
|
+ virt = __va(PFN_PHYS(pfn));
|
|
|
|
+
|
|
|
|
+ frames[f] = mfn;
|
|
|
|
|
|
make_lowmem_page_readonly((void *)va);
|
|
make_lowmem_page_readonly((void *)va);
|
|
- make_lowmem_page_readonly(mfn_to_virt(frames[f]));
|
|
|
|
|
|
+ make_lowmem_page_readonly(virt);
|
|
}
|
|
}
|
|
|
|
|
|
MULTI_set_gdt(mcs.mc, frames, size / sizeof(struct desc_struct));
|
|
MULTI_set_gdt(mcs.mc, frames, size / sizeof(struct desc_struct));
|