[PATCH AUTOSEL for 4.15 109/189] x86/hyperv: Check for required priviliges in hyperv_init()

2018-04-08 Thread Sasha Levin
From: Vitaly Kuznetsov 

[ Upstream commit 89a8f6d4904c8cf3ff8fee9fdaff392a6bbb8bf6 ]

In hyperv_init() its presumed that it always has access to VP index and
hypercall MSRs while according to the specification it should be checked if
it's allowed to access the corresponding MSRs before accessing them.

Signed-off-by: Vitaly Kuznetsov 
Signed-off-by: Thomas Gleixner 
Reviewed-by: Thomas Gleixner 
Cc: Stephen Hemminger 
Cc: k...@vger.kernel.org
Cc: Radim Krčmář 
Cc: Haiyang Zhang 
Cc: "Michael Kelley (EOSG)" 
Cc: Roman Kagan 
Cc: Andy Lutomirski 
Cc: de...@linuxdriverproject.org
Cc: Paolo Bonzini 
Cc: "K. Y. Srinivasan" 
Cc: Cathy Avery 
Cc: Mohammed Gamal 
Link: https://lkml.kernel.org/r/20180124132337.30138-2-vkuzn...@redhat.com
Signed-off-by: Sasha Levin 
---
 arch/x86/hyperv/hv_init.c | 9 -
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
index 189a398290db..21f9d53d9f00 100644
--- a/arch/x86/hyperv/hv_init.c
+++ b/arch/x86/hyperv/hv_init.c
@@ -110,12 +110,19 @@ static int hv_cpu_init(unsigned int cpu)
  */
 void hyperv_init(void)
 {
-   u64 guest_id;
+   u64 guest_id, required_msrs;
union hv_x64_msr_hypercall_contents hypercall_msr;
 
if (x86_hyper_type != X86_HYPER_MS_HYPERV)
return;
 
+   /* Absolutely required MSRs */
+   required_msrs = HV_X64_MSR_HYPERCALL_AVAILABLE |
+   HV_X64_MSR_VP_INDEX_AVAILABLE;
+
+   if ((ms_hyperv.features & required_msrs) != required_msrs)
+   return;
+
/* Allocate percpu VP index */
hv_vp_index = kmalloc_array(num_possible_cpus(), sizeof(*hv_vp_index),
GFP_KERNEL);
-- 
2.15.1


[PATCH AUTOSEL for 4.15 109/189] x86/hyperv: Check for required priviliges in hyperv_init()

2018-04-08 Thread Sasha Levin
From: Vitaly Kuznetsov 

[ Upstream commit 89a8f6d4904c8cf3ff8fee9fdaff392a6bbb8bf6 ]

In hyperv_init() its presumed that it always has access to VP index and
hypercall MSRs while according to the specification it should be checked if
it's allowed to access the corresponding MSRs before accessing them.

Signed-off-by: Vitaly Kuznetsov 
Signed-off-by: Thomas Gleixner 
Reviewed-by: Thomas Gleixner 
Cc: Stephen Hemminger 
Cc: k...@vger.kernel.org
Cc: Radim Krčmář 
Cc: Haiyang Zhang 
Cc: "Michael Kelley (EOSG)" 
Cc: Roman Kagan 
Cc: Andy Lutomirski 
Cc: de...@linuxdriverproject.org
Cc: Paolo Bonzini 
Cc: "K. Y. Srinivasan" 
Cc: Cathy Avery 
Cc: Mohammed Gamal 
Link: https://lkml.kernel.org/r/20180124132337.30138-2-vkuzn...@redhat.com
Signed-off-by: Sasha Levin 
---
 arch/x86/hyperv/hv_init.c | 9 -
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
index 189a398290db..21f9d53d9f00 100644
--- a/arch/x86/hyperv/hv_init.c
+++ b/arch/x86/hyperv/hv_init.c
@@ -110,12 +110,19 @@ static int hv_cpu_init(unsigned int cpu)
  */
 void hyperv_init(void)
 {
-   u64 guest_id;
+   u64 guest_id, required_msrs;
union hv_x64_msr_hypercall_contents hypercall_msr;
 
if (x86_hyper_type != X86_HYPER_MS_HYPERV)
return;
 
+   /* Absolutely required MSRs */
+   required_msrs = HV_X64_MSR_HYPERCALL_AVAILABLE |
+   HV_X64_MSR_VP_INDEX_AVAILABLE;
+
+   if ((ms_hyperv.features & required_msrs) != required_msrs)
+   return;
+
/* Allocate percpu VP index */
hv_vp_index = kmalloc_array(num_possible_cpus(), sizeof(*hv_vp_index),
GFP_KERNEL);
-- 
2.15.1