[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 25/34] x86/mm/shadow: make it build with !CONFIG_HVM
On Fri, Aug 17, 2018 at 04:12:43PM +0100, Wei Liu wrote: > Enclose HVM only emulation code under CONFIG_HVM. Add some BUG()s to > to catch any issue. > > Note that although some code checks is_hvm_*, which hints it can be > called for PV as well, I can't find such paths. > > Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> > --- > xen/arch/x86/mm/shadow/common.c | 18 ++++++++++++++++-- > xen/arch/x86/mm/shadow/multi.c | 27 +++++++++++++++++++++------ > 2 files changed, 37 insertions(+), 8 deletions(-) > > diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c > index 0856650..4381538 100644 > --- a/xen/arch/x86/mm/shadow/common.c > +++ b/xen/arch/x86/mm/shadow/common.c > @@ -113,6 +113,7 @@ __initcall(shadow_audit_key_init); > #endif /* SHADOW_AUDIT */ > > > +#if CONFIG_HVM > /**************************************************************************/ > /* x86 emulator support for the shadow code > */ > @@ -380,11 +381,13 @@ static const struct x86_emulate_ops > hvm_shadow_emulator_ops = { > .cmpxchg = hvm_emulate_cmpxchg, > .cpuid = hvmemul_cpuid, > }; > +#endif > > const struct x86_emulate_ops *shadow_init_emulation( > struct sh_emulate_ctxt *sh_ctxt, struct cpu_user_regs *regs, > unsigned int pte_size) > { > +#if CONFIG_HVM > struct segment_register *creg, *sreg; > struct vcpu *v = current; > unsigned long addr; > @@ -423,6 +426,10 @@ const struct x86_emulate_ops *shadow_init_emulation( > ? sizeof(sh_ctxt->insn_buf) : 0; > > return &hvm_shadow_emulator_ops; > +#else > + BUG(); I would usually use ASSERT_UNREACHABLE in such situations. And here I wonder whether this cannot be called from a PV path, AFAICT: do_page_fault -> fixup_page_fault -> paging_fault -> page_fault (sh_page_fault) -> shadow_init_emulation But maybe there are other conditions that make this path actually unreachable (or maybe something in your series changed this path). > + return NULL; > +#endif > } > > /* Update an initialized emulation context to prepare for the next > @@ -430,6 +437,7 @@ const struct x86_emulate_ops *shadow_init_emulation( > void shadow_continue_emulation(struct sh_emulate_ctxt *sh_ctxt, > struct cpu_user_regs *regs) > { > +#if CONFIG_HVM > unsigned long addr, diff; > > ASSERT(is_hvm_vcpu(current)); > @@ -451,6 +459,9 @@ void shadow_continue_emulation(struct sh_emulate_ctxt > *sh_ctxt, > ? sizeof(sh_ctxt->insn_buf) : 0; > sh_ctxt->insn_buf_eip = regs->rip; > } > +#else > + BUG(); > +#endif > } > > > @@ -1685,6 +1696,7 @@ static unsigned int shadow_get_allocation(struct domain > *d) > + ((pg & ((1 << (20 - PAGE_SHIFT)) - 1)) ? 1 : 0)); > } > > +#if CONFIG_HVM > /**************************************************************************/ > /* Handling guest writes to pagetables. */ > > @@ -1957,6 +1969,7 @@ static void sh_emulate_unmap_dest(struct vcpu *v, void > *addr, > > atomic_inc(&v->domain->arch.paging.shadow.gtable_dirty_version); > } > +#endif > > /**************************************************************************/ > /* Hash table for storing the guest->shadow mappings. > @@ -2723,12 +2736,13 @@ static int sh_remove_all_mappings(struct domain *d, > mfn_t gmfn, gfn_t gfn) > && (page->count_info & PGC_count_mask) <= 3 > && ((page->u.inuse.type_info & PGT_count_mask) > == (is_xen_heap_page(page) || > - is_ioreq_server_page(d, page)))) ) > + (is_hvm_domain(d) && is_ioreq_server_page(d, > page))))) ) Isn't this a separate bugfix? is_ioreq_server_page shouldn't be called for PV domains at all (same below). > { > SHADOW_ERROR("can't find all mappings of mfn %lx (gfn %lx): " > "c=%lx t=%lx x=%d i=%d\n", mfn_x(gmfn), gfn_x(gfn), > page->count_info, page->u.inuse.type_info, > - !!is_xen_heap_page(page), is_ioreq_server_page(d, > page)); > + !!is_xen_heap_page(page), > + is_hvm_domain(d) && is_ioreq_server_page(d, page)); > } > } > > diff --git a/xen/arch/x86/mm/shadow/multi.c b/xen/arch/x86/mm/shadow/multi.c > index 021ae25..ff7a20c 100644 > --- a/xen/arch/x86/mm/shadow/multi.c > +++ b/xen/arch/x86/mm/shadow/multi.c > @@ -2926,18 +2926,25 @@ static int sh_page_fault(struct vcpu *v, > } > else > { > +#if CONFIG_HVM > /* Magic MMIO marker: extract gfn for MMIO address */ > ASSERT(sh_l1e_is_mmio(sl1e)); > + ASSERT(is_hvm_vcpu(v)); > gpa = (((paddr_t)(gfn_x(sh_l1e_mmio_get_gfn(sl1e)))) > << PAGE_SHIFT) > | (va & ~PAGE_MASK); > + perfc_incr(shadow_fault_fast_mmio); > + SHADOW_PRINTK("fast path mmio %#"PRIpaddr"\n", gpa); > + sh_reset_early_unshadow(v); > + trace_shadow_gen(TRC_SHADOW_FAST_MMIO, va); > + return handle_mmio_with_translation(va, gpa >> PAGE_SHIFT, > + access) > + ? EXCRET_fault_fixed : 0; Could you align the '?' to 'handle'. Thanks, Roger. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |