This is the patch I sent out yesterday for Linux to clean up the guest ID mess. For FreeBSD, you can use the following constant: HV_FREEBSD_VENDOR_ID 0x8200 and use the function to generate the ID appropriately. Larry, I will forward you the proposal for guest ID in a separate email. Regards. K. Y > -----Original Message----- > From: K. Y. Srinivasan [mailto:kys@xxxxxxxxxxxxx] > Sent: Tuesday, July 24, 2012 7:12 PM > To: gregkh@xxxxxxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx; > devel@xxxxxxxxxxxxxxxxxxxxxx; virtualization@xxxxxxxxxxxxxx; olaf@xxxxxxxxx; > apw@xxxxxxxxxxxxx > Cc: KY Srinivasan > Subject: [PATCH 1/1] 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@xxxxxxxxxxxxx> > --- > drivers/hv/hv.c | 9 +++++-- > drivers/hv/hyperv_vmbus.h | 48 > +++++++++++++++++++++++++++++++++++++++++--- > 2 files changed, 50 insertions(+), 7 deletions(-) > > diff --git a/drivers/hv/hv.c b/drivers/hv/hv.c > index 86f8885..771e24f 100644 > --- a/drivers/hv/hv.c > +++ b/drivers/hv/hv.c > @@ -26,6 +26,7 @@ > #include <linux/slab.h> > #include <linux/vmalloc.h> > #include <linux/hyperv.h> > +#include <linux/version.h> > #include <asm/hyperv.h> > #include "hyperv_vmbus.h" > > @@ -164,9 +165,11 @@ int hv_init(void) > > max_leaf = query_hypervisor_info(); > > - /* Write our OS info */ > - wrmsrl(HV_X64_MSR_GUEST_OS_ID, HV_LINUX_GUEST_ID); > - hv_context.guestid = HV_LINUX_GUEST_ID; > + /* > + * Write our OS ID. > + */ > + hv_context.guestid = generate_guest_id(0, LINUX_VERSION_CODE, 0); > + wrmsrl(HV_X64_MSR_GUEST_OS_ID, hv_context.guestid); > > /* See if the hypercall page is already set */ > rdmsrl(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64); > diff --git a/drivers/hv/hyperv_vmbus.h b/drivers/hv/hyperv_vmbus.h > index 0614ff3..108a441 100644 > --- a/drivers/hv/hyperv_vmbus.h > +++ b/drivers/hv/hyperv_vmbus.h > @@ -410,10 +410,50 @@ enum { > > #define HV_PRESENT_BIT 0x80000000 > > -#define HV_LINUX_GUEST_ID_LO 0x00000000 > -#define HV_LINUX_GUEST_ID_HI 2976579765 > -#define HV_LINUX_GUEST_ID (((u64)HV_LINUX_GUEST_ID_HI << 32) | > \ > - HV_LINUX_GUEST_ID_LO) > +/* > + * The guest OS needs to register the guest ID with the hypervisor. > + * The guest ID is a 64 bit entity and the structure of this ID is > + * specified in the Hyper-V specification: > + * > + * http://msdn.microsoft.com/en-us/library/windows/ > + * hardware/ff542653%28v=vs.85%29.aspx > + * > + * While the current guideline does not specify how Linux guest ID(s) > + * need to be generated, our plan is to publish the guidelines for > + * Linux and other guest operating systems that currently are hosted > + * on Hyper-V. The implementation here conforms to this yet > + * unpublished guidelines. > + * > + * > + * Bit(s) > + * 63 - Indicates if the OS is Open Source or not; 1 is Open Source > + * 62:56 - Os Type; Linux is 0x100 > + * 55:48 - Distro specific identification > + * 47:16 - Linux kernel version number > + * 15:0 - Distro specific identification > + * > + * > + */ > + > +#define HV_LINUX_VENDOR_ID 0x8100 > + > +/* > + * Generate the guest ID based on the guideline described above. > + */ > + > +static inline __u64 generate_guest_id(__u8 d_info1, __u32 kernel_version, > + __u16 d_info2) > +{ > + __u64 guest_id = 0; > + > + guest_id = (((__u64)HV_LINUX_VENDOR_ID) << 48); > + guest_id |= (((__u64)(d_info1)) << 48); > + guest_id |= (((__u64)(kernel_version)) << 16); > + guest_id |= ((__u64)(d_info2)); > + > + return guest_id; > +} > + > > #define HV_CPU_POWER_MANAGEMENT (1 << 0) > #define HV_RECOMMENDATIONS_MAX 4 > -- > 1.7.4.1 > > > _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel