On Sunday 16 August 2009 06:20:56 pm wilbur.chan wrote: > Hi,Nicolas, Hi, > I've got some problem with kexec on mips32... > > > in your code for kexec on mips32, there is a relocate_new_kernel function . > > > In the end of this function , it jump to kexec_start_address by 'j s1' > > > Because I changed the kexec-tools code ,in the hope that, it > simplely passed the new kernel segment data into the old kernel.(so > I didn't pass the command-line segment in, in my code, there is just > one segment , segment[0] = kernel_data). I do not know what the kexec userland code does regarding command line, but the relocate_kernel.S code does not take any action regarding command line passing (as far as I know it is bootloader dependent). > > So I need to change register s1 to the new kernel entry address, and > jump to new kernel directly. > > > > In my vmlinux, the entry is 0x802b0000,so I let image->start = > 0x2b0000,and invoke relocate_new_kernel. Normaly the userland and sys_kexec should do the right thing in setting image->start to the entry point set in the elf header of the vmlinux file. > > However, whether I changed kexec_start_address to 0x802b0000 or > 0x2b0000 , the 'j s1' seemed taking no effect? > > (I wrote 88 to address0xa1230000 before 'j s1' , it succedd .I also > wrote 78 to address 0xa1230000 in the beginning of head.S of the new > kernel , but failed. And I reset the board to uboot mode, used 'md > 0x802b0400' to display the new kernel > in ram, it is identical to the objdump content of the vmlinux. So I > guess, this problem lays in the failing of 'j 0x802b0000' or 'j > 0x2b0000'. I don't know why 'j s1' failed , any suggestions about > this ? Thank you very much. The relocation code should really jump to 0x802b0000 address, not the 0x002b0000 address, could you please check that the machine_kexec() function is invoked with image->start set to 0x802b0000 ? The other failure causes I can think about right now are that the kernel for your board expects the bootloader to set some registers (for the command line for instance), and since the kexec code does not do this, the new kernel fails early. Regards, -- Nicolas Schichan