[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen staging] x86/mm/shadow: make it build with !CONFIG_HVM
commit 29ac2ad612e20904d0e8914e635386b7abe0f656 Author: Wei Liu <wei.liu2@xxxxxxxxxx> AuthorDate: Thu Aug 16 11:05:34 2018 +0100 Commit: Wei Liu <wei.liu2@xxxxxxxxxx> CommitDate: Sun Aug 26 11:01:03 2018 +0100 x86/mm/shadow: make it build with !CONFIG_HVM 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> Reviewed-by: Tim Deegan <tim@xxxxxxx> --- xen/arch/x86/mm/shadow/common.c | 18 ++++++++++++++++-- xen/arch/x86/mm/shadow/multi.c | 30 ++++++++++++++++++++---------- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c index fd42d734e7..b834921f46 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 */ +#ifdef 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) { +#ifdef 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(); + 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) { +#ifdef CONFIG_HVM struct vcpu *v = current; unsigned long addr, diff; @@ -452,6 +460,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 } @@ -1686,6 +1697,7 @@ static unsigned int shadow_get_allocation(struct domain *d) + ((pg & ((1 << (20 - PAGE_SHIFT)) - 1)) ? 1 : 0)); } +#ifdef CONFIG_HVM /**************************************************************************/ /* Handling guest writes to pagetables. */ @@ -1958,6 +1970,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. @@ -2724,12 +2737,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))))) ) { 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 021ae252e4..9e43533f69 100644 --- a/xen/arch/x86/mm/shadow/multi.c +++ b/xen/arch/x86/mm/shadow/multi.c @@ -2924,20 +2924,22 @@ static int sh_page_fault(struct vcpu *v, trace_shadow_gen(TRC_SHADOW_FAST_PROPAGATE, va); return 0; } - else - { - /* Magic MMIO marker: extract gfn for MMIO address */ - ASSERT(sh_l1e_is_mmio(sl1e)); - gpa = (((paddr_t)(gfn_x(sh_l1e_mmio_get_gfn(sl1e)))) - << PAGE_SHIFT) - | (va & ~PAGE_MASK); - } +#ifdef 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); + return handle_mmio_with_translation(va, gpa >> PAGE_SHIFT, access) + ? EXCRET_fault_fixed : 0; +#else + /* When HVM is not enabled, there shouldn't be MMIO marker */ + BUG(); +#endif } else { @@ -3381,8 +3383,10 @@ static int sh_page_fault(struct vcpu *v, r = x86_emulate(&emul_ctxt.ctxt, emul_ops); +#ifdef CONFIG_HVM if ( r == X86EMUL_EXCEPTION ) { + ASSERT(is_hvm_domain(d)); /* * This emulation covers writes to shadow pagetables. We tolerate #PF * (from accesses spanning pages, concurrent paging updated from @@ -3404,6 +3408,7 @@ static int sh_page_fault(struct vcpu *v, r = X86EMUL_UNHANDLEABLE; } } +#endif /* * NB. We do not unshadow on X86EMUL_EXCEPTION. It's not clear that it @@ -3513,6 +3518,8 @@ static int sh_page_fault(struct vcpu *v, mmio: if ( !guest_mode(regs) ) goto not_a_shadow_fault; +#ifdef CONFIG_HVM + ASSERT(is_hvm_vcpu(v)); perfc_incr(shadow_fault_mmio); sh_audit_gw(v, &gw); SHADOW_PRINTK("mmio %#"PRIpaddr"\n", gpa); @@ -3523,6 +3530,9 @@ static int sh_page_fault(struct vcpu *v, trace_shadow_gen(TRC_SHADOW_MMIO, va); return (handle_mmio_with_translation(va, gpa >> PAGE_SHIFT, access) ? EXCRET_fault_fixed : 0); +#else + BUG(); +#endif not_a_shadow_fault: sh_audit_gw(v, &gw); -- generated by git-patchbot for /home/xen/git/xen.git#staging _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |