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

[Xen-changelog] [xen-unstable] [HVM] Save/restore cleanups 05: save-format headers



# HG changeset patch
# User Tim Deegan <Tim.Deegan@xxxxxxxxxxxxx>
# Date 1169291862 0
# Node ID ff4f4596cb29da5f4d672e9a99fe45603282263e
# Parent  1fd5f1754ceacdd0a1468535ac53144317e9be6f
[HVM] Save/restore cleanups 05: save-format headers
Signed-off-by: Tim Deegan <Tim.Deegan@xxxxxxxxxxxxx>
---
 xen/arch/x86/hvm/intercept.c  |   47 ++++++++++++++++++++----------------------
 xen/include/public/hvm/save.h |   15 ++++++++++++-
 2 files changed, 37 insertions(+), 25 deletions(-)

diff -r 1fd5f1754cea -r ff4f4596cb29 xen/arch/x86/hvm/intercept.c
--- a/xen/arch/x86/hvm/intercept.c      Sat Jan 20 11:17:41 2007 +0000
+++ b/xen/arch/x86/hvm/intercept.c      Sat Jan 20 11:17:42 2007 +0000
@@ -157,9 +157,6 @@ static inline void hvm_mmio_access(struc
     }
 }
 
-/* save/restore support */
-#define HVM_FILE_MAGIC   0x54381286
-#define HVM_FILE_VERSION 0x00000001
 
 int hvm_register_savevm(struct domain *d,
                     const char *idstr,
@@ -199,6 +196,7 @@ int hvm_save(struct vcpu *v, hvm_domain_
     uint32_t eax, ebx, ecx, edx;
     HVMStateEntry *se;
     char *chgset;
+    struct hvm_save_header hdr;
 
     if (!is_hvm_vcpu(v)) {
         printk("hvm_save only for hvm guest!\n");
@@ -206,8 +204,12 @@ int hvm_save(struct vcpu *v, hvm_domain_
     }
 
     memset(h, 0, sizeof(hvm_domain_context_t));
-    hvm_put_32u(h, HVM_FILE_MAGIC);
-    hvm_put_32u(h, HVM_FILE_VERSION);
+
+    hdr.magic = HVM_FILE_MAGIC;
+    hdr.version = HVM_FILE_VERSION;
+    cpuid(1, &eax, &ebx, &ecx, &edx);
+    hdr.cpuid = eax;
+    hvm_put_struct(h, &hdr);
 
     /* save xen changeset */
     chgset = strrchr(XEN_CHANGESET, ' ');
@@ -220,10 +222,6 @@ int hvm_save(struct vcpu *v, hvm_domain_
     hvm_put_8u(h, len);
     hvm_put_buffer(h, chgset, len);
 
-    /* save cpuid */
-    cpuid(1, &eax, &ebx, &ecx, &edx);
-    hvm_put_32u(h, eax);
-
     for(se = v->domain->arch.hvm_domain.first_se; se != NULL; se = se->next) {
         /* ID string */
         len = strnlen(se->idstr, HVM_SE_IDSTR_LEN);
@@ -274,13 +272,14 @@ static HVMStateEntry *find_se(struct dom
 
 int hvm_load(struct vcpu *v, hvm_domain_context_t *h)
 {
-    uint32_t len, rec_len, rec_pos, magic, instance_id, version_id;
+    uint32_t len, rec_len, rec_pos, instance_id, version_id;
     uint32_t eax, ebx, ecx, edx;
     HVMStateEntry *se;
     char idstr[HVM_SE_IDSTR_LEN];
     xen_changeset_info_t chgset;
     char *cur_chgset;
     int ret;
+    struct hvm_save_header hdr;
 
     if (!is_hvm_vcpu(v)) {
         printk("hvm_load only for hvm guest!\n");
@@ -294,17 +293,27 @@ int hvm_load(struct vcpu *v, hvm_domain_
 
     hvm_ctxt_seek(h, 0);
 
-    magic = hvm_get_32u(h);
-    if (magic != HVM_FILE_MAGIC) {
+    hvm_get_struct(h, &hdr);
+
+    if (hdr.magic != HVM_FILE_MAGIC) {
         printk("HVM restore magic dismatch!\n");
         return -1;
     }
 
-    magic = hvm_get_32u(h);
-    if (magic != HVM_FILE_VERSION) {
+    if (hdr.version != HVM_FILE_VERSION) {
         printk("HVM restore version dismatch!\n");
         return -1;
     }
+
+    /* check cpuid */
+    cpuid(1, &eax, &ebx, &ecx, &edx);
+    /*TODO: need difine how big difference is acceptable */
+    if (hdr.cpuid != eax)
+        printk("warnings: try to restore hvm guest(0x%"PRIx32") "
+               "on a different type processor(0x%"PRIx32").\n",
+                hdr.cpuid,
+                eax);
+
 
     /* check xen change set */
     cur_chgset = strrchr(XEN_CHANGESET, ' ');
@@ -329,16 +338,6 @@ int hvm_load(struct vcpu *v, hvm_domain_
     if ( !strcmp(cur_chgset, "unavailable") )
         printk("warnings: try to restore hvm guest when changeset is 
unavailable.\n");
 
-
-    /* check cpuid */
-    cpuid(1, &eax, &ebx, &ecx, &edx);
-    ebx = hvm_get_32u(h);
-    /*TODO: need difine how big difference is acceptable */
-    if (ebx != eax)
-        printk("warnings: try to restore hvm guest(0x%"PRIx32") "
-               "on a different type processor(0x%"PRIx32").\n",
-                ebx,
-                eax);
 
     while(1) {
         if (hvm_ctxt_end(h)) {
diff -r 1fd5f1754cea -r ff4f4596cb29 xen/include/public/hvm/save.h
--- a/xen/include/public/hvm/save.h     Sat Jan 20 11:17:41 2007 +0000
+++ b/xen/include/public/hvm/save.h     Sat Jan 20 11:17:42 2007 +0000
@@ -39,7 +39,20 @@
  * Internal mechanisms should be kept in Xen-private headers.
  */
 
-
+/* 
+ * Save/restore header
+ */
+
+#define HVM_SAVE_TYPE_HEADER 0
+
+#define HVM_FILE_MAGIC   0x54381286
+#define HVM_FILE_VERSION 0x00000001
+
+struct hvm_save_header {
+    uint32_t magic;
+    uint32_t version;
+    uint32_t cpuid;
+};
 
 /*
  * Processor

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

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