WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

Re: [Xen-devel] [PATCH]ACPI: re-enable mwait for xen cpuidle

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<gang.wei@xxxxxxxxx>

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;


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel