]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/xen.git/commitdiff
kexec: add more pages to v1 environment
authorJan Beulich <jbeulich@suse.com>
Tue, 9 Jun 2015 14:00:24 +0000 (16:00 +0200)
committerJan Beulich <jbeulich@suse.com>
Tue, 9 Jun 2015 14:00:24 +0000 (16:00 +0200)
Destination pages need mappings to be added to the page tables in the
v1 case (where nothing else calls machine_kexec_add_page() for them).

Further, without the tools mapping the low 1Mb (expected by at least
some Linux version), we need to do so in the hypervisor in the v1 case.

Suggested-by: David Vrabel <david.vrabel@citrix.com>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Tested-by: Alan Robinson <alan.robinson@ts.fujitsu.com>
Reviewed-by: David Vrabel <david.vrabel@citrix.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
xen/common/kexec.c
xen/common/kimage.c

index 3b4275e7365a451cf65bfe176e03445cdc948364..1e4a66775a4947736ff938c76e7e2f683e05ba52 100644 (file)
@@ -1003,6 +1003,24 @@ static int kexec_do_load_v1(xen_kexec_load_v1_t *load, int compat)
     if ( ret < 0 )
         goto error;
 
+    if ( arch == EM_386 || arch == EM_X86_64 )
+    {
+        /*
+         * Ensure 0 - 1 MiB is mapped and accessible by the image.
+         *
+         * This allows access to VGA memory and the region purgatory copies
+         * in the crash case.
+         */
+        unsigned long addr;
+
+        for ( addr = 0; addr < MB(1); addr += PAGE_SIZE )
+        {
+            ret = machine_kexec_add_page(kimage, addr, addr);
+            if ( ret < 0 )
+                goto error;
+        }
+    }
+
     ret = kexec_load_slot(kimage);
     if ( ret < 0 )
         goto error;
index 9b79a5ed29ff929200a3c76f866e83e27e17e24c..8c4854d679861c59f3d1b204d28b1ba7621b3bfc 100644 (file)
@@ -923,6 +923,11 @@ int kimage_build_ind(struct kexec_image *image, unsigned long ind_mfn,
             ret = kimage_add_page(image, page_to_maddr(xen_page));
             if ( ret < 0 )
                 goto done;
+
+            ret = machine_kexec_add_page(image, dest, dest);
+            if ( ret < 0 )
+                goto done;
+
             dest += PAGE_SIZE;
             break;
         }