aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hv
diff options
context:
space:
mode:
authorK. Y. Srinivasan <kys@microsoft.com>2012-07-24 19:11:58 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-08-13 21:42:25 -0400
commit83ba0c4f3f317270dae5597d8044b795d119914c (patch)
tree1db3640642f68f5e57de0404a8e7a47ac2bbc899 /drivers/hv
parent0d7614f09c1ebdbaa1599a5aba7593f147bf96ee (diff)
Drivers: hv: Cleanup the guest ID computation
The current guest ID string in use in vmbus driver does not conform to the MSFT guidelines on guest ID. MSFT currently does not specify Linux specific guidelines. MSFT however has plans to publish Linux specific guidelines. This implementation conforms to the yet unpublished Linux specific guidelines for guest ID. This implementation also broadly conforms to the current guidelines as well. Signed-off-by: K. Y. Srinivasan <kys@microsoft.com> Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com> Cc: Bjørn Mork <bjorn@mork.no> Cc: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/hv')
-rw-r--r--drivers/hv/hv.c9
-rw-r--r--drivers/hv/hyperv_vmbus.h47
2 files changed, 49 insertions, 7 deletions
diff --git a/drivers/hv/hv.c b/drivers/hv/hv.c
index 86f8885aeb45..771e24f2981d 100644
--- a/drivers/hv/hv.c
+++ b/drivers/hv/hv.c
@@ -26,6 +26,7 @@
26#include <linux/slab.h> 26#include <linux/slab.h>
27#include <linux/vmalloc.h> 27#include <linux/vmalloc.h>
28#include <linux/hyperv.h> 28#include <linux/hyperv.h>
29#include <linux/version.h>
29#include <asm/hyperv.h> 30#include <asm/hyperv.h>
30#include "hyperv_vmbus.h" 31#include "hyperv_vmbus.h"
31 32
@@ -164,9 +165,11 @@ int hv_init(void)
164 165
165 max_leaf = query_hypervisor_info(); 166 max_leaf = query_hypervisor_info();
166 167
167 /* Write our OS info */ 168 /*
168 wrmsrl(HV_X64_MSR_GUEST_OS_ID, HV_LINUX_GUEST_ID); 169 * Write our OS ID.
169 hv_context.guestid = HV_LINUX_GUEST_ID; 170 */
171 hv_context.guestid = generate_guest_id(0, LINUX_VERSION_CODE, 0);
172 wrmsrl(HV_X64_MSR_GUEST_OS_ID, hv_context.guestid);
170 173
171 /* See if the hypercall page is already set */ 174 /* See if the hypercall page is already set */
172 rdmsrl(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64); 175 rdmsrl(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64);
diff --git a/drivers/hv/hyperv_vmbus.h b/drivers/hv/hyperv_vmbus.h
index 0614ff3a7d7e..d8d1fadb398a 100644
--- a/drivers/hv/hyperv_vmbus.h
+++ b/drivers/hv/hyperv_vmbus.h
@@ -410,10 +410,49 @@ enum {
410 410
411#define HV_PRESENT_BIT 0x80000000 411#define HV_PRESENT_BIT 0x80000000
412 412
413#define HV_LINUX_GUEST_ID_LO 0x00000000 413/*
414#define HV_LINUX_GUEST_ID_HI 2976579765 414 * The guest OS needs to register the guest ID with the hypervisor.
415#define HV_LINUX_GUEST_ID (((u64)HV_LINUX_GUEST_ID_HI << 32) | \ 415 * The guest ID is a 64 bit entity and the structure of this ID is
416 HV_LINUX_GUEST_ID_LO) 416 * specified in the Hyper-V specification:
417 *
418 * http://msdn.microsoft.com/en-us/library/windows/hardware/ff542653%28v=vs.85%29.aspx
419 *
420 * While the current guideline does not specify how Linux guest ID(s)
421 * need to be generated, our plan is to publish the guidelines for
422 * Linux and other guest operating systems that currently are hosted
423 * on Hyper-V. The implementation here conforms to this yet
424 * unpublished guidelines.
425 *
426 *
427 * Bit(s)
428 * 63 - Indicates if the OS is Open Source or not; 1 is Open Source
429 * 62:56 - Os Type; Linux is 0x100
430 * 55:48 - Distro specific identification
431 * 47:16 - Linux kernel version number
432 * 15:0 - Distro specific identification
433 *
434 *
435 */
436
437#define HV_LINUX_VENDOR_ID 0x8100
438
439/*
440 * Generate the guest ID based on the guideline described above.
441 */
442
443static inline __u64 generate_guest_id(__u8 d_info1, __u32 kernel_version,
444 __u16 d_info2)
445{
446 __u64 guest_id = 0;
447
448 guest_id = (((__u64)HV_LINUX_VENDOR_ID) << 48);
449 guest_id |= (((__u64)(d_info1)) << 48);
450 guest_id |= (((__u64)(kernel_version)) << 16);
451 guest_id |= ((__u64)(d_info2));
452
453 return guest_id;
454}
455
417 456
418#define HV_CPU_POWER_MANAGEMENT (1 << 0) 457#define HV_CPU_POWER_MANAGEMENT (1 << 0)
419#define HV_RECOMMENDATIONS_MAX 4 458#define HV_RECOMMENDATIONS_MAX 4