|  |  | 
  
    |  |  | 
 
  |   |  | 
  
    |  |  | 
  
    |  |  | 
  
    |   xen-devel
[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
 | 
 
| <Prev in Thread] | Current Thread | [Next in Thread> |  | 
[Xen-devel] [PATCH] Unaligned access in kexec_crash_save_cpu(),
Simon Horman <=
 |  |  | 
  
    |  |  |