* [PATCH 2/6] kexec jump: check code size in control page
@ 2008-08-07 9:05 Huang Ying
2008-08-07 9:21 ` Pavel Machek
2008-08-07 13:15 ` Vivek Goyal
0 siblings, 2 replies; 6+ messages in thread
From: Huang Ying @ 2008-08-07 9:05 UTC (permalink / raw)
To: Eric W. Biederman, Pavel Machek, nigel, Rafael J. Wysocki,
Andrew Morton, Vivek Goyal, mingo, Linus Torvalds
Cc: linux-kernel, Kexec Mailing List
Kexec/Kexec-jump requires code size in control page is less than
PAGE_SIZE/2. This patch adds runtime checking for this.
Signed-off-by: Huang Ying <ying.huang@intel.com>
---
arch/x86/kernel/machine_kexec_32.c | 4 ++++
arch/x86/kernel/relocate_kernel_32.S | 3 +++
include/asm-x86/kexec.h | 1 +
3 files changed, 8 insertions(+)
--- a/arch/x86/kernel/machine_kexec_32.c
+++ b/arch/x86/kernel/machine_kexec_32.c
@@ -92,6 +92,10 @@ int machine_kexec_prepare(struct kimage
{
if (nx_enabled)
set_pages_x(image->control_code_page, 1);
+
+ BUG_ON((unsigned long)kexec_control_page_code_end - \
+ (unsigned long)relocate_kernel >= PAGE_SIZE/2);
+
return 0;
}
--- a/arch/x86/kernel/relocate_kernel_32.S
+++ b/arch/x86/kernel/relocate_kernel_32.S
@@ -376,3 +376,6 @@ swap_pages:
popl %ebx
popl %ebp
ret
+
+ .globl kexec_control_page_code_end
+kexec_control_page_code_end:
--- a/include/asm-x86/kexec.h
+++ b/include/asm-x86/kexec.h
@@ -159,6 +159,7 @@ relocate_kernel(unsigned long indirectio
unsigned long start_address,
unsigned int has_pae,
unsigned int preserve_context);
+void kexec_control_page_code_end(void);
#else
NORET_TYPE void
relocate_kernel(unsigned long indirection_page,
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 2/6] kexec jump: check code size in control page
2008-08-07 9:05 [PATCH 2/6] kexec jump: check code size in control page Huang Ying
@ 2008-08-07 9:21 ` Pavel Machek
2008-08-07 13:15 ` Vivek Goyal
1 sibling, 0 replies; 6+ messages in thread
From: Pavel Machek @ 2008-08-07 9:21 UTC (permalink / raw)
To: Huang Ying
Cc: Eric W. Biederman, nigel, Rafael J. Wysocki, Andrew Morton,
Vivek Goyal, mingo, Linus Torvalds, linux-kernel,
Kexec Mailing List
> Kexec/Kexec-jump requires code size in control page is less than
> PAGE_SIZE/2. This patch adds runtime checking for this.
>
> Signed-off-by: Huang Ying <ying.huang@intel.com>
ACK.
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 2/6] kexec jump: check code size in control page
2008-08-07 9:05 [PATCH 2/6] kexec jump: check code size in control page Huang Ying
2008-08-07 9:21 ` Pavel Machek
@ 2008-08-07 13:15 ` Vivek Goyal
2008-08-07 20:31 ` Pavel Machek
1 sibling, 1 reply; 6+ messages in thread
From: Vivek Goyal @ 2008-08-07 13:15 UTC (permalink / raw)
To: Huang Ying
Cc: Eric W. Biederman, Pavel Machek, nigel, Rafael J. Wysocki,
Andrew Morton, mingo, Linus Torvalds, linux-kernel,
Kexec Mailing List
On Thu, Aug 07, 2008 at 05:05:26PM +0800, Huang Ying wrote:
> Kexec/Kexec-jump requires code size in control page is less than
> PAGE_SIZE/2. This patch adds runtime checking for this.
>
> Signed-off-by: Huang Ying <ying.huang@intel.com>
>
> ---
> arch/x86/kernel/machine_kexec_32.c | 4 ++++
> arch/x86/kernel/relocate_kernel_32.S | 3 +++
> include/asm-x86/kexec.h | 1 +
> 3 files changed, 8 insertions(+)
>
> --- a/arch/x86/kernel/machine_kexec_32.c
> +++ b/arch/x86/kernel/machine_kexec_32.c
> @@ -92,6 +92,10 @@ int machine_kexec_prepare(struct kimage
> {
> if (nx_enabled)
> set_pages_x(image->control_code_page, 1);
> +
> + BUG_ON((unsigned long)kexec_control_page_code_end - \
> + (unsigned long)relocate_kernel >= PAGE_SIZE/2);
> +
Hi Huang,
Run time check is better than nothing but I think in this case it would
be better if we can catch it at compile time.
One of the methods will be to write a small program of your own and
put in script/ and at build time check for the size and flag error. May
be there are other better ways to do this.
Thanks
Vivek
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 2/6] kexec jump: check code size in control page
2008-08-07 13:15 ` Vivek Goyal
@ 2008-08-07 20:31 ` Pavel Machek
2008-08-08 2:44 ` Huang Ying
0 siblings, 1 reply; 6+ messages in thread
From: Pavel Machek @ 2008-08-07 20:31 UTC (permalink / raw)
To: Vivek Goyal
Cc: Huang Ying, Eric W. Biederman, nigel, Rafael J. Wysocki,
Andrew Morton, mingo, Linus Torvalds, linux-kernel,
Kexec Mailing List
Hi!
> > PAGE_SIZE/2. This patch adds runtime checking for this.
> >
> > Signed-off-by: Huang Ying <ying.huang@intel.com>
...
> > {
> > if (nx_enabled)
> > set_pages_x(image->control_code_page, 1);
> > +
> > + BUG_ON((unsigned long)kexec_control_page_code_end - \
> > + (unsigned long)relocate_kernel >= PAGE_SIZE/2);
> > +
>
> Run time check is better than nothing but I think in this case it would
> be better if we can catch it at compile time.
>
> One of the methods will be to write a small program of your own and
> put in script/ and at build time check for the size and flag error. May
> be there are other better ways to do this.
BUILD_BUG_ON()?
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 2/6] kexec jump: check code size in control page
2008-08-07 20:31 ` Pavel Machek
@ 2008-08-08 2:44 ` Huang Ying
2008-08-08 13:52 ` Vivek Goyal
0 siblings, 1 reply; 6+ messages in thread
From: Huang Ying @ 2008-08-08 2:44 UTC (permalink / raw)
To: Pavel Machek
Cc: Vivek Goyal, Eric W. Biederman, nigel, Rafael J. Wysocki,
Andrew Morton, mingo, Linus Torvalds, linux-kernel,
Kexec Mailing List
On Thu, 2008-08-07 at 22:31 +0200, Pavel Machek wrote:
> Hi!
>
> > > PAGE_SIZE/2. This patch adds runtime checking for this.
> > >
> > > Signed-off-by: Huang Ying <ying.huang@intel.com>
> ...
>
> > > {
> > > if (nx_enabled)
> > > set_pages_x(image->control_code_page, 1);
> > > +
> > > + BUG_ON((unsigned long)kexec_control_page_code_end - \
> > > + (unsigned long)relocate_kernel >= PAGE_SIZE/2);
> > > +
> >
>
> > Run time check is better than nothing but I think in this case it would
> > be better if we can catch it at compile time.
> >
> > One of the methods will be to write a small program of your own and
> > put in script/ and at build time check for the size and flag error. May
> > be there are other better ways to do this.
>
> BUILD_BUG_ON()?
I tried with BUILD_BUG_ON(), and compiling is OK for both of following
statement:
BUILD_BUG_ON((unsigned long)kexec_control_page_code_end - \
(unsigned long)relocate_kernel >= PAGE_SIZE/2);
BUILD_BUG_ON((unsigned long)kexec_control_page_code_end - \
(unsigned long)relocate_kernel < PAGE_SIZE/2);
In general, I think value of kexec_control_page_code_end and
relocate_kernel is not determined during compiling time. So
BUILD_BUG_ON() doesn't work.
Another idea, use ASSERT() command of ld link script as in the following
patch:
--- a/arch/x86/kernel/vmlinux_32.lds.S
+++ b/arch/x86/kernel/vmlinux_32.lds.S
@@ -209,3 +209,5 @@ SECTIONS
DWARF_DEBUG
}
+
+#include "vmlinux_check_32.lds.S"
--- /dev/null
+++ b/arch/x86/kernel/vmlinux_check_32.lds.S
@@ -0,0 +1,3 @@
+#include <asm/kexec.h>
+
+ASSERT(kexec_control_page_code_end - relocate_kernel >= 2048, "kexec control page code size is too big")
It works for me. What do you think about that?
Best Regards,
Huang Ying
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 2/6] kexec jump: check code size in control page
2008-08-08 2:44 ` Huang Ying
@ 2008-08-08 13:52 ` Vivek Goyal
0 siblings, 0 replies; 6+ messages in thread
From: Vivek Goyal @ 2008-08-08 13:52 UTC (permalink / raw)
To: Huang Ying
Cc: Pavel Machek, Eric W. Biederman, nigel, Rafael J. Wysocki,
Andrew Morton, mingo, Linus Torvalds, linux-kernel,
Kexec Mailing List
On Fri, Aug 08, 2008 at 10:44:37AM +0800, Huang Ying wrote:
> On Thu, 2008-08-07 at 22:31 +0200, Pavel Machek wrote:
> > Hi!
> >
> > > > PAGE_SIZE/2. This patch adds runtime checking for this.
> > > >
> > > > Signed-off-by: Huang Ying <ying.huang@intel.com>
> > ...
> >
> > > > {
> > > > if (nx_enabled)
> > > > set_pages_x(image->control_code_page, 1);
> > > > +
> > > > + BUG_ON((unsigned long)kexec_control_page_code_end - \
> > > > + (unsigned long)relocate_kernel >= PAGE_SIZE/2);
> > > > +
> > >
> >
> > > Run time check is better than nothing but I think in this case it would
> > > be better if we can catch it at compile time.
> > >
> > > One of the methods will be to write a small program of your own and
> > > put in script/ and at build time check for the size and flag error. May
> > > be there are other better ways to do this.
> >
> > BUILD_BUG_ON()?
>
> I tried with BUILD_BUG_ON(), and compiling is OK for both of following
> statement:
>
> BUILD_BUG_ON((unsigned long)kexec_control_page_code_end - \
> (unsigned long)relocate_kernel >= PAGE_SIZE/2);
>
> BUILD_BUG_ON((unsigned long)kexec_control_page_code_end - \
> (unsigned long)relocate_kernel < PAGE_SIZE/2);
>
> In general, I think value of kexec_control_page_code_end and
> relocate_kernel is not determined during compiling time. So
> BUILD_BUG_ON() doesn't work.
>
> Another idea, use ASSERT() command of ld link script as in the following
> patch:
>
> --- a/arch/x86/kernel/vmlinux_32.lds.S
> +++ b/arch/x86/kernel/vmlinux_32.lds.S
> @@ -209,3 +209,5 @@ SECTIONS
>
> DWARF_DEBUG
> }
> +
> +#include "vmlinux_check_32.lds.S"
> --- /dev/null
> +++ b/arch/x86/kernel/vmlinux_check_32.lds.S
> @@ -0,0 +1,3 @@
> +#include <asm/kexec.h>
> +
> +ASSERT(kexec_control_page_code_end - relocate_kernel >= 2048, "kexec control page code size is too big")
>
>
Use of ASSERT() looks good to me. I think creation of extra file for a
single ASSERT() can be avoided. Instead, we can just put this assert in
vmlinux_32.lds.S itself?
Thansk
Vivek
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2008-08-08 13:53 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-08-07 9:05 [PATCH 2/6] kexec jump: check code size in control page Huang Ying
2008-08-07 9:21 ` Pavel Machek
2008-08-07 13:15 ` Vivek Goyal
2008-08-07 20:31 ` Pavel Machek
2008-08-08 2:44 ` Huang Ying
2008-08-08 13:52 ` Vivek Goyal
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox