From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jeremy Fitzhardinge Subject: Re: [PATCH]ACPI: re-enable mwait for xen cpuidle Date: Fri, 02 Apr 2010 11:33:01 -0700 Message-ID: <4BB6385D.4090404@goop.org> References: <4BB58353.5000008@goop.org> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: "Wei, Gang" Cc: "xen-devel@lists.xensource.com" , Keir Fraser , "Yu, Ke" List-Id: xen-devel@lists.xenproject.org On 04/02/2010 09:27 AM, Wei, Gang wrote: > Updated the 2nd patch, only set MWAIT feature for dom0. > > Jimmy > > ACPI: re-enable mwait for xen cpuidle > > Xen hypervisor doesn't export mwait feature to dom0, but latest Linux kernel start to check this feature while initializing _PDC object. Modify xen_cpuid to re-enable mwait for xen cpuidle. > What if the CPU really doesn't have MWAIT? But I agree with your original assessment that setting MWAIT just to get a couple of paths in ACPI parsing enabled is probably overkill, but I don't like the idea of putting xen-specific tests into the acpi code. Would it be possible to change the parser code to parse unconditionally and then ignore the MWAIT-specific stuff later on? (I haven't looked at the structure of the code, so I'm not sure if this suggestion even makes sense.) J > Signed-off-by: Wei Gang > > diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c > index c3e8bff..82f3826 100644 > --- a/arch/x86/xen/enlighten.c > +++ b/arch/x86/xen/enlighten.c > @@ -182,6 +182,9 @@ static void __init xen_banner(void) > static __read_mostly unsigned int cpuid_leaf1_edx_mask = ~0; > static __read_mostly unsigned int cpuid_leaf1_ecx_mask = ~0; > static __read_mostly unsigned int cpuid_leaf81_edx_mask = ~0; > +static __read_mostly unsigned int cpuid_leaf1_ecx_set; > +static __read_mostly unsigned int cpuid_leaf5_ecx_set; > +static __read_mostly unsigned int cpuid_leaf5_edx_set; > > static void xen_cpuid(unsigned int *ax, unsigned int *bx, > unsigned int *cx, unsigned int *dx) > @@ -189,6 +192,8 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx, > unsigned maskebx = ~0; > unsigned maskecx = ~0; > unsigned maskedx = ~0; > + unsigned setecx = 0; > + unsigned setedx = 0; > > /* > * Mask out inconvenient features, to try and disable as many > @@ -198,6 +203,12 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx, > case 0x1: > maskecx = cpuid_leaf1_ecx_mask; > maskedx = cpuid_leaf1_edx_mask; > + setecx = cpuid_leaf1_ecx_set; > + break; > + > + case 0x5: /* MWAIT INFO */ > + setecx = cpuid_leaf5_ecx_set; > + setedx = cpuid_leaf5_edx_set; > break; > > case 0xb: > @@ -220,6 +231,8 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx, > *bx&= maskebx; > *cx&= maskecx; > *dx&= maskedx; > + *cx |= setecx; > + *dx |= setedx; > } > > static __init void xen_init_cpuid_mask(void) > @@ -238,6 +251,11 @@ static __init void xen_init_cpuid_mask(void) > (1<< X86_FEATURE_MCA) | /* disable MCA */ > (1<< X86_FEATURE_APIC) | /* disable local APIC */ > (1<< X86_FEATURE_ACPI)); /* disable ACPI */ > + else { > + cpuid_leaf1_ecx_set = 1<< (X86_FEATURE_MWAIT % 32); > + cpuid_leaf5_ecx_set = 0x3; /* EXTENSIONS_SUPPORTED | INTERRUPT_BREAK */ > + cpuid_leaf5_edx_set = ~0; > + } > > ax = 1; > cx = 0;