[PATCH 2/6] kexec jump: check code size in control page - Kernel

This is a discussion on [PATCH 2/6] kexec jump: check code size in control page - Kernel ; 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 --- 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(+) --- ...

+ Reply to Thread
Results 1 to 6 of 6

Thread: [PATCH 2/6] kexec jump: check code size in control page

  1. [PATCH 2/6] kexec jump: check code size in control page

    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

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


    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  2. Re: [PATCH 2/6] kexec jump: check code size in control page

    > 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


    ACK.

    --
    (english) http://www.livejournal.com/~pavelmachek
    (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pav...rses/blog.html
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  3. Re: [PATCH 2/6] kexec jump: check code size in control page

    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
    >
    > ---
    > 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
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  4. Re: [PATCH 2/6] kexec jump: check code size in control page

    Hi!

    > > PAGE_SIZE/2. This patch adds runtime checking for this.
    > >
    > > Signed-off-by: Huang Ying

    ....

    > > {
    > > 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/~pav...rses/blog.html
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  5. Re: [PATCH 2/6] kexec jump: check code size in control page

    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

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


    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  6. Re: [PATCH 2/6] kexec jump: check code size in control page

    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

    > > ...
    > >
    > > > > {
    > > > > 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
    > +
    > +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
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

+ Reply to Thread