]>
Commit | Line | Data |
---|---|---|
2cb7cef9 BS |
1 | From: Alok Kataria <akataria@vmware.com> |
2 | Subject: x86: vmware: look for DMI string in the product serial key | |
3 | Patch-mainline: | |
4 | References: bnc#441338 | |
5 | ||
6 | Impact: Should permit VMware detection on older platforms where the | |
7 | vendor is changed. Could theoretically cause a regression if some | |
8 | weird serial number scheme contains the string "VMware" by pure | |
9 | chance. Seems unlikely, especially with the mixed case. | |
10 | ||
11 | In some user configured cases, VMware may choose not to put a VMware specific | |
12 | DMI string, but the product serial key is always there and is VMware specific. | |
13 | Add a interface to check the serial key, when checking for VMware in the DMI | |
14 | information. | |
15 | ||
16 | Signed-off-by: Alok N Kataria <akataria@vmware.com> | |
17 | Signed-off-by: H. Peter Anvin <hpa@zytor.com> | |
18 | Signed-off-by: Takashi Iwai <tiwai@suse.de> | |
19 | ||
20 | --- | |
21 | ||
22 | arch/x86/kernel/cpu/vmware.c | 7 ++++++- | |
23 | drivers/firmware/dmi_scan.c | 11 +++++++++++ | |
24 | include/linux/dmi.h | 2 ++ | |
25 | 3 files changed, 19 insertions(+), 1 deletions(-) | |
26 | ||
27 | ||
28 | diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c | |
29 | index a0905ec..c034bda 100644 | |
30 | --- a/arch/x86/kernel/cpu/vmware.c | |
31 | +++ b/arch/x86/kernel/cpu/vmware.c | |
32 | @@ -61,6 +61,11 @@ static unsigned long __vmware_get_tsc_khz(void) | |
33 | return tsc_hz; | |
34 | } | |
35 | ||
36 | +/* | |
37 | + * While checking the dmi string infomation, just checking the product | |
38 | + * serial key should be enough, as this will always have a VMware | |
39 | + * specific string when running under VMware hypervisor. | |
40 | + */ | |
41 | int vmware_platform(void) | |
42 | { | |
43 | if (cpu_has_hypervisor) { | |
44 | @@ -74,7 +79,7 @@ int vmware_platform(void) | |
45 | hyper_vendor_id[12] = '\0'; | |
46 | if (!strcmp(hyper_vendor_id, "VMwareVMware")) | |
47 | return 1; | |
48 | - } else if (dmi_available && dmi_name_in_vendors("VMware") && | |
49 | + } else if (dmi_available && dmi_name_in_serial("VMware") && | |
50 | __vmware_platform()) | |
51 | return 1; | |
52 | ||
53 | diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c | |
54 | index 455575b..4dd780c 100644 | |
55 | --- a/drivers/firmware/dmi_scan.c | |
56 | +++ b/drivers/firmware/dmi_scan.c | |
57 | @@ -457,6 +457,17 @@ const char *dmi_get_system_info(int field) | |
58 | } | |
59 | EXPORT_SYMBOL(dmi_get_system_info); | |
60 | ||
61 | +/** | |
62 | + * dmi_name_in_serial - Check if string is in the DMI product serial | |
63 | + * information. | |
64 | + */ | |
65 | +int dmi_name_in_serial(const char *str) | |
66 | +{ | |
67 | + int f = DMI_PRODUCT_SERIAL; | |
68 | + if (dmi_ident[f] && strstr(dmi_ident[f], str)) | |
69 | + return 1; | |
70 | + return 0; | |
71 | +} | |
72 | ||
73 | /** | |
74 | * dmi_name_in_vendors - Check if string is anywhere in the DMI vendor information. | |
75 | diff --git a/include/linux/dmi.h b/include/linux/dmi.h | |
76 | index 2a063b6..098e292 100644 | |
77 | --- a/include/linux/dmi.h | |
78 | +++ b/include/linux/dmi.h | |
79 | @@ -81,6 +81,7 @@ extern const struct dmi_device * dmi_find_device(int type, const char *name, | |
80 | extern void dmi_scan_machine(void); | |
81 | extern int dmi_get_year(int field); | |
82 | extern int dmi_name_in_vendors(const char *str); | |
83 | +extern int dmi_name_in_serial(const char *str); | |
84 | extern int dmi_available; | |
85 | extern int dmi_walk(void (*decode)(const struct dmi_header *)); | |
86 | ||
87 | @@ -93,6 +94,7 @@ static inline const struct dmi_device * dmi_find_device(int type, const char *na | |
88 | static inline void dmi_scan_machine(void) { return; } | |
89 | static inline int dmi_get_year(int year) { return 0; } | |
90 | static inline int dmi_name_in_vendors(const char *s) { return 0; } | |
91 | +static inline int dmi_name_in_serial(const char *s) { return 0; } | |
92 | #define dmi_available 0 | |
93 | static inline int dmi_walk(void (*decode)(const struct dmi_header *)) | |
94 | { return -1; } |