]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.25/patches.arch/x86-vmware-tsc-07-DMI-product-serial-key
Updated xen patches taken from suse.
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.25 / patches.arch / x86-vmware-tsc-07-DMI-product-serial-key
diff --git a/src/patches/suse-2.6.27.25/patches.arch/x86-vmware-tsc-07-DMI-product-serial-key b/src/patches/suse-2.6.27.25/patches.arch/x86-vmware-tsc-07-DMI-product-serial-key
new file mode 100644 (file)
index 0000000..b22aea7
--- /dev/null
@@ -0,0 +1,94 @@
+From: Alok Kataria <akataria@vmware.com>
+Subject: x86: vmware: look for DMI string in the product serial key
+Patch-mainline: 
+References: bnc#441338
+
+Impact: Should permit VMware detection on older platforms where the
+vendor is changed.  Could theoretically cause a regression if some
+weird serial number scheme contains the string "VMware" by pure
+chance.  Seems unlikely, especially with the mixed case.
+
+In some user configured cases, VMware may choose not to put a VMware specific
+DMI string, but the product serial key is always there and is VMware specific.
+Add a interface to check the serial key, when checking for VMware in the DMI
+information.
+
+Signed-off-by: Alok N Kataria <akataria@vmware.com>
+Signed-off-by: H. Peter Anvin <hpa@zytor.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+
+---
+
+ arch/x86/kernel/cpu/vmware.c |    7 ++++++-
+ drivers/firmware/dmi_scan.c  |   11 +++++++++++
+ include/linux/dmi.h          |    2 ++
+ 3 files changed, 19 insertions(+), 1 deletions(-)
+
+
+diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c
+index a0905ec..c034bda 100644
+--- a/arch/x86/kernel/cpu/vmware.c
++++ b/arch/x86/kernel/cpu/vmware.c
+@@ -61,6 +61,11 @@ static unsigned long __vmware_get_tsc_khz(void)
+         return tsc_hz;
+ }
++/*
++ * While checking the dmi string infomation, just checking the product
++ * serial key should be enough, as this will always have a VMware
++ * specific string when running under VMware hypervisor.
++ */
+ int vmware_platform(void)
+ {
+       if (cpu_has_hypervisor) {
+@@ -74,7 +79,7 @@ int vmware_platform(void)
+               hyper_vendor_id[12] = '\0';
+               if (!strcmp(hyper_vendor_id, "VMwareVMware"))
+                       return 1;
+-      } else if (dmi_available && dmi_name_in_vendors("VMware") &&
++      } else if (dmi_available && dmi_name_in_serial("VMware") &&
+                  __vmware_platform())
+               return 1;
+diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c
+index 455575b..4dd780c 100644
+--- a/drivers/firmware/dmi_scan.c
++++ b/drivers/firmware/dmi_scan.c
+@@ -457,6 +457,17 @@ const char *dmi_get_system_info(int field)
+ }
+ EXPORT_SYMBOL(dmi_get_system_info);
++/**
++ *    dmi_name_in_serial -    Check if string is in the DMI product serial
++ *                            information.
++ */
++int dmi_name_in_serial(const char *str)
++{
++      int f = DMI_PRODUCT_SERIAL;
++      if (dmi_ident[f] && strstr(dmi_ident[f], str))
++              return 1;
++      return 0;
++}
+ /**
+  *    dmi_name_in_vendors - Check if string is anywhere in the DMI vendor information.
+diff --git a/include/linux/dmi.h b/include/linux/dmi.h
+index 2a063b6..098e292 100644
+--- a/include/linux/dmi.h
++++ b/include/linux/dmi.h
+@@ -81,6 +81,7 @@ extern const struct dmi_device * dmi_find_device(int type, const char *name,
+ extern void dmi_scan_machine(void);
+ extern int dmi_get_year(int field);
+ extern int dmi_name_in_vendors(const char *str);
++extern int dmi_name_in_serial(const char *str);
+ extern int dmi_available;
+ extern int dmi_walk(void (*decode)(const struct dmi_header *));
+@@ -93,6 +94,7 @@ static inline const struct dmi_device * dmi_find_device(int type, const char *na
+ static inline void dmi_scan_machine(void) { return; }
+ static inline int dmi_get_year(int year) { return 0; }
+ static inline int dmi_name_in_vendors(const char *s) { return 0; }
++static inline int dmi_name_in_serial(const char *s) { return 0; }
+ #define dmi_available 0
+ static inline int dmi_walk(void (*decode)(const struct dmi_header *))
+       { return -1; }