[Top] [All Lists]

Re: kexec on mips failed

To: "wilbur.chan" <>
Subject: Re: kexec on mips failed
From: Nicolas Schichan <>
Date: Fri, 28 Aug 2009 15:54:53 +0200
In-reply-to: <>
Organization: Freebox
Original-recipient: rfc822;
References: <>
User-agent: KMail/1.11.2 (Linux/2.6.28-14-generic; KDE/4.2.2; x86_64; ; )
On Sunday 16 August 2009 06:20:56 pm wilbur.chan wrote:
> Hi,Nicolas,


> 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

> 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.


Nicolas Schichan

<Prev in Thread] Current Thread [Next in Thread>