diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2010-05-06 12:57:37 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-05-06 12:57:37 -0700 |
commit | 3543e24d0544794768dc532bd23dab5c7015ab83 (patch) | |
tree | 260813f4c7cef357192075d485220f8d0d126f94 | |
parent | 3ff5170a82aa40c0484ea333d0f8aebc6ca753c6 (diff) | |
download | patches-3543e24d0544794768dc532bd23dab5c7015ab83.tar.gz |
hyperv work in pending
-rw-r--r-- | pending/x86-detect-running-on-a-hyperv-system.patch | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/pending/x86-detect-running-on-a-hyperv-system.patch b/pending/x86-detect-running-on-a-hyperv-system.patch new file mode 100644 index 00000000000000..15282ab5104343 --- /dev/null +++ b/pending/x86-detect-running-on-a-hyperv-system.patch @@ -0,0 +1,208 @@ +From ksrinivasan@novell.com Wed Apr 28 13:36:10 2010 +From: Ky Srinivasan <ksrinivasan@novell.com> +Date: Wed, 28 Apr 2010 14:36:05 -0600 +Subject: x86: detect running on a HyperV system +To: <devel@driverdev.osuosl.org> +Cc: "Haiyang Zhang" <haiyangz@microsoft.com>, "Hank Janssen" <hjanssen@microsoft.com>, "Greg KH" <gregkh@suse.de> +Message-ID: <4BD857BE.E57C.0030.1@novell.com> + +From: Ky Srinivasan <ksrinivasan@novell.com> + +This patch integrates HyperV detection within the framework currently used by +VmWare. With this patch, we can avoid having to replicate the HyperV detection +code in each of the HyperV specific Linux drivers - MSFT Linux Integration +Components. + +Signed-off-by: K. Y. Srinivasan <ksrinivasan@novell.com> +Cc: Thomas Gleixner <tglx@linutronix.de> +Cc: Ingo Molnar <mingo@redhat.com> +Cc: "H. Peter Anvin" <hpa@zytor.com> +Cc: Vadim Rozenfeld <vrozenfe@redhat.com> +Cc: Avi Kivity <avi@redhat.com> +Cc: Gleb Natapov <gleb@redhat.com> +Cc: Frederic Weisbecker <fweisbec@gmail.com> +Cc: Alexey Dobriyan <adobriyan@gmail.com> +Cc: "K.Prasad" <prasad@linux.vnet.ibm.com> +Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> +Cc: Stephane Eranian <eranian@google.com> +Cc: Paul Mackerras <paulus@samba.org> +Cc: Alan Cox <alan@linux.intel.com> +Cc: Haiyang Zhang <haiyangz@microsoft.com> +Cc: Hank Janssen <hjanssen@microsoft.com> +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +--- + arch/x86/include/asm/hyperv.h | 6 +++ + arch/x86/include/asm/mshyperv.h | 7 ++++ + arch/x86/include/asm/processor.h | 3 + + arch/x86/kernel/cpu/Makefile | 2 - + arch/x86/kernel/cpu/hypervisor.c | 10 ++++- + arch/x86/kernel/cpu/mshyperv.c | 67 +++++++++++++++++++++++++++++++++++++++ + 6 files changed, 91 insertions(+), 4 deletions(-) + +--- a/arch/x86/include/asm/hyperv.h ++++ b/arch/x86/include/asm/hyperv.h +@@ -14,6 +14,9 @@ + #define HYPERV_CPUID_ENLIGHTMENT_INFO 0x40000004 + #define HYPERV_CPUID_IMPLEMENT_LIMITS 0x40000005 + ++#define HYPERV_HYPERVISOR_PRESENT_BIT 0x80000000 ++#define HYPERV_CPUID_MIN 0x40000005 ++ + /* + * Feature identification. EAX indicates which features are available + * to the partition based upon the current partition privileges. +@@ -129,6 +132,9 @@ + /* MSR used to provide vcpu index */ + #define HV_X64_MSR_VP_INDEX 0x40000002 + ++/* MSR used to read the per-partition time reference counter */ ++#define HV_X64_MSR_TIME_REF_COUNT 0x40000020 ++ + /* Define the virtual APIC registers */ + #define HV_X64_MSR_EOI 0x40000070 + #define HV_X64_MSR_ICR 0x40000071 +--- /dev/null ++++ b/arch/x86/include/asm/mshyperv.h +@@ -0,0 +1,7 @@ ++#ifndef ASM_X86__MSHYPER_H ++#define ASM_X86__MSHYPER_H ++ ++int ms_hyperv_platform(void); ++void __cpuinit ms_hyperv_set_feature_bits(struct cpuinfo_x86 *c); ++ ++#endif +--- a/arch/x86/include/asm/processor.h ++++ b/arch/x86/include/asm/processor.h +@@ -114,6 +114,8 @@ struct cpuinfo_x86 { + u16 cpu_index; + #endif + unsigned int x86_hyper_vendor; ++ /* The layout of this field is hypervisor specific */ ++ unsigned int x86_hyper_features; + } __attribute__((__aligned__(SMP_CACHE_BYTES))); + + #define X86_VENDOR_INTEL 0 +@@ -129,6 +131,7 @@ struct cpuinfo_x86 { + + #define X86_HYPER_VENDOR_NONE 0 + #define X86_HYPER_VENDOR_VMWARE 1 ++#define X86_HYPER_VENDOR_MSFT 2 + + /* + * capabilities of CPUs +--- a/arch/x86/kernel/cpu/Makefile ++++ b/arch/x86/kernel/cpu/Makefile +@@ -14,7 +14,7 @@ CFLAGS_common.o := $(nostackp) + + obj-y := intel_cacheinfo.o addon_cpuid_features.o + obj-y += proc.o capflags.o powerflags.o common.o +-obj-y += vmware.o hypervisor.o sched.o ++obj-y += vmware.o hypervisor.o sched.o mshyperv.o + + obj-$(CONFIG_X86_32) += bugs.o cmpxchg.o + obj-$(CONFIG_X86_64) += bugs_64.o +--- a/arch/x86/kernel/cpu/hypervisor.c ++++ b/arch/x86/kernel/cpu/hypervisor.c +@@ -23,6 +23,7 @@ + + #include <asm/processor.h> + #include <asm/vmware.h> ++#include <asm/mshyperv.h> + #include <asm/hypervisor.h> + + static inline void __cpuinit +@@ -30,6 +31,8 @@ detect_hypervisor_vendor(struct cpuinfo_ + { + if (vmware_platform()) + c->x86_hyper_vendor = X86_HYPER_VENDOR_VMWARE; ++ else if (ms_hyperv_platform()) ++ c->x86_hyper_vendor = X86_HYPER_VENDOR_MSFT; + else + c->x86_hyper_vendor = X86_HYPER_VENDOR_NONE; + } +@@ -37,10 +40,11 @@ detect_hypervisor_vendor(struct cpuinfo_ + static inline void __cpuinit + hypervisor_set_feature_bits(struct cpuinfo_x86 *c) + { +- if (boot_cpu_data.x86_hyper_vendor == X86_HYPER_VENDOR_VMWARE) { ++ if (boot_cpu_data.x86_hyper_vendor == X86_HYPER_VENDOR_VMWARE) + vmware_set_feature_bits(c); +- return; +- } ++ else if (boot_cpu_data.x86_hyper_vendor == X86_HYPER_VENDOR_MSFT) ++ ms_hyperv_set_feature_bits(c); ++ return; + } + + void __cpuinit init_hypervisor(struct cpuinfo_x86 *c) +--- /dev/null ++++ b/arch/x86/kernel/cpu/mshyperv.c +@@ -0,0 +1,67 @@ ++/* ++ * HyperV Detection code. ++ * ++ * Copyright (C) 2010, Novell, Inc. ++ * Author : K. Y. Srinivasan <ksrinivasan@novell.com> ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or ++ * NON INFRINGEMENT. See the GNU General Public License for more ++ * details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ */ ++ ++#include <linux/types.h> ++#include <asm/processor.h> ++#include <asm/hyperv.h> ++#include <asm/mshyperv.h> ++ ++ ++int ms_hyperv_platform(void) ++{ ++ u32 eax, ebx, ecx, edx; ++ char hyp_signature[13]; ++ ++ cpuid(1, &eax, &ebx, &ecx, &edx); ++ if (!(ecx & HYPERV_HYPERVISOR_PRESENT_BIT)) ++ return 0; ++ ++ cpuid(HYPERV_CPUID_VENDOR_AND_MAX_FUNCTIONS, &eax, &ebx, &ecx, &edx); ++ *(u32 *)(hyp_signature + 0) = ebx; ++ *(u32 *)(hyp_signature + 4) = ecx; ++ *(u32 *)(hyp_signature + 8) = edx; ++ ++ if ((eax < HYPERV_CPUID_MIN) || (memcmp("Microsoft Hv", hyp_signature, 12))) ++ return 0; ++ return 1; ++} ++ ++void __cpuinit ms_hyperv_set_feature_bits(struct cpuinfo_x86 *c) ++{ ++ u32 eax, ebx, ecx, edx; ++ ++ c->x86_hyper_features = 0; ++ /* ++ * Extract the features, recommendations etc. ++ * The first 9 bits will be used to track hypervisor features. ++ * The next 6 bits will be used to track the hypervisor ++ * recommendations. ++ */ ++ cpuid(HYPERV_CPUID_FEATURES, &eax, &ebx, &ecx, &edx); ++ c->x86_hyper_features |= (eax & 0x1ff); ++ ++ cpuid(HYPERV_CPUID_ENLIGHTMENT_INFO, &eax, &ebx, &ecx, &edx); ++ c->x86_hyper_features |= ((eax & 0x3f) << 9); ++ printk(KERN_INFO "Detected HyperV with features: %x\n", ++ c->x86_hyper_features); ++} |