static void sh_update_paging_modes(struct vcpu *v)
{
struct domain *d = v->domain;
- const struct paging_mode *old_mode = v->arch.paging.mode;
ASSERT(paging_locked_by_me(d));
if ( v->arch.paging.mode )
v->arch.paging.mode->shadow.detach_old_tables(v);
+#ifdef CONFIG_HVM
if ( !is_pv_domain(d) )
{
- ///
- /// HVM guest
- ///
+ const struct paging_mode *old_mode = v->arch.paging.mode;
+
ASSERT(shadow_mode_translate(d));
ASSERT(shadow_mode_external(d));
// different values for CR4.PSE and CR4.PGE at the same time.
// This *does* happen, at least for CR4.PGE...
}
+#endif /* CONFIG_HVM */
#if (SHADOW_OPTIMIZATIONS & SHOPT_OUT_OF_SYNC)
/* We need to check that all the vcpus have paging enabled to
* Should only be called for dying domains. */
{
struct vcpu *v;
- mfn_t mfn;
struct page_info *unpaged_pagetable = NULL;
ASSERT(d->is_dying);
if ( v->arch.paging.mode )
{
v->arch.paging.mode->shadow.detach_old_tables(v);
+#ifdef CONFIG_HVM
if ( shadow_mode_external(d) )
{
- mfn = pagetable_get_mfn(v->arch.monitor_table);
+ mfn_t mfn = pagetable_get_mfn(v->arch.monitor_table);
+
if ( mfn_valid(mfn) && (mfn_x(mfn) != 0) )
v->arch.paging.mode->shadow.destroy_monitor_table(v, mfn);
v->arch.monitor_table = pagetable_null();
}
+#endif /* CONFIG_HVM */
}
}
}
}
-#if SHADOW_PAGING_LEVELS == GUEST_PAGING_LEVELS
+#if SHADOW_PAGING_LEVELS == GUEST_PAGING_LEVELS && defined(CONFIG_HVM)
mfn_t
sh_make_monitor_table(struct vcpu *v)
{
shadow_free(d, smfn);
}
-#if SHADOW_PAGING_LEVELS == GUEST_PAGING_LEVELS
+#if SHADOW_PAGING_LEVELS == GUEST_PAGING_LEVELS && defined(CONFIG_HVM)
void sh_destroy_monitor_table(struct vcpu *v, mfn_t mmfn)
{
struct domain *d = v->domain;
.shadow.write_guest_entry = sh_write_guest_entry,
.shadow.cmpxchg_guest_entry = sh_cmpxchg_guest_entry,
#endif
+#ifdef CONFIG_HVM
.shadow.make_monitor_table = sh_make_monitor_table,
.shadow.destroy_monitor_table = sh_destroy_monitor_table,
+#endif
#if SHADOW_OPTIMIZATIONS & SHOPT_WRITABLE_HEURISTIC
.shadow.guess_wrmap = sh_guess_wrmap,
#endif
intpte_t *old, intpte_t new,
mfn_t gmfn);
#endif
+#ifdef CONFIG_HVM
mfn_t (*make_monitor_table )(struct vcpu *v);
void (*destroy_monitor_table )(struct vcpu *v, mfn_t mmfn);
+#endif
int (*guess_wrmap )(struct vcpu *v,
unsigned long vaddr, mfn_t gmfn);
void (*pagetable_dying )(paddr_t gpa);