Skip to contentSkip to conversation

HVM save/restore clean up: fix vmcs padding issues

PATCH New Zhai, Edwin 1 participant 1 message Jan 19, 2007

lore
Share & tools
lore
#0 lore raw

PATCH 1/4 HVM save/restore clean up: fix vmcs padding issues

[PATCH 1/4] HVM save/restore clean up: fix vmcs padding issues

hvmcpu_context is not well padded in previous patch, this patch fix it.

xen/include/public/arch-x86/xen.h +24 -20
diff -r e2539ab3580a xen/include/public/arch-x86/xen.h
@@ -118,56 +118,60 @@ struct vmcs_data {
     uint64_t  cr0;
     uint64_t  cr3;        /* page table directory */
     uint64_t  cr4;
+    uint64_t  idtr_base;
+    uint64_t  gdtr_base;
+    uint64_t  cs_base;
+    uint64_t  ds_base;
+    uint64_t  es_base;
+    uint64_t  ss_base;
+    uint64_t  fs_base;
+    uint64_t  gs_base;
+    uint64_t  tr_base;
+    uint64_t  ldtr_base;
+    uint64_t  sysenter_esp;
+    uint64_t  sysenter_eip;
+
+    /* msr for em64t */
+    uint64_t shadow_gs;
+    uint64_t flags;
+
+    /* same size as VMX_MSR_COUNT */
+    uint64_t msr_items[6];
+    uint64_t vmxassist_enabled;
+
     uint32_t  idtr_limit; /* idt */
-    uint64_t  idtr_base;
     uint32_t  gdtr_limit; /* gdt */
-    uint64_t  gdtr_base;
     uint32_t  cs_sel;     /* cs selector */
     uint32_t  cs_limit;
-    uint64_t  cs_base;
     uint32_t  cs_arbytes;
     uint32_t  ds_sel;     /* ds selector */
     uint32_t  ds_limit;
-    uint64_t  ds_base;
     uint32_t  ds_arbytes;
     uint32_t  es_sel;     /* es selector */
     uint32_t  es_limit;
-    uint64_t  es_base;
     uint32_t  es_arbytes;
     uint32_t  ss_sel;     /* ss selector */
     uint32_t  ss_limit;
-    uint64_t  ss_base;
     uint32_t  ss_arbytes;
     uint32_t  fs_sel;     /* fs selector */
     uint32_t  fs_limit;
-    uint64_t  fs_base;
     uint32_t  fs_arbytes;
     uint32_t  gs_sel;     /* gs selector */
     uint32_t  gs_limit;
-    uint64_t  gs_base;
     uint32_t  gs_arbytes;
     uint32_t  tr_sel;     /* task selector */
     uint32_t  tr_limit;
-    uint64_t  tr_base;
     uint32_t  tr_arbytes;
     uint32_t  ldtr_sel;   /* ldtr selector */
     uint32_t  ldtr_limit;
-    uint64_t  ldtr_base;
     uint32_t  ldtr_arbytes;
     uint32_t  sysenter_cs;
-    uint64_t  sysenter_esp;
-    uint64_t  sysenter_eip;
-    /* msr for em64t */
-    uint64_t shadow_gs;
-    uint64_t flags;
-    /* same size as VMX_MSR_COUNT */
-    uint64_t msr_items[6];
-    uint64_t vmxassist_enabled;
+    uint32_t  _pad;
 };
 typedef struct vmcs_data vmcs_data_t;
 
 struct hvmcpu_context {
-    uint32_t valid;
+    uint64_t valid;
     struct vmcs_data data;
     uint64_t gtime;
 };
@@ -189,6 +193,7 @@ struct vcpu_guest_context {
 #define VGCF_failsafe_disables_events  (1<<_VGCF_failsafe_disables_events)
 #define _VGCF_syscall_disables_events  4
 #define VGCF_syscall_disables_events   (1<<_VGCF_syscall_disables_events)
+    struct hvmcpu_context hvmcpu_ctxt;      /* whole vmcs region */
     unsigned long flags;                    /* VGCF_* flags                 */
     struct cpu_user_regs user_regs;         /* User-level CPU registers     */
     struct trap_info trap_ctxt[256];        /* Virtual IDT                  */
@@ -218,7 +223,6 @@ struct vcpu_guest_context {
 #endif
 #endif
     unsigned long vm_assist;                /* VMASST_TYPE_* bitmap */
-    struct hvmcpu_context hvmcpu_ctxt;      /* whole vmcs region */
 #ifdef __x86_64__
     /* Segment base addresses. */
     uint64_t      fs_base;