diff options
author | Jeremy Fitzhardinge <jeremy@goop.org> | 2009-02-27 09:19:26 -0800 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-03-02 12:58:19 +0100 |
commit | 9976b39b5031bbf76f715893cf080b6a17683881 (patch) | |
tree | 3f2c190e24540898aed0f2dc330b29062602b67f /arch/x86/xen/smp.c | |
parent | d0c4f570276cb4d2dc4215b90eb7cb6e2bdd4a15 (diff) | |
download | kernel_samsung_smdk4412-9976b39b5031bbf76f715893cf080b6a17683881.zip kernel_samsung_smdk4412-9976b39b5031bbf76f715893cf080b6a17683881.tar.gz kernel_samsung_smdk4412-9976b39b5031bbf76f715893cf080b6a17683881.tar.bz2 |
xen: deal with virtually mapped percpu data
The virtually mapped percpu space causes us two problems:
- for hypercalls which take an mfn, we need to do a full pagetable
walk to convert the percpu va into an mfn, and
- when a hypercall requires a page to be mapped RO via all its aliases,
we need to make sure its RO in both the percpu mapping and in the
linear mapping
This primarily affects the gdt and the vcpu info structure.
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Cc: Xen-devel <xen-devel@lists.xensource.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Tejun Heo <htejun@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/xen/smp.c')
-rw-r--r-- | arch/x86/xen/smp.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index 035582a..8d47056 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c @@ -219,6 +219,7 @@ cpu_initialize_context(unsigned int cpu, struct task_struct *idle) { struct vcpu_guest_context *ctxt; struct desc_struct *gdt; + unsigned long gdt_mfn; if (cpumask_test_and_set_cpu(cpu, xen_cpu_initialized_map)) return 0; @@ -248,9 +249,12 @@ cpu_initialize_context(unsigned int cpu, struct task_struct *idle) ctxt->ldt_ents = 0; BUG_ON((unsigned long)gdt & ~PAGE_MASK); + + gdt_mfn = arbitrary_virt_to_mfn(gdt); make_lowmem_page_readonly(gdt); + make_lowmem_page_readonly(mfn_to_virt(gdt_mfn)); - ctxt->gdt_frames[0] = virt_to_mfn(gdt); + ctxt->gdt_frames[0] = gdt_mfn; ctxt->gdt_ents = GDT_ENTRIES; ctxt->user_regs.cs = __KERNEL_CS; |