[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <1210827473.23707.133.camel@caritas-dev.intel.com>
Date: Thu, 15 May 2008 12:57:53 +0800
From: "Huang, Ying" <ying.huang@...el.com>
To: "Eric W. Biederman" <ebiederm@...ssion.com>
CC: Vivek Goyal <vgoyal@...hat.com>, Pavel Machek <pavel@....cz>,
nigel@...el.suspend2.net, "Rafael J. Wysocki" <rjw@...k.pl>,
Andrew Morton <akpm@...ux-foundation.org>,
linux-kernel@...r.kernel.org,
Kexec Mailing List <kexec@...ts.infradead.org>
Subject: Re: [PATCH] kexec based hibernation: a prototype of kexec
multi-stage load
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
address.
Because the stack state is different between 1) and 2), the jump back
entry of kernel A should distinguish them. Possible solution can be as
follow:
a) Before kernel A call some physical mode code or kernel B, it set
argument 1 to be a magic number that can not be return address (such as
-1). Jump back entry of kernel A can check whether the stack top is
argument 1 or return address.
b) Distinguish by return address. Such as, called physical mode code
must return 0, while kernel B must set %eax to some other number.
c) Use different entry point for 1) and 2). Two entry points are deduced
from return address. Such as:
entry1 = return_address;
entry2 = return_address & ~0xfff; /* page aligned */
entry1 is used by physical mode code. entry2 is used by kernel B.
Which one is better? Or some other solution?
Best Regards,
Huang Ying
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists