Patchwork [v6,04/16] target-i386: Add x86_set_hyperv.

login
register
mail settings
Submitter Don Slutz
Date Sept. 24, 2012, 2:32 p.m.
Message ID <1348497138-2516-5-git-send-email-Don@CloudSwitch.com>
Download mbox | patch
Permalink /patch/186458/
State New
Headers show

Comments

Don Slutz - Sept. 24, 2012, 2:32 p.m.
This is used to set the cpu object's hypervisor level to the default for Microsoft's Hypervisor.

Signed-off-by: Don Slutz <Don@CloudSwitch.com>
---
 target-i386/cpu.c |    9 +++++++++
 target-i386/cpu.h |    2 ++
 2 files changed, 11 insertions(+), 0 deletions(-)
Marcelo Tosatti - Oct. 9, 2012, 5:17 p.m.
On Tue, Oct 09, 2012 at 01:34:09PM -0300, Marcelo Tosatti wrote:
> On Mon, Sep 24, 2012 at 10:32:06AM -0400, Don Slutz wrote:
> > This is used to set the cpu object's hypervisor level to the default for Microsoft's Hypervisor.
> > 
> > Signed-off-by: Don Slutz <Don@CloudSwitch.com>
> > ---
> >  target-i386/cpu.c |    9 +++++++++
> >  target-i386/cpu.h |    2 ++
> >  2 files changed, 11 insertions(+), 0 deletions(-)
> > 
> > diff --git a/target-i386/cpu.c b/target-i386/cpu.c
> > index 451de12..48bdaf9 100644
> > --- a/target-i386/cpu.c
> > +++ b/target-i386/cpu.c
> > @@ -1193,6 +1193,12 @@ static void x86_cpuid_set_hv_level(Object *obj, Visitor *v, void *opaque,
> >  }
> >  
> >  #if !defined(CONFIG_USER_ONLY)
> > +static void x86_set_hyperv(Object *obj, Error **errp)
> > +{
> > +    object_property_set_int(obj, CPUID_HV_LEVEL_HYPERV,
> > +                            "hypervisor-level", errp);
> > +}
> > +
> >  static void x86_get_hv_spinlocks(Object *obj, Visitor *v, void *opaque,
> >                                   const char *name, Error **errp)
> >  {
> > @@ -1215,6 +1221,7 @@ static void x86_set_hv_spinlocks(Object *obj, Visitor *v, void *opaque,
> >          return;
> >      }
> >      hyperv_set_spinlock_retries(value);
> > +    x86_set_hyperv(obj, errp);
> >  }
> >  
> >  static void x86_get_hv_relaxed(Object *obj, Visitor *v, void *opaque,
> > @@ -1235,6 +1242,7 @@ static void x86_set_hv_relaxed(Object *obj, Visitor *v, void *opaque,
> >          return;
> >      }
> >      hyperv_enable_relaxed_timing(value);
> > +    x86_set_hyperv(obj, errp);
> >  }
> >  
> >  static void x86_get_hv_vapic(Object *obj, Visitor *v, void *opaque,
> > @@ -1255,6 +1263,7 @@ static void x86_set_hv_vapic(Object *obj, Visitor *v, void *opaque,
> >          return;
> >      }
> >      hyperv_enable_vapic_recommended(value);
> > +    x86_set_hyperv(obj, errp);
> >  }
> >  #endif
> >  
> > diff --git a/target-i386/cpu.h b/target-i386/cpu.h
> > index 1899f69..3152a4e 100644
> > --- a/target-i386/cpu.h
> > +++ b/target-i386/cpu.h
> > @@ -488,6 +488,8 @@
> >  
> >  #define CPUID_VENDOR_VIA   "CentaurHauls"
> >  
> > +#define CPUID_HV_LEVEL_HYPERV  0x40000005
> > +
> 
> Where this comes from? 
> 
> http://msdn.microsoft.com/en-us/library/windows/hardware/ff542428%28v=vs.85%29.aspx
> 
> has under "Leaf 0x40000000" (at very top of table):
> 
> EAX
> 
> The maximum input value for hypervisor CPUID information. For Microsoft
> hypervisors, this value will be at least 0x40000005. The vendor ID
> signature should be used only for reporting and diagnostic purposes.
> 
> Is that the same 0x40000005 as in this patch?

Yes, the #define can be reused:

#define HYPERV_CPUID_MIN                        0x40000005
Don Slutz - Oct. 9, 2012, 7:12 p.m.
On 10/09/12 13:17, Marcelo Tosatti wrote:
> On Tue, Oct 09, 2012 at 01:34:09PM -0300, Marcelo Tosatti wrote:
>> On Mon, Sep 24, 2012 at 10:32:06AM -0400, Don Slutz wrote:
>>> This is used to set the cpu object's hypervisor level to the default for Microsoft's Hypervisor.
>>>
>>> Signed-off-by: Don Slutz <Don@CloudSwitch.com>
>>> ---
>>>   target-i386/cpu.c |    9 +++++++++
>>>   target-i386/cpu.h |    2 ++
>>>   2 files changed, 11 insertions(+), 0 deletions(-)
>>>
>>> diff --git a/target-i386/cpu.c b/target-i386/cpu.c
>>> index 451de12..48bdaf9 100644
>>> --- a/target-i386/cpu.c
>>> +++ b/target-i386/cpu.c
>>> @@ -1193,6 +1193,12 @@ static void x86_cpuid_set_hv_level(Object *obj, Visitor *v, void *opaque,
>>>   }
>>>   
>>>   #if !defined(CONFIG_USER_ONLY)
>>> +static void x86_set_hyperv(Object *obj, Error **errp)
>>> +{
>>> +    object_property_set_int(obj, CPUID_HV_LEVEL_HYPERV,
>>> +                            "hypervisor-level", errp);
>>> +}
>>> +
>>>   static void x86_get_hv_spinlocks(Object *obj, Visitor *v, void *opaque,
>>>                                    const char *name, Error **errp)
>>>   {
>>> @@ -1215,6 +1221,7 @@ static void x86_set_hv_spinlocks(Object *obj, Visitor *v, void *opaque,
>>>           return;
>>>       }
>>>       hyperv_set_spinlock_retries(value);
>>> +    x86_set_hyperv(obj, errp);
>>>   }
>>>   
>>>   static void x86_get_hv_relaxed(Object *obj, Visitor *v, void *opaque,
>>> @@ -1235,6 +1242,7 @@ static void x86_set_hv_relaxed(Object *obj, Visitor *v, void *opaque,
>>>           return;
>>>       }
>>>       hyperv_enable_relaxed_timing(value);
>>> +    x86_set_hyperv(obj, errp);
>>>   }
>>>   
>>>   static void x86_get_hv_vapic(Object *obj, Visitor *v, void *opaque,
>>> @@ -1255,6 +1263,7 @@ static void x86_set_hv_vapic(Object *obj, Visitor *v, void *opaque,
>>>           return;
>>>       }
>>>       hyperv_enable_vapic_recommended(value);
>>> +    x86_set_hyperv(obj, errp);
>>>   }
>>>   #endif
>>>   
>>> diff --git a/target-i386/cpu.h b/target-i386/cpu.h
>>> index 1899f69..3152a4e 100644
>>> --- a/target-i386/cpu.h
>>> +++ b/target-i386/cpu.h
>>> @@ -488,6 +488,8 @@
>>>   
>>>   #define CPUID_VENDOR_VIA   "CentaurHauls"
>>>   
>>> +#define CPUID_HV_LEVEL_HYPERV  0x40000005
>>> +
>> Where this comes from?
>>
>> http://msdn.microsoft.com/en-us/library/windows/hardware/ff542428%28v=vs.85%29.aspx
>>
>> has under "Leaf 0x40000000" (at very top of table):
>>
>> EAX
>>
>> The maximum input value for hypervisor CPUID information. For Microsoft
>> hypervisors, this value will be at least 0x40000005. The vendor ID
>> signature should be used only for reporting and diagnostic purposes.
>>
>> Is that the same 0x40000005 as in this patch?
> Yes, the #define can be reused:
>
> #define HYPERV_CPUID_MIN                        0x40000005
>
Not as simple as it seems.

http://lists.nongnu.org/archive/html/qemu-devel/2012-09/msg03359.html

I can make sure this info is part of the commit message.
     -Don Slutz
Marcelo Tosatti - Oct. 9, 2012, 7:15 p.m.
On Tue, Oct 09, 2012 at 03:12:00PM -0400, Don Slutz wrote:
> On 10/09/12 13:17, Marcelo Tosatti wrote:
> >On Tue, Oct 09, 2012 at 01:34:09PM -0300, Marcelo Tosatti wrote:
> >>On Mon, Sep 24, 2012 at 10:32:06AM -0400, Don Slutz wrote:
> >>>This is used to set the cpu object's hypervisor level to the default for Microsoft's Hypervisor.
> >>>
> >>>Signed-off-by: Don Slutz <Don@CloudSwitch.com>
> >>>---
> >>>  target-i386/cpu.c |    9 +++++++++
> >>>  target-i386/cpu.h |    2 ++
> >>>  2 files changed, 11 insertions(+), 0 deletions(-)
> >>>
> >>>diff --git a/target-i386/cpu.c b/target-i386/cpu.c
> >>>index 451de12..48bdaf9 100644
> >>>--- a/target-i386/cpu.c
> >>>+++ b/target-i386/cpu.c
> >>>@@ -1193,6 +1193,12 @@ static void x86_cpuid_set_hv_level(Object *obj, Visitor *v, void *opaque,
> >>>  }
> >>>  #if !defined(CONFIG_USER_ONLY)
> >>>+static void x86_set_hyperv(Object *obj, Error **errp)
> >>>+{
> >>>+    object_property_set_int(obj, CPUID_HV_LEVEL_HYPERV,
> >>>+                            "hypervisor-level", errp);
> >>>+}
> >>>+
> >>>  static void x86_get_hv_spinlocks(Object *obj, Visitor *v, void *opaque,
> >>>                                   const char *name, Error **errp)
> >>>  {
> >>>@@ -1215,6 +1221,7 @@ static void x86_set_hv_spinlocks(Object *obj, Visitor *v, void *opaque,
> >>>          return;
> >>>      }
> >>>      hyperv_set_spinlock_retries(value);
> >>>+    x86_set_hyperv(obj, errp);
> >>>  }
> >>>  static void x86_get_hv_relaxed(Object *obj, Visitor *v, void *opaque,
> >>>@@ -1235,6 +1242,7 @@ static void x86_set_hv_relaxed(Object *obj, Visitor *v, void *opaque,
> >>>          return;
> >>>      }
> >>>      hyperv_enable_relaxed_timing(value);
> >>>+    x86_set_hyperv(obj, errp);
> >>>  }
> >>>  }
> >>>  static void x86_get_hv_vapic(Object *obj, Visitor *v, void *opaque,
> >>>@@ -1255,6 +1263,7 @@ static void x86_set_hv_vapic(Object *obj, Visitor *v, void *opaque,
> >>>          return;
> >>>      }
> >>>      hyperv_enable_vapic_recommended(value);
> >>>+    x86_set_hyperv(obj, errp);
> >>>  }
> >>>  #endif
> >>>diff --git a/target-i386/cpu.h b/target-i386/cpu.h
> >>>index 1899f69..3152a4e 100644
> >>>--- a/target-i386/cpu.h
> >>>+++ b/target-i386/cpu.h
> >>>@@ -488,6 +488,8 @@
> >>>  #define CPUID_VENDOR_VIA   "CentaurHauls"
> >>>+#define CPUID_HV_LEVEL_HYPERV  0x40000005
> >>>+
> >>Where this comes from?
> >>
> >>http://msdn.microsoft.com/en-us/library/windows/hardware/ff542428%28v=vs.85%29.aspx
> >>
> >>has under "Leaf 0x40000000" (at very top of table):
> >>
> >>EAX
> >>
> >>The maximum input value for hypervisor CPUID information. For Microsoft
> >>hypervisors, this value will be at least 0x40000005. The vendor ID
> >>signature should be used only for reporting and diagnostic purposes.
> >>
> >>Is that the same 0x40000005 as in this patch?
> >Yes, the #define can be reused:
> >
> >#define HYPERV_CPUID_MIN                        0x40000005
> >
> Not as simple as it seems.
> 
> http://lists.nongnu.org/archive/html/qemu-devel/2012-09/msg03359.html
> 
> I can make sure this info is part of the commit message.
>     -Don Slutz

Ok add a copy but have CPUID_MIN in the name (because
CPUID_HV_LEVEL_HYPERV is very confusing). Add a comment 

/* maximum input value for h...

Patch

diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index 451de12..48bdaf9 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -1193,6 +1193,12 @@  static void x86_cpuid_set_hv_level(Object *obj, Visitor *v, void *opaque,
 }
 
 #if !defined(CONFIG_USER_ONLY)
+static void x86_set_hyperv(Object *obj, Error **errp)
+{
+    object_property_set_int(obj, CPUID_HV_LEVEL_HYPERV,
+                            "hypervisor-level", errp);
+}
+
 static void x86_get_hv_spinlocks(Object *obj, Visitor *v, void *opaque,
                                  const char *name, Error **errp)
 {
@@ -1215,6 +1221,7 @@  static void x86_set_hv_spinlocks(Object *obj, Visitor *v, void *opaque,
         return;
     }
     hyperv_set_spinlock_retries(value);
+    x86_set_hyperv(obj, errp);
 }
 
 static void x86_get_hv_relaxed(Object *obj, Visitor *v, void *opaque,
@@ -1235,6 +1242,7 @@  static void x86_set_hv_relaxed(Object *obj, Visitor *v, void *opaque,
         return;
     }
     hyperv_enable_relaxed_timing(value);
+    x86_set_hyperv(obj, errp);
 }
 
 static void x86_get_hv_vapic(Object *obj, Visitor *v, void *opaque,
@@ -1255,6 +1263,7 @@  static void x86_set_hv_vapic(Object *obj, Visitor *v, void *opaque,
         return;
     }
     hyperv_enable_vapic_recommended(value);
+    x86_set_hyperv(obj, errp);
 }
 #endif
 
diff --git a/target-i386/cpu.h b/target-i386/cpu.h
index 1899f69..3152a4e 100644
--- a/target-i386/cpu.h
+++ b/target-i386/cpu.h
@@ -488,6 +488,8 @@ 
 
 #define CPUID_VENDOR_VIA   "CentaurHauls"
 
+#define CPUID_HV_LEVEL_HYPERV  0x40000005
+
 #define CPUID_MWAIT_IBE     (1 << 1) /* Interrupts can exit capability */
 #define CPUID_MWAIT_EMX     (1 << 0) /* enumeration supported */