lkml.org 
[lkml]   [2016]   [Aug]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 3/5] x86/boot: Defer setup_real_mode() to early_initcall time
    Date
    There's no need to run setup_real_mode() as early as we run it.
    Defer it to the same early_initcall that sets up the page
    permissions for the real mode code.

    This should be a code size reduction. More importantly, it give us
    a longer window in which we can allocate the real mode trampoline.

    Signed-off-by: Andy Lutomirski <luto@kernel.org>
    ---
    arch/x86/include/asm/realmode.h | 1 -
    arch/x86/kernel/setup.c | 2 --
    arch/x86/realmode/init.c | 15 ++++++++++++---
    3 files changed, 12 insertions(+), 6 deletions(-)

    diff --git a/arch/x86/include/asm/realmode.h b/arch/x86/include/asm/realmode.h
    index 9c6b890d5e7a..8d6777724ba4 100644
    --- a/arch/x86/include/asm/realmode.h
    +++ b/arch/x86/include/asm/realmode.h
    @@ -59,6 +59,5 @@ extern unsigned char secondary_startup_64[];
    #endif

    void reserve_real_mode(void);
    -void setup_real_mode(void);

    #endif /* _ARCH_X86_REALMODE_H */
    diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
    index 47006b28cac4..c39a4a28fea1 100644
    --- a/arch/x86/kernel/setup.c
    +++ b/arch/x86/kernel/setup.c
    @@ -1137,8 +1137,6 @@ void __init setup_arch(char **cmdline_p)
    /* A CPU has %cr4 if and only if it has CPUID. */
    mmu_cr4_features = __read_cr4();

    - setup_real_mode();
    -
    memblock_set_current_limit(get_max_mapped());

    /*
    diff --git a/arch/x86/realmode/init.c b/arch/x86/realmode/init.c
    index c5bdc4e473e7..747b71e8f547 100644
    --- a/arch/x86/realmode/init.c
    +++ b/arch/x86/realmode/init.c
    @@ -30,7 +30,7 @@ void __init reserve_real_mode(void)
    base, (unsigned long long)mem, size);
    }

    -void __init setup_real_mode(void)
    +static void __init setup_real_mode(void)
    {
    u16 real_mode_seg;
    const u32 *rel;
    @@ -101,7 +101,7 @@ void __init setup_real_mode(void)
    * need to mark it executable at do_pre_smp_initcalls() at least,
    * thus run it as a early_initcall().
    */
    -static int __init set_real_mode_permissions(void)
    +static void __init set_real_mode_permissions(void)
    {
    unsigned char *base = (unsigned char *) real_mode_header;
    size_t size = PAGE_ALIGN(real_mode_blob_end - real_mode_blob);
    @@ -120,7 +120,16 @@ static int __init set_real_mode_permissions(void)
    set_memory_nx((unsigned long) base, size >> PAGE_SHIFT);
    set_memory_ro((unsigned long) base, ro_size >> PAGE_SHIFT);
    set_memory_x((unsigned long) text_start, text_size >> PAGE_SHIFT);
    +}
    +
    +static int __init init_real_mode(void)
    +{
    + if (!real_mode_header)
    + panic("Real mode trampoline was not allocated");
    +
    + setup_real_mode();
    + set_real_mode_permissions();

    return 0;
    }
    -early_initcall(set_real_mode_permissions);
    +early_initcall(init_real_mode);
    --
    2.7.4
    \
     
     \ /
      Last update: 2016-08-10 22:41    [W:3.253 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site