[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 03/10] x86/shadow: monitor table is HVM-only
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> --- a/xen/arch/x86/mm/shadow/common.c +++ b/xen/arch/x86/mm/shadow/common.c @@ -2376,7 +2376,6 @@ void sh_reset_l3_up_pointers(struct vcpu 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)); @@ -2421,11 +2420,14 @@ static void sh_update_paging_modes(struc 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)); @@ -2523,6 +2525,7 @@ static void sh_update_paging_modes(struc // 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 @@ -2703,7 +2706,6 @@ void shadow_teardown(struct domain *d, b * Should only be called for dying domains. */ { struct vcpu *v; - mfn_t mfn; struct page_info *unpaged_pagetable = NULL; ASSERT(d->is_dying); @@ -2719,13 +2721,16 @@ void shadow_teardown(struct domain *d, b 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 */ } } } --- a/xen/arch/x86/mm/shadow/multi.c +++ b/xen/arch/x86/mm/shadow/multi.c @@ -1515,7 +1515,7 @@ make_fl1_shadow(struct domain *d, gfn_t } -#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) { @@ -1965,7 +1965,7 @@ void sh_destroy_l1_shadow(struct domain 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; @@ -4881,8 +4881,10 @@ const struct paging_mode sh_paging_mode .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 --- a/xen/include/asm-x86/paging.h +++ b/xen/include/asm-x86/paging.h @@ -102,8 +102,10 @@ struct shadow_paging_mode { 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);
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |