return -EINVAL;
}
- v->arch.flags &= ~TF_kernel_mode;
- if ( (flags & VGCF_in_kernel) || is_hvm_domain(d)/*???*/ )
- v->arch.flags |= TF_kernel_mode;
+ v->arch.flags |= TF_kernel_mode;
+ if ( unlikely(!(flags & VGCF_in_kernel)) &&
+ /*
+ * TF_kernel_mode is only allowed to be clear for 64-bit PV. See
+ * update_cr3(), sh_update_cr3(), sh_walk_guest_tables(), and
+ * shadow_one_bit_disable() for why that is.
+ */
+ !is_hvm_domain(d) && !is_pv_32bit_domain(d) )
+ v->arch.flags &= ~TF_kernel_mode;
v->arch.vgc_flags = flags;
INVALID_MFN, v->arch.paging.shadow.gl3e);
#else /* 32 or 64 */
const struct domain *d = v->domain;
- mfn_t root_mfn = ((v->arch.flags & TF_kernel_mode) || is_pv_32bit_domain(d)
+ mfn_t root_mfn = (v->arch.flags & TF_kernel_mode
? pagetable_get_mfn(v->arch.guest_table)
: pagetable_get_mfn(v->arch.guest_table_user));
void *root_map = map_domain_page(root_mfn);
v, (unsigned long)pagetable_get_pfn(v->arch.guest_table));
#if GUEST_PAGING_LEVELS == 4
- if ( !(v->arch.flags & TF_kernel_mode) && !is_pv_32bit_domain(d) )
+ if ( !(v->arch.flags & TF_kernel_mode) )
gmfn = pagetable_get_mfn(v->arch.guest_table_user);
else
#endif