diff options
author | Terry Loftin <terry.loftin@hp.com> | 2006-10-11 16:40:51 -0600 |
---|---|---|
committer | Simon Horman <horms@verge.net.au> | 2006-10-12 10:18:30 +0900 |
commit | 13882ab8fd1261c378de648bbcc1ed21822a2121 (patch) | |
tree | fdb59fcda313b273d681bbfb4e51de619a7fb70c /purgatory | |
parent | 16ec25bd77ba2c4ff1793bd588d5c87fc310485e (diff) |
kexec-tools: ia64: icache flush should align to 32-bytes
Hi,
I've run into problems testing kexec/kdump on a Montecito revision C
processor. In purgatory, __dummy_efi_function is copied onto the end of
the command line boot parameter (command_line + command_line_len) and this
address is used to replace the EFI call to set_virtual_address_map(). The
copied range is then icache flushed.
The destination address is aligned to 16-bytes (in kexec-elf-ia64.c), but
the fc.i instruction flushes a 32-byte range "associated" with that
address. When my command line length is 16-byte aligned but not 32-byte
aligned, this results in the first 16-bytes of __dummy_efi_function getting
flushed (and the 16 bytes prior to that), but the second half of the
function (the part with the br.ret) does not get flushed. kdump then hangs
in purgatory. By adding a few spaces to my command line, it becomes both
16 and 32-byte aligned, and kdump works.
This patch makes icache_flush_range() align the start address to 32-bytes
and account for the difference. The patch is against Horms
kexec-tools-testing tree. As a side note, you could also fix this by just
adding 32 to the length passed to flush_icache_range() but that hides the
dependent behavior.
Thanks,
-T
It seems I was always testing with command line more than 16 bytes
length.....
Thanks.
Acked-by: Zou Nan hai <nanhai.zou@intel.com>
Manually applied - not sure why that was neccessary.
Signed-Off-By: Simon Horman <horms@verge.net.au>
Diffstat (limited to 'purgatory')
-rw-r--r-- | purgatory/arch/ia64/purgatory-ia64.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/purgatory/arch/ia64/purgatory-ia64.c b/purgatory/arch/ia64/purgatory-ia64.c index bd54946..de71b98 100644 --- a/purgatory/arch/ia64/purgatory-ia64.c +++ b/purgatory/arch/ia64/purgatory-ia64.c @@ -222,7 +222,9 @@ patch_efi_memmap(struct kexec_boot_params *params, void flush_icache_range(char *start, unsigned long len) { - unsigned long i; + unsigned long i, addr; + addr = (unsigned long)start & ~31UL; + len += (unsigned long)start - addr; for (i = 0;i < len; i += 32) asm volatile("fc.i %0"::"r"(start + i):"memory"); asm volatile (";;sync.i;;":::"memory"); |