[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] x86/shadow: don't use PV LDT area for cross-pages access emulation
commit 9ada00228b18db21bc2fab5557b3a73be2bc47b4 Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Tue Mar 5 08:51:10 2013 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Tue Mar 5 08:51:10 2013 +0100 x86/shadow: don't use PV LDT area for cross-pages access emulation As of 703ac3a ("x86: introduce create_perdomain_mapping()"), the page tables for this range don't get set up anymore for non-PV guests. And the way this was done was marked as a hack rather than a proper mechanism anyway. Use vmap() instead. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Acked-by: Tim Deegan <tim@xxxxxxx> --- xen/arch/x86/mm/shadow/multi.c | 27 ++++++++------------------- 1 files changed, 8 insertions(+), 19 deletions(-) diff --git a/xen/arch/x86/mm/shadow/multi.c b/xen/arch/x86/mm/shadow/multi.c index 68f5505..a593f76 100644 --- a/xen/arch/x86/mm/shadow/multi.c +++ b/xen/arch/x86/mm/shadow/multi.c @@ -4621,7 +4621,6 @@ static void *emulate_map_dest(struct vcpu *v, u32 bytes, struct sh_emulate_ctxt *sh_ctxt) { - unsigned long offset; void *map = NULL; sh_ctxt->mfn1 = emulate_gva_to_mfn(v, vaddr, sh_ctxt); @@ -4653,6 +4652,8 @@ static void *emulate_map_dest(struct vcpu *v, } else { + unsigned long mfns[2]; + /* Cross-page emulated writes are only supported for HVM guests; * PV guests ought to know better */ if ( !is_hvm_vcpu(v) ) @@ -4670,17 +4671,11 @@ static void *emulate_map_dest(struct vcpu *v, /* Cross-page writes mean probably not a pagetable */ sh_remove_shadows(v, sh_ctxt->mfn2, 0, 0 /* Slow, can fail */ ); - /* Hack: we map the pages into the vcpu's LDT space, since we - * know that we're not going to need the LDT for HVM guests, - * and only HVM guests are allowed unaligned writes. */ - ASSERT(is_hvm_vcpu(v)); - map = (void *)LDT_VIRT_START(v); - offset = l1_linear_offset((unsigned long) map); - l1e_write(&__linear_l1_table[offset], - l1e_from_pfn(mfn_x(sh_ctxt->mfn1), __PAGE_HYPERVISOR)); - l1e_write(&__linear_l1_table[offset + 1], - l1e_from_pfn(mfn_x(sh_ctxt->mfn2), __PAGE_HYPERVISOR)); - flush_tlb_local(); + mfns[0] = mfn_x(sh_ctxt->mfn1); + mfns[1] = mfn_x(sh_ctxt->mfn2); + map = vmap(mfns, 2); + if ( !map ) + return MAPPING_UNHANDLEABLE; map += (vaddr & ~PAGE_MASK); } @@ -4758,14 +4753,8 @@ static void emulate_unmap_dest(struct vcpu *v, if ( unlikely(mfn_valid(sh_ctxt->mfn2)) ) { - unsigned long offset; paging_mark_dirty(v->domain, mfn_x(sh_ctxt->mfn2)); - /* Undo the hacky two-frame contiguous map. */ - ASSERT(((unsigned long) addr & PAGE_MASK) == LDT_VIRT_START(v)); - offset = l1_linear_offset((unsigned long) addr); - l1e_write(&__linear_l1_table[offset], l1e_empty()); - l1e_write(&__linear_l1_table[offset + 1], l1e_empty()); - flush_tlb_all(); + vunmap((void *)((unsigned long)addr & PAGE_MASK)); } else sh_unmap_domain_page(addr); -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |