mips64 SMP patch of kexec
wilbur.chan
wilbur512 at gmail.com
Wed Oct 28 12:30:11 EDT 2009
Hi, Maxim Syrchin
I've just found your kernel patch for mips64 SMP kexec:
http://lists.infradead.org/pipermail/kexec/2008-June/001909.html
I was porting your kexec part code(excluding crash_dump ) on
xlr408 ,which is of 8 cores SMP mips64 .
I found that in machine_kexec.c ,
flush_icache_range(reboot_code_buffer, reboot_code_buffer +
KEXEC_CONTROL_CODE_SIZE);
caused an error, so I delete this line directly,although I don't know
if it would bring problem after I del it...
It is strange that , in relocate_kernel.S, the operator 'REG_L s5,
(s2)' caused an invalid access on kernel space.
If I change REG_L to ld , everything went well. So I change all the
macro such as REG_L to ld ,REG_S to sd , PTR_ADD to dadd
LONG_SUB to dsub, and SZREG to 8
At the same time , I changed the kexec_smp_wait function to a simple
loop, without checking the kexec_flag:
.globl kexec_smp_wait
kexec_smp_wait:
3: b 3b
at last , the a0,a1,a3,a4 were set to address of fw_arg0,
fw_arg1,fw_arg2,fw_arg3 respectively.
As you see, I just let one of the cpus jumps into new kernel,while the
others be in an infinite loop.
After jumped into second kernel , the code seemed to be crazy.
Firstly, the code seemd to stop before calling 'start_kernel--->
calibrate_delay ' .
However, if I added a 'printk' in any 'if branches' in
'calibrate_delay ' function , the code would stop before calling
'j start_kernel' in head.S. (This time, because printk seemed
unavailable, I wrote directlly to serial address to trace the
kernel).
I thougt it might be the problem of irq , so I added 'disable_irq(17)'
in machine_kexec before invoking reboot_code_buffer();
However, the problem was still there.
I don't know why this happedn can you give me some advice on how to
solve this , or if there were some mistake in my code ?
Thank you
regards,
wilbur
More information about the kexec
mailing list