public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [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