[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v2] x86: generic MSRs save/restore



Jan Beulich wrote:
>>>> On 16.12.13 at 14:23, "Liu, Jinsong" <jinsong.liu@xxxxxxxxx> wrote:
>> Jan Beulich wrote:
>>>>>> On 16.12.13 at 11:05, "Liu, Jinsong" <jinsong.liu@xxxxxxxxx>
>>>>>> wrote: 
>>>> Jan Beulich wrote:
>>>>>>>> On 16.12.13 at 10:53, "Liu, Jinsong" <jinsong.liu@xxxxxxxxx>
>>>>>>>> wrote:
>>>>>> @@ -467,6 +487,7 @@ int main(int argc, char **argv)
>>>>>>          case HVM_SAVE_CODE(VIRIDIAN_VCPU): dump_viridian_vcpu();
>>>>>>          break; case HVM_SAVE_CODE(VMCE_VCPU): dump_vmce_vcpu();
>>>>>>          break; case HVM_SAVE_CODE(TSC_ADJUST):
>>>>>> dump_tsc_adjust(); break; +        case HVM_SAVE_CODE(CPU_MSR):
>>>>>>          dump_cpu_msr(); break; case HVM_SAVE_CODE(END): break;
>>>>>>          default:
>>>>>>              printf(" ** Don't understand type %u: skipping\n",
>>>>>> ======================= 
>>>>>> 
>>>>>> w/o the declaration, case HVM_SAVE_CODE(CPU_MSR) compiling fail.
>>>>> 
>>>>> Right, because you ought to use CPU_MSR_CODE here, which the
>>>>> public header does define.
>>>> 
>>>> Isn't it ugly? not unified style w/ other typecodes.
>>>> Why not simply add declaration at Xen side?
>>> 
>>> We absolutely should not declare things that aren't correct.
>> 
>> You have had the declaration in the public header with variable size
>> data structure: struct hvm_msr {
>>     uint32_t count;
>>     struct hvm_one_msr {
>>         uint32_t index;
>>         uint32_t _rsvd;
>>         uint64_t val;
>>     } msr[1 /* variable size */];
>> };
>> Why can't declare DECLARE_HVM_SAVE_TYPE(CPU_MSR, CPU_MSR_CODE, struct
>> hvm_msr)? They are both variable size.
> 
> That's not the point. We should make it impossible for someone to
> erroneously use in particular HVM_SAVE_LENGTH() for variable
> size records.
> 
> Anyway - why don't you simply bring this up with your colleagues
> who introduced the XSAVE record? I'm really just following its
> model...
> 

They are my ex-colleagues :(

Anyway, I adjust msr dump tools side patch:

diff --git a/tools/misc/xen-hvmctx.c b/tools/misc/xen-hvmctx.c
index 5a69245..8a4614d 100644
--- a/tools/misc/xen-hvmctx.c
+++ b/tools/misc/xen-hvmctx.c
@@ -399,6 +399,26 @@ static void dump_tsc_adjust(void)
     printf("    TSC_ADJUST: tsc_adjust %" PRIx64 "\n", p.tsc_adjust);
 }

+#define HVM_CPU_MSR_SIZE(cnt) offsetof(struct hvm_msr, msr[cnt])
+static void dump_cpu_msr(void)
+{
+    int i;
+    struct hvm_msr *p = (struct hvm_msr *)(buf + off);
+
+    if ( len - off < HVM_CPU_MSR_SIZE(p->count) )
+    {
+        fprintf(stderr, "Error: need another %u bytes, only %u available",
+                (unsigned int)HVM_CPU_MSR_SIZE(p->count), len - off);
+        exit(1);
+    }
+
+    for ( i = 0; i < p->count; i++ )
+        printf("    CPU_MSR: msr %" PRIx32 "    val %" PRIx64 "\n",
+                    p->msr[i].index, p->msr[i].val);
+
+    off += HVM_CPU_MSR_SIZE(p->count);
+}
+
 int main(int argc, char **argv)
 {
     int entry, domid;
@@ -467,6 +487,7 @@ int main(int argc, char **argv)
         case HVM_SAVE_CODE(VIRIDIAN_VCPU): dump_viridian_vcpu(); break;
         case HVM_SAVE_CODE(VMCE_VCPU): dump_vmce_vcpu(); break;
         case HVM_SAVE_CODE(TSC_ADJUST): dump_tsc_adjust(); break;
+        case CPU_MSR_CODE: dump_cpu_msr(); break;
         case HVM_SAVE_CODE(END): break;
         default:
             printf(" ** Don't understand type %u: skipping\n",


Thanks,
Jinsong


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.