[HVM] save/restore fix
authorkaf24@localhost.localdomain <kaf24@localhost.localdomain>
Sun, 28 Jan 2007 09:46:09 +0000 (09:46 +0000)
committerkaf24@localhost.localdomain <kaf24@localhost.localdomain>
Sun, 28 Jan 2007 09:46:09 +0000 (09:46 +0000)
* do not save "down" vcpu's vmcs to avoid system crash
* make hvm_ctxt buffer bigger as all vmcs sit here, otherwise >=4
* vcpus cause overflow

Signed-off-by: Zhai Edwin <edwin.zhai@intel.com>
xen/arch/x86/hvm/hvm.c
xen/include/public/domctl.h

index 5676a9ad80f97efc3e0d97e094bf8ae2905af3e3..d863ac769d1902c1f0f84230b93f0e8e862d7afb 100644 (file)
@@ -189,10 +189,27 @@ void hvm_domain_destroy(struct domain *d)
         unmap_domain_page_global((void *)d->arch.hvm_domain.buffered_io_va);
 }
 
+#define HVM_VCPU_CTXT_MAGIC 0x85963130
+void hvm_save_cpu_ctxt(hvm_domain_context_t *h, void *opaque)
+{
+    struct vcpu *v = opaque;
+
+    if ( test_bit(_VCPUF_down, &v->vcpu_flags) ) {
+        hvm_put_32u(h, 0x0);
+        return;
+    }
+
+    hvm_put_32u(h, HVM_VCPU_CTXT_MAGIC);
+    hvm_funcs.save_cpu_ctxt(h, opaque);
+}
+
 int hvm_load_cpu_ctxt(hvm_domain_context_t *h, void *opaque, int version)
 {
     struct vcpu *v = opaque;
 
+    if ( hvm_get_32u(h) != HVM_VCPU_CTXT_MAGIC )
+        return 0;
+
     if ( hvm_funcs.load_cpu_ctxt(h, opaque, version) < 0 )
         return -EINVAL;
 
@@ -208,7 +225,7 @@ int hvm_vcpu_initialise(struct vcpu *v)
     int rc;
 
     hvm_register_savevm(v->domain, "xen_hvm_cpu", v->vcpu_id, 1,
-                        hvm_funcs.save_cpu_ctxt, hvm_load_cpu_ctxt, 
+                        hvm_save_cpu_ctxt, hvm_load_cpu_ctxt, 
                         (void *)v);
 
     if ( (rc = vlapic_init(v)) != 0 )
index 539cb911910c08b3deb61c956dc6dc5a318dbad9..ad255f24d1f6355f009fe0782ce49f254cdb99b1 100644 (file)
@@ -386,7 +386,7 @@ struct xen_domctl_settimeoffset {
 typedef struct xen_domctl_settimeoffset xen_domctl_settimeoffset_t;
 DEFINE_XEN_GUEST_HANDLE(xen_domctl_settimeoffset_t);
  
-#define HVM_CTXT_SIZE        6144
+#define HVM_CTXT_SIZE        8192
 typedef struct hvm_domain_context {
     uint32_t cur;
     uint32_t size;