Simon Horman
2007-Apr-23 07:40 UTC
[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@verge.net.au> --- 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@lists.xensource.com http://lists.xensource.com/xen-devel