aboutsummaryrefslogtreecommitdiffstats
path: root/pending
diff options
authorGreg Kroah-Hartman <gregkh@suse.de>2010-05-06 12:57:37 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2010-05-06 12:57:37 -0700
commit3543e24d0544794768dc532bd23dab5c7015ab83 (patch)
tree260813f4c7cef357192075d485220f8d0d126f94 /pending
parent3ff5170a82aa40c0484ea333d0f8aebc6ca753c6 (diff)
downloadpatches-3543e24d0544794768dc532bd23dab5c7015ab83.tar.gz
hyperv work in pending
Diffstat (limited to 'pending')
-rw-r--r--pending/x86-detect-running-on-a-hyperv-system.patch208
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);
++}