hvm: Fix the realmode live migration issue with Intel EPT
authorKeir Fraser <keir.fraser@citrix.com>
Fri, 13 Jun 2008 09:13:25 +0000 (10:13 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Fri, 13 Jun 2008 09:13:25 +0000 (10:13 +0100)
The patch save/restore the HVM_PARAM_IDENT_PT parameter, then the live
migration during real mode with EPT may work fine.

Signed-off-by: Xiaohui Xin <Xiaohui.xin@intel.com>
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
tools/libxc/xc_domain_restore.c
tools/libxc/xc_domain_save.c

index b7b74352e1ac60f819199365176dd16e6ea90ddc..46859f63cfa1a6907212604b65f3d52c42516ebd 100644 (file)
@@ -474,6 +474,22 @@ int xc_domain_restore(int xc_handle, int io_fd, uint32_t dom,
             continue;
         }
 
+        if ( j == -3 )
+        {
+            uint64_t ident_pt;
+
+            /* Skip padding 4 bytes then read the EPT identity PT location. */
+            if ( read_exact(io_fd, &ident_pt, sizeof(uint32_t)) ||
+                 read_exact(io_fd, &ident_pt, sizeof(uint64_t)) )
+            {
+                ERROR("error read the address of the EPT identity map");
+                goto out;
+            }
+
+            xc_set_hvm_param(xc_handle, dom, HVM_PARAM_IDENT_PT, ident_pt);
+            continue;
+        }
+
         if ( j == 0 )
             break;  /* our work here is done */
 
index 636bb78e7f4914f779351234b9ba8f6124a4724b..7b8a1317a49d6facab6f344a5d6358324188d89f 100644 (file)
@@ -1429,6 +1429,25 @@ int xc_domain_save(int xc_handle, int io_fd, uint32_t dom, uint32_t max_iters,
         }
     }
 
+    if ( hvm )
+    {
+        struct {
+            int minusthree;
+            uint32_t pad;
+            uint64_t ident_pt;
+        } chunk = { -3, 0 };
+
+        xc_get_hvm_param(xc_handle, dom, HVM_PARAM_IDENT_PT,
+                         (unsigned long *)&chunk.ident_pt);
+
+        if ( (chunk.ident_pt != 0) &&
+             write_exact(io_fd, &chunk, sizeof(chunk)) )
+        {
+            PERROR("Error when writing the ident_pt for EPT guest");
+            goto out;
+        }
+    }
+
     /* Zero terminate */
     i = 0;
     if ( write_exact(io_fd, &i, sizeof(int)) )