x86: don't allow clearing of TF_kernel_mode for other than 64-bit PV The flag is really only meant for those, both HVM and 32-bit PV tell kernel from user mode based on CPL/RPL. Remove the all-question-marks comment and let's be on the safe side here and also suppress clearing for 32-bit PV (this isn't a fast path after all). Signed-off-by: Jan Beulich --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -950,9 +950,15 @@ int arch_set_info_guest( v->fpu_initialised = !!(flags & VGCF_I387_VALID); - 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(), 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;