diff options
Diffstat (limited to 'arch/x86/xen/enlighten.c')
-rw-r--r-- | arch/x86/xen/enlighten.c | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 8e024554a3e1..334d2ffc4e2a 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
@@ -284,12 +284,11 @@ static void xen_set_ldt(const void *addr, unsigned entries) | |||
284 | 284 | ||
285 | static void xen_load_gdt(const struct desc_ptr *dtr) | 285 | static void xen_load_gdt(const struct desc_ptr *dtr) |
286 | { | 286 | { |
287 | unsigned long *frames; | ||
288 | unsigned long va = dtr->address; | 287 | unsigned long va = dtr->address; |
289 | unsigned int size = dtr->size + 1; | 288 | unsigned int size = dtr->size + 1; |
290 | unsigned pages = (size + PAGE_SIZE - 1) / PAGE_SIZE; | 289 | unsigned pages = (size + PAGE_SIZE - 1) / PAGE_SIZE; |
290 | unsigned long frames[pages]; | ||
291 | int f; | 291 | int f; |
292 | struct multicall_space mcs; | ||
293 | 292 | ||
294 | /* A GDT can be up to 64k in size, which corresponds to 8192 | 293 | /* A GDT can be up to 64k in size, which corresponds to 8192 |
295 | 8-byte entries, or 16 4k pages.. */ | 294 | 8-byte entries, or 16 4k pages.. */ |
@@ -297,9 +296,6 @@ static void xen_load_gdt(const struct desc_ptr *dtr) | |||
297 | BUG_ON(size > 65536); | 296 | BUG_ON(size > 65536); |
298 | BUG_ON(va & ~PAGE_MASK); | 297 | BUG_ON(va & ~PAGE_MASK); |
299 | 298 | ||
300 | mcs = xen_mc_entry(sizeof(*frames) * pages); | ||
301 | frames = mcs.args; | ||
302 | |||
303 | for (f = 0; va < dtr->address + size; va += PAGE_SIZE, f++) { | 299 | for (f = 0; va < dtr->address + size; va += PAGE_SIZE, f++) { |
304 | int level; | 300 | int level; |
305 | pte_t *ptep = lookup_address(va, &level); | 301 | pte_t *ptep = lookup_address(va, &level); |
@@ -314,13 +310,15 @@ static void xen_load_gdt(const struct desc_ptr *dtr) | |||
314 | 310 | ||
315 | frames[f] = mfn; | 311 | frames[f] = mfn; |
316 | 312 | ||
313 | printk("xen_load_gdt: %d va=%p mfn=%lx pfn=%lx va'=%p\n", | ||
314 | f, (void *)va, mfn, pfn, virt); | ||
315 | |||
317 | make_lowmem_page_readonly((void *)va); | 316 | make_lowmem_page_readonly((void *)va); |
318 | make_lowmem_page_readonly(virt); | 317 | make_lowmem_page_readonly(virt); |
319 | } | 318 | } |
320 | 319 | ||
321 | MULTI_set_gdt(mcs.mc, frames, size / sizeof(struct desc_struct)); | 320 | if (HYPERVISOR_set_gdt(frames, size / sizeof(struct desc_struct))) |
322 | 321 | BUG(); | |
323 | xen_mc_issue(PARAVIRT_LAZY_CPU); | ||
324 | } | 322 | } |
325 | 323 | ||
326 | static void load_TLS_descriptor(struct thread_struct *t, | 324 | static void load_TLS_descriptor(struct thread_struct *t, |