kexec: Avoid unaligned writes when producing crash info.

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>
This commit is contained in:
kfraser@localhost.localdomain committed 2007-04-24 09:48:08 +01:00
1 parent 348762501c
commit 6265f09192
1 file changed
+15 -10
+15 -10
View File
@@ -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));
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;
memset(&info, 0, sizeof(info));
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;
/* Copy from guaranteed-aligned local copy to possibly-unaligned dest. */
memcpy(out, &info, sizeof(info));
return out;
}
void kexec_crash(void)
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.