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

[Xen-devel] [PATCH] Unaligned access in kexec_crash_save_cpu()



The alignment of info is 32bits in line with the elf specification.
This means that on 64 bit architectures accessing it directly may
result unaligned access and a panic. I have been experiencing
this on IA64.

It seems that a simple approach of having an crash_xen_info_t on
the stack and simply memcopying it into info at the end alleviates
the problem. 

Signed-off-by: Simon Horman <horms@xxxxxxxxxxxx>

--- 
Tested on xen-ia64-unstable 14854:039daabebad5

Index: xen-ia64-unstable-14854/xen/common/kexec.c
===================================================================
--- xen-ia64-unstable-14854.orig/xen/common/kexec.c     2007-04-23 
15:55:34.000000000 +0900
+++ xen-ia64-unstable-14854/xen/common/kexec.c  2007-04-23 15:56:14.000000000 
+0900
@@ -81,20 +81,25 @@ void kexec_crash_save_cpu(void)
 crash_xen_info_t *kexec_crash_save_info(void)
 {
     int cpu = smp_processor_id();
-    crash_xen_info_t *info = (crash_xen_info_t *)ELFNOTE_DESC(xen_crash_note);
+    crash_xen_info_t info;
+    crash_xen_info_t *out = (crash_xen_info_t *)ELFNOTE_DESC(xen_crash_note);
 
     BUG_ON(!cpu_test_and_set(cpu, crash_saved_cpus));
+    memset(&info, 0, sizeof(crash_xen_info_t));
 
-    info->xen_major_version = xen_major_version();
-    info->xen_minor_version = xen_minor_version();
-    info->xen_extra_version = __pa(xen_extra_version());
-    info->xen_changeset = __pa(xen_changeset());
-    info->xen_compiler = __pa(xen_compiler());
-    info->xen_compile_date = __pa(xen_compile_date());
-    info->xen_compile_time = __pa(xen_compile_time());
-    info->tainted = tainted;
+    info.xen_major_version = xen_major_version();
+    info.xen_minor_version = xen_minor_version();
+    info.xen_extra_version = __pa(xen_extra_version());
+    info.xen_changeset = __pa(xen_changeset());
+    info.xen_compiler = __pa(xen_compiler());
+    info.xen_compile_date = __pa(xen_compile_date());
+    info.xen_compile_time = __pa(xen_compile_time());
+    info.tainted = tainted;
 
-    return info;
+    /* Info is not be word aligned on 64 bit architectures */
+    memcpy(out, &info, sizeof(crash_xen_info_t));
+
+    return out;
 }
 
 void kexec_crash(void)

_______________________________________________
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®.