|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 25/34] 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>
---
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();
+ 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))))) )
{
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;
+#else
+ /* When HVM is not enabled, there shouldn't be MMIO marker */
+ BUG();
+#endif
}
- 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);
}
else
{
@@ -3381,8 +3388,10 @@ static int sh_page_fault(struct vcpu *v,
r = x86_emulate(&emul_ctxt.ctxt, emul_ops);
+#if 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 +3413,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 +3523,8 @@ static int sh_page_fault(struct vcpu *v,
mmio:
if ( !guest_mode(regs) )
goto not_a_shadow_fault;
+#if 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 +3535,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);
--
git-series 0.9.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |