From: Andrew Cooper Date: Tue, 5 Nov 2013 15:21:51 +0000 (+0100) Subject: x86: command line parameter to disable ARAT X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~6063 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=6f366e276264f61b752d9eea63c42021b8fffec6;p=xen.git x86: command line parameter to disable ARAT Signed-off-by: Andrew Cooper --- diff --git a/docs/misc/xen-command-line.markdown b/docs/misc/xen-command-line.markdown index dc724738dd..15aa4040b7 100644 --- a/docs/misc/xen-command-line.markdown +++ b/docs/misc/xen-command-line.markdown @@ -155,6 +155,15 @@ to boot on systems with the following errata: Increase the verbosity of the APIC code from the default value. +### arat +> `= ` + +> Default: `true` + +Permit Xen to use "Always Running APIC Timer" support on compatible hardware +in combination with cpuidle. This option is only expected to be useful for +developers wishing Xen to fall back to older timing methods on newer hardware. + ### ats > `= ` diff --git a/xen/arch/x86/cpu/amd.c b/xen/arch/x86/cpu/amd.c index 27b7f71d8b..472df680c8 100644 --- a/xen/arch/x86/cpu/amd.c +++ b/xen/arch/x86/cpu/amd.c @@ -502,7 +502,7 @@ static void __devinit init_amd(struct cpuinfo_x86 *c) * Family 0x12 and above processors have APIC timer * running in deep C states. */ - if (c->x86 > 0x11) + if ( opt_arat && c->x86 > 0x11 ) set_bit(X86_FEATURE_ARAT, c->x86_capability); /* diff --git a/xen/arch/x86/cpu/common.c b/xen/arch/x86/cpu/common.c index e1220e658c..32ca458303 100644 --- a/xen/arch/x86/cpu/common.c +++ b/xen/arch/x86/cpu/common.c @@ -18,6 +18,9 @@ static bool_t __cpuinitdata use_xsave = 1; boolean_param("xsave", use_xsave); +bool_t __devinitdata opt_arat = 1; +boolean_param("arat", opt_arat); + unsigned int __devinitdata opt_cpuid_mask_ecx = ~0u; integer_param("cpuid_mask_ecx", opt_cpuid_mask_ecx); unsigned int __devinitdata opt_cpuid_mask_edx = ~0u; diff --git a/xen/arch/x86/cpu/cpu.h b/xen/arch/x86/cpu/cpu.h index 72c41ca808..a7b7421079 100644 --- a/xen/arch/x86/cpu/cpu.h +++ b/xen/arch/x86/cpu/cpu.h @@ -11,6 +11,7 @@ struct cpu_dev { extern struct cpu_dev * cpu_devs [X86_VENDOR_NUM]; +extern bool_t opt_arat; extern unsigned int opt_cpuid_mask_ecx, opt_cpuid_mask_edx; extern unsigned int opt_cpuid_mask_xsave_eax; extern unsigned int opt_cpuid_mask_ext_ecx, opt_cpuid_mask_ext_edx; diff --git a/xen/arch/x86/cpu/intel.c b/xen/arch/x86/cpu/intel.c index 31b69c955c..e85521109c 100644 --- a/xen/arch/x86/cpu/intel.c +++ b/xen/arch/x86/cpu/intel.c @@ -226,8 +226,9 @@ static void __devinit init_intel(struct cpuinfo_x86 *c) set_bit(X86_FEATURE_NONSTOP_TSC, c->x86_capability); set_bit(X86_FEATURE_TSC_RELIABLE, c->x86_capability); } - if ((c->cpuid_level >= 0x00000006) && - (cpuid_eax(0x00000006) & (1u<<2))) + if ( opt_arat && + ( c->cpuid_level >= 0x00000006 ) && + ( cpuid_eax(0x00000006) & (1u<<2) ) ) set_bit(X86_FEATURE_ARAT, c->x86_capability); }