# HG changeset patch # User Sheng Yang # Date 1253081544 -28800 # Node ID f92ed10b9522a4dd83a5e31f7f1a8c83bd33d70d # Parent e5d904a6c9e6e585ec02124dc8b6592f525ef6ba Add user controlled cpuid 0x40000002.edx So that user can turn on/off hybrid feature through configuration file. diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -659,6 +659,7 @@ struct domain *d = current->domain; /* Optionally shift out of the way of Viridian architectural leaves. */ uint32_t base = is_viridian_domain(d) ? 0x40000100 : 0x40000000; + unsigned int tmp_eax, tmp_ebx, tmp_ecx, tmp_edx; idx -= base; if ( idx > 2 ) @@ -689,6 +690,14 @@ *edx = 0; /* Features 2 */ if ( !is_hvm_vcpu(current) ) *ecx |= XEN_CPUID_FEAT1_MMU_PT_UPDATE_PRESERVE_AD; + + /* Check if additional feature specified, e.g. Hybrid */ + if ( !is_viridian_domain(d) ) { + domain_cpuid(d, 0x40000002, 0, + &tmp_eax, &tmp_ebx, &tmp_ecx, &tmp_edx); + if (tmp_edx != 0) + *edx = tmp_edx & XEN_CPUID_FEAT2_MASK; + } break; default: diff --git a/xen/include/public/arch-x86/cpuid.h b/xen/include/public/arch-x86/cpuid.h --- a/xen/include/public/arch-x86/cpuid.h +++ b/xen/include/public/arch-x86/cpuid.h @@ -65,4 +65,7 @@ #define _XEN_CPUID_FEAT1_MMU_PT_UPDATE_PRESERVE_AD 0 #define XEN_CPUID_FEAT1_MMU_PT_UPDATE_PRESERVE_AD (1u<<0) +/* Mask unsupported CPUID specified by user */ +#define XEN_CPUID_FEAT2_MASK 0x0ul + #endif /* __XEN_PUBLIC_ARCH_X86_CPUID_H__ */