| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302 |
- From fdde3f3305d4d393f39514cc098d1c4c2dd5634a Mon Sep 17 00:00:00 2001
- From: Juergen Gross <[email protected]>
- Date: Thu, 9 Nov 2017 14:27:36 +0100
- Subject: [PATCH 119/232] x86/virt: Add enum for hypervisors to replace
- x86_hyper
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- CVE-2017-5754
- The x86_hyper pointer is only used for checking whether a virtual
- device is supporting the hypervisor the system is running on.
- Use an enum for that purpose instead and drop the x86_hyper pointer.
- Signed-off-by: Juergen Gross <[email protected]>
- Acked-by: Thomas Gleixner <[email protected]>
- Acked-by: Xavier Deguillard <[email protected]>
- Cc: Linus Torvalds <[email protected]>
- Cc: Peter Zijlstra <[email protected]>
- Cc: [email protected]
- Cc: [email protected]
- Cc: [email protected]
- Cc: [email protected]
- Cc: [email protected]
- Cc: [email protected]
- Cc: [email protected]
- Cc: [email protected]
- Cc: [email protected]
- Cc: [email protected]
- Cc: [email protected]
- Cc: [email protected]
- Cc: [email protected]
- Cc: [email protected]
- Cc: [email protected]
- Cc: [email protected]
- Cc: [email protected]
- Cc: [email protected]
- Link: http://lkml.kernel.org/r/[email protected]
- Signed-off-by: Ingo Molnar <[email protected]>
- (backported from commit 03b2a320b19f1424e9ac9c21696be9c60b6d0d93)
- Signed-off-by: Andy Whitcroft <[email protected]>
- Signed-off-by: Kleber Sacilotto de Souza <[email protected]>
- (cherry picked from commit c24b0a226fadfe1abe78fa568ff84fea6ecd7ca5)
- Signed-off-by: Fabian Grünbichler <[email protected]>
- ---
- arch/x86/include/asm/hypervisor.h | 23 ++++++++++++++---------
- arch/x86/hyperv/hv_init.c | 2 +-
- arch/x86/kernel/cpu/hypervisor.c | 12 +++++++++---
- arch/x86/kernel/cpu/mshyperv.c | 6 +++---
- arch/x86/kernel/cpu/vmware.c | 4 ++--
- arch/x86/kernel/kvm.c | 4 ++--
- arch/x86/xen/enlighten_hvm.c | 4 ++--
- arch/x86/xen/enlighten_pv.c | 4 ++--
- drivers/hv/vmbus_drv.c | 2 +-
- drivers/input/mouse/vmmouse.c | 10 ++++------
- drivers/misc/vmw_balloon.c | 2 +-
- 11 files changed, 41 insertions(+), 32 deletions(-)
- diff --git a/arch/x86/include/asm/hypervisor.h b/arch/x86/include/asm/hypervisor.h
- index 0eca7239a7aa..1b0a5abcd8ae 100644
- --- a/arch/x86/include/asm/hypervisor.h
- +++ b/arch/x86/include/asm/hypervisor.h
- @@ -29,6 +29,16 @@
- /*
- * x86 hypervisor information
- */
- +
- +enum x86_hypervisor_type {
- + X86_HYPER_NATIVE = 0,
- + X86_HYPER_VMWARE,
- + X86_HYPER_MS_HYPERV,
- + X86_HYPER_XEN_PV,
- + X86_HYPER_XEN_HVM,
- + X86_HYPER_KVM,
- +};
- +
- struct hypervisor_x86 {
- /* Hypervisor name */
- const char *name;
- @@ -36,6 +46,9 @@ struct hypervisor_x86 {
- /* Detection routine */
- uint32_t (*detect)(void);
-
- + /* Hypervisor type */
- + enum x86_hypervisor_type type;
- +
- /* init time callbacks */
- struct x86_hyper_init init;
-
- @@ -43,15 +56,7 @@ struct hypervisor_x86 {
- struct x86_hyper_runtime runtime;
- };
-
- -extern const struct hypervisor_x86 *x86_hyper;
- -
- -/* Recognized hypervisors */
- -extern const struct hypervisor_x86 x86_hyper_vmware;
- -extern const struct hypervisor_x86 x86_hyper_ms_hyperv;
- -extern const struct hypervisor_x86 x86_hyper_xen_pv;
- -extern const struct hypervisor_x86 x86_hyper_xen_hvm;
- -extern const struct hypervisor_x86 x86_hyper_kvm;
- -
- +extern enum x86_hypervisor_type x86_hyper_type;
- extern void init_hypervisor_platform(void);
- #else
- static inline void init_hypervisor_platform(void) { }
- diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
- index ec7c9661743f..32fa894139d5 100644
- --- a/arch/x86/hyperv/hv_init.c
- +++ b/arch/x86/hyperv/hv_init.c
- @@ -99,7 +99,7 @@ void hyperv_init(void)
- u64 guest_id;
- union hv_x64_msr_hypercall_contents hypercall_msr;
-
- - if (x86_hyper != &x86_hyper_ms_hyperv)
- + if (x86_hyper_type != X86_HYPER_MS_HYPERV)
- return;
-
- /*
- diff --git a/arch/x86/kernel/cpu/hypervisor.c b/arch/x86/kernel/cpu/hypervisor.c
- index 22226c1bf092..bea8d3e24f50 100644
- --- a/arch/x86/kernel/cpu/hypervisor.c
- +++ b/arch/x86/kernel/cpu/hypervisor.c
- @@ -26,6 +26,12 @@
- #include <asm/processor.h>
- #include <asm/hypervisor.h>
-
- +extern const struct hypervisor_x86 x86_hyper_vmware;
- +extern const struct hypervisor_x86 x86_hyper_ms_hyperv;
- +extern const struct hypervisor_x86 x86_hyper_xen_pv;
- +extern const struct hypervisor_x86 x86_hyper_xen_hvm;
- +extern const struct hypervisor_x86 x86_hyper_kvm;
- +
- static const __initconst struct hypervisor_x86 * const hypervisors[] =
- {
- #ifdef CONFIG_XEN_PV
- @@ -41,8 +47,8 @@ static const __initconst struct hypervisor_x86 * const hypervisors[] =
- #endif
- };
-
- -const struct hypervisor_x86 *x86_hyper;
- -EXPORT_SYMBOL(x86_hyper);
- +enum x86_hypervisor_type x86_hyper_type;
- +EXPORT_SYMBOL(x86_hyper_type);
-
- static inline const struct hypervisor_x86 * __init
- detect_hypervisor_vendor(void)
- @@ -87,6 +93,6 @@ void __init init_hypervisor_platform(void)
- copy_array(&h->init, &x86_init.hyper, sizeof(h->init));
- copy_array(&h->runtime, &x86_platform.hyper, sizeof(h->runtime));
-
- - x86_hyper = h;
- + x86_hyper_type = h->type;
- x86_init.hyper.init_platform();
- }
- diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c
- index 9707e431da27..3672f1192119 100644
- --- a/arch/x86/kernel/cpu/mshyperv.c
- +++ b/arch/x86/kernel/cpu/mshyperv.c
- @@ -252,9 +252,9 @@ static void __init ms_hyperv_init_platform(void)
- #endif
- }
-
- -const __refconst struct hypervisor_x86 x86_hyper_ms_hyperv = {
- - .name = "Microsoft HyperV",
- +const __initconst struct hypervisor_x86 x86_hyper_ms_hyperv = {
- + .name = "Microsoft Hyper-V",
- .detect = ms_hyperv_platform,
- + .type = X86_HYPER_MS_HYPERV,
- .init.init_platform = ms_hyperv_init_platform,
- };
- -EXPORT_SYMBOL(x86_hyper_ms_hyperv);
- diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c
- index 4804c1d063c8..8e005329648b 100644
- --- a/arch/x86/kernel/cpu/vmware.c
- +++ b/arch/x86/kernel/cpu/vmware.c
- @@ -205,10 +205,10 @@ static bool __init vmware_legacy_x2apic_available(void)
- (eax & (1 << VMWARE_PORT_CMD_LEGACY_X2APIC)) != 0;
- }
-
- -const __refconst struct hypervisor_x86 x86_hyper_vmware = {
- +const __initconst struct hypervisor_x86 x86_hyper_vmware = {
- .name = "VMware",
- .detect = vmware_platform,
- + .type = X86_HYPER_VMWARE,
- .init.init_platform = vmware_platform_setup,
- .init.x2apic_available = vmware_legacy_x2apic_available,
- };
- -EXPORT_SYMBOL(x86_hyper_vmware);
- diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
- index 54e373bfeab9..b65a51a24647 100644
- --- a/arch/x86/kernel/kvm.c
- +++ b/arch/x86/kernel/kvm.c
- @@ -544,12 +544,12 @@ static uint32_t __init kvm_detect(void)
- return kvm_cpuid_base();
- }
-
- -const struct hypervisor_x86 x86_hyper_kvm __refconst = {
- +const __initconst struct hypervisor_x86 x86_hyper_kvm = {
- .name = "KVM",
- .detect = kvm_detect,
- + .type = X86_HYPER_KVM,
- .init.x2apic_available = kvm_para_available,
- };
- -EXPORT_SYMBOL_GPL(x86_hyper_kvm);
-
- static __init int activate_jump_labels(void)
- {
- diff --git a/arch/x86/xen/enlighten_hvm.c b/arch/x86/xen/enlighten_hvm.c
- index 7b1622089f96..754d5391d9fa 100644
- --- a/arch/x86/xen/enlighten_hvm.c
- +++ b/arch/x86/xen/enlighten_hvm.c
- @@ -226,12 +226,12 @@ static uint32_t __init xen_platform_hvm(void)
- return xen_cpuid_base();
- }
-
- -const struct hypervisor_x86 x86_hyper_xen_hvm = {
- +const __initconst struct hypervisor_x86 x86_hyper_xen_hvm = {
- .name = "Xen HVM",
- .detect = xen_platform_hvm,
- + .type = X86_HYPER_XEN_HVM,
- .init.init_platform = xen_hvm_guest_init,
- .init.x2apic_available = xen_x2apic_para_available,
- .init.init_mem_mapping = xen_hvm_init_mem_mapping,
- .runtime.pin_vcpu = xen_pin_vcpu,
- };
- -EXPORT_SYMBOL(x86_hyper_xen_hvm);
- diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c
- index 4110fc9e5ee9..63c81154083b 100644
- --- a/arch/x86/xen/enlighten_pv.c
- +++ b/arch/x86/xen/enlighten_pv.c
- @@ -1458,9 +1458,9 @@ static uint32_t __init xen_platform_pv(void)
- return 0;
- }
-
- -const struct hypervisor_x86 x86_hyper_xen_pv = {
- +const __initconst struct hypervisor_x86 x86_hyper_xen_pv = {
- .name = "Xen PV",
- .detect = xen_platform_pv,
- + .type = X86_HYPER_XEN_PV,
- .runtime.pin_vcpu = xen_pin_vcpu,
- };
- -EXPORT_SYMBOL(x86_hyper_xen_pv);
- diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
- index 5ad627044dd1..8aca7613e482 100644
- --- a/drivers/hv/vmbus_drv.c
- +++ b/drivers/hv/vmbus_drv.c
- @@ -1551,7 +1551,7 @@ static int __init hv_acpi_init(void)
- {
- int ret, t;
-
- - if (x86_hyper != &x86_hyper_ms_hyperv)
- + if (x86_hyper_type != X86_HYPER_MS_HYPERV)
- return -ENODEV;
-
- init_completion(&probe_event);
- diff --git a/drivers/input/mouse/vmmouse.c b/drivers/input/mouse/vmmouse.c
- index 0f586780ceb4..1ae5c1ef3f5b 100644
- --- a/drivers/input/mouse/vmmouse.c
- +++ b/drivers/input/mouse/vmmouse.c
- @@ -316,11 +316,9 @@ static int vmmouse_enable(struct psmouse *psmouse)
- /*
- * Array of supported hypervisors.
- */
- -static const struct hypervisor_x86 *vmmouse_supported_hypervisors[] = {
- - &x86_hyper_vmware,
- -#ifdef CONFIG_KVM_GUEST
- - &x86_hyper_kvm,
- -#endif
- +static enum x86_hypervisor_type vmmouse_supported_hypervisors[] = {
- + X86_HYPER_VMWARE,
- + X86_HYPER_KVM,
- };
-
- /**
- @@ -331,7 +329,7 @@ static bool vmmouse_check_hypervisor(void)
- int i;
-
- for (i = 0; i < ARRAY_SIZE(vmmouse_supported_hypervisors); i++)
- - if (vmmouse_supported_hypervisors[i] == x86_hyper)
- + if (vmmouse_supported_hypervisors[i] == x86_hyper_type)
- return true;
-
- return false;
- diff --git a/drivers/misc/vmw_balloon.c b/drivers/misc/vmw_balloon.c
- index 1e688bfec567..9047c0a529b2 100644
- --- a/drivers/misc/vmw_balloon.c
- +++ b/drivers/misc/vmw_balloon.c
- @@ -1271,7 +1271,7 @@ static int __init vmballoon_init(void)
- * Check if we are running on VMware's hypervisor and bail out
- * if we are not.
- */
- - if (x86_hyper != &x86_hyper_vmware)
- + if (x86_hyper_type != X86_HYPER_VMWARE)
- return -ENODEV;
-
- for (is_2m_pages = 0; is_2m_pages < VMW_BALLOON_NUM_PAGE_SIZES;
- --
- 2.14.2
|