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

Re: [Xen-devel] kexec woes with 32-bit secondary kernel



>>> On 17.09.10 at 17:49, "Jan Beulich" <JBeulich@xxxxxxxxxx> wrote:
> Ever since c/s 13829, the native (32-bit -> 32-bit) call to invoke the
> secondary kernel has been missing its fourth argument. Apparently
> this worked out because the respective stack location was non-zero.
> 
> Starting with Linux 2.6.27 (32-bit) and 2.6.30 (64-bit) a new
> argument is being expected by the secondary kernel, and again
> apparently out of pure luck the 64-bit -> 64-bit case still appears
> to work for those of our customers who want to use it.
> 
> The question really is whether this code has ever been tested
> with sufficiently recent kernels in all three variants (32->32, 64->64,
> and 64->32).
> 
> While it seems that putting together a patch to address this
> shouldn't be that difficult, a second question is how we can avoid
> getting into the same situation again when Linux extends the
> protocol again.

Below a tentative, untested patch.

Jan

--- 2010-09-20.orig/xen/arch/x86/machine_kexec.c
+++ 2010-09-20/xen/arch/x86/machine_kexec.c
@@ -23,7 +23,11 @@
 typedef void (*relocate_new_kernel_t)(
                 unsigned long indirection_page,
                 unsigned long *page_list,
-                unsigned long start_address);
+                unsigned long start_address,
+#ifdef __i386__
+                unsigned int cpu_has_pae,
+#endif
+                unsigned int preserve_context);
 
 extern int machine_kexec_get_xen(xen_kexec_range_t *range);
 
@@ -121,7 +125,11 @@ void machine_kexec(xen_kexec_image_t *im
 
         rnk = (relocate_new_kernel_t) image->page_list[1];
         (*rnk)(image->indirection_page, image->page_list,
-               image->start_address);
+               image->start_address,
+#ifdef __i386__
+               1 /* cpu_has_pae */,
+#endif
+               0 /* preserve_context */);
     }
 }
 
--- 2010-09-20.orig/xen/arch/x86/x86_64/compat_kexec.S
+++ 2010-09-20/xen/arch/x86/x86_64/compat_kexec.S
@@ -119,6 +119,7 @@ compatibility_mode:
         movl %eax, %ss
 
         /* Push arguments onto stack. */
+        pushl $0   /* 20(%esp) - preserve context */
         pushl $1   /* 16(%esp) - cpu has pae */
         pushl %ecx /* 12(%esp) - start address */
         pushl %edx /*  8(%esp) - page list */
--- 2010-09-20.orig/xen/include/asm-x86/cpufeature.h
+++ 2010-09-20/xen/include/asm-x86/cpufeature.h
@@ -139,7 +139,6 @@
 #define cpu_has_de             boot_cpu_has(X86_FEATURE_DE)
 #define cpu_has_pse            boot_cpu_has(X86_FEATURE_PSE)
 #define cpu_has_tsc            boot_cpu_has(X86_FEATURE_TSC)
-#define cpu_has_pae            boot_cpu_has(X86_FEATURE_PAE)
 #define cpu_has_pge            boot_cpu_has(X86_FEATURE_PGE)
 #define cpu_has_pat            boot_cpu_has(X86_FEATURE_PAT)
 #define cpu_has_apic           boot_cpu_has(X86_FEATURE_APIC)
@@ -165,7 +164,6 @@
 #define cpu_has_de             1
 #define cpu_has_pse            1
 #define cpu_has_tsc            1
-#define cpu_has_pae            1
 #define cpu_has_pge            1
 #define cpu_has_pat            1
 #define cpu_has_apic           boot_cpu_has(X86_FEATURE_APIC)



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


 


Rackspace

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