[PATCH] kexec based hibernation: a prototype of kexec multi-stage load
Eric W. Biederman
ebiederm at xmission.com
Thu May 15 14:39:47 EDT 2008
"Huang, Ying" <ying.huang at intel.com> writes:
> On Wed, 2008-05-14 at 14:43 -0700, Eric W. Biederman wrote:
>> Then as a preliminary design let's plan on this.
>> - Pass the rentry point as the return address (using the C ABI).
>> We may want to load the stack pointer etc so we can act as
>> a direct entry point for new code.
> There are some issues about passing entry point as return address. The
> kexec jump (or kexec with return) is used for
> - Switching between original kernel (A) and kexeced kernel (B)
> - Call some code (such as BIOS code) in physical mode
> 1) When call some code in physical mode, the called code can use a
> simple return to return to kernel A. So there is no return address on
> stack after return to kernel A. Instead, argument 1 is on stack top.
> 2) When switch back from kernel B to kernel A, kernel B will call the
> jump back entry of kernel A with C ABI. So, the return address is on
> stack top. And kernel A get jump back entry of kernel B via the return
> Because the stack state is different between 1) and 2), the jump back
> entry of kernel A should distinguish them.
Yes. Because the stack state is different we need to be careful.
However I don't see that we care how we got to the proper piece of
code. If we don't care we don't need to distinguish them.
Therefore I see two possible solutions.
1) Write a tiny trampoline that goes in the core file to keep
the calling conventions sane.
2) After we figure out our address read the stack pointer from
a fixed location and simply set it. (This is my preference)
More information about the kexec