diff --git a/xen/arch/x86/mm/shadow/multi.c b/xen/arch/x86/mm/shadow/multi.c index 99e410d999..c129b8103e 100644 --- a/xen/arch/x86/mm/shadow/multi.c +++ b/xen/arch/x86/mm/shadow/multi.c @@ -3854,6 +3854,7 @@ sh_set_toplevel_shadow(struct vcpu *v, /* Now figure out the new contents: is this a valid guest MFN? */ if ( !mfn_valid(gmfn) ) { + ASSERT(mfn_eq(gmfn, INVALID_MFN)); new_entry = pagetable_null(); goto install_new_entry; } @@ -4007,6 +4008,11 @@ sh_update_cr3(struct vcpu *v, int do_locking, bool noflush) if ( sh_remove_write_access(d, gmfn, 2, 0) != 0 ) guest_flush_tlb_mask(d, d->dirty_cpumask); sh_set_toplevel_shadow(v, 0, gmfn, SH_type_l2_shadow); + if ( unlikely(pagetable_is_null(v->arch.shadow_table[0])) ) + { + ASSERT(d->is_dying || d->is_shutting_down); + return; + } #elif GUEST_PAGING_LEVELS == 3 /* PAE guests have four shadow_table entries, based on the * current values of the guest's four l3es. */ @@ -4052,6 +4058,11 @@ sh_update_cr3(struct vcpu *v, int do_locking, bool noflush) if ( sh_remove_write_access(d, gmfn, 4, 0) != 0 ) guest_flush_tlb_mask(d, d->dirty_cpumask); sh_set_toplevel_shadow(v, 0, gmfn, SH_type_l4_shadow); + if ( unlikely(pagetable_is_null(v->arch.shadow_table[0])) ) + { + ASSERT(d->is_dying || d->is_shutting_down); + return; + } if ( !shadow_mode_external(d) && !is_pv_32bit_domain(d) ) { mfn_t smfn = pagetable_get_mfn(v->arch.shadow_table[0]);