lkml.org 
[lkml]   [2017]   [Oct]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:x86/urgent] x86/idt: Initialize early IDT before cr4_init_shadow()
    Commit-ID:  9c48c0965b97e14ddcf75490a754e84e05aaa062
    Gitweb: https://git.kernel.org/tip/9c48c0965b97e14ddcf75490a754e84e05aaa062
    Author: Thomas Gleixner <tglx@linutronix.de>
    AuthorDate: Mon, 16 Oct 2017 12:12:16 +0200
    Committer: Thomas Gleixner <tglx@linutronix.de>
    CommitDate: Mon, 16 Oct 2017 20:47:37 +0200

    x86/idt: Initialize early IDT before cr4_init_shadow()

    Moving the early IDT setup out of assembly code breaks the boot on first
    generation 486 systems.

    The reason is that the call of idt_setup_early_handler, which sets up the
    early handlers was added after the call to cr4_init_shadow().

    cr4_init_shadow() tries to read CR4 which is not available on those
    systems. The accessor function uses a extable fixup to handle the resulting
    fault. As the IDT is not set up yet, the cr4 read exception causes an
    instantaneous reboot for obvious reasons.

    Call idt_setup_early_handler() before cr4_init_shadow() so IDT is set up
    before the first exception hits.

    Fixes: 87e81786b13b ("x86/idt: Move early IDT setup out of 32-bit asm")
    Reported-and-tested-by: Matthew Whitehead <whiteheadm@acm.org>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Andy Lutomirski <luto@kernel.org>
    Link: https://lkml.kernel.org/r/alpine.DEB.2.20.1710161210290.1973@nanos

    ---
    arch/x86/kernel/head32.c | 5 +++--
    1 file changed, 3 insertions(+), 2 deletions(-)

    diff --git a/arch/x86/kernel/head32.c b/arch/x86/kernel/head32.c
    index cf2ce06..2902ca4 100644
    --- a/arch/x86/kernel/head32.c
    +++ b/arch/x86/kernel/head32.c
    @@ -30,10 +30,11 @@ static void __init i386_default_early_setup(void)

    asmlinkage __visible void __init i386_start_kernel(void)
    {
    - cr4_init_shadow();
    -
    + /* Make sure IDT is set up before any exception happens */
    idt_setup_early_handler();

    + cr4_init_shadow();
    +
    sanitize_boot_params(&boot_params);

    x86_early_init_platform_quirks();
    \
     
     \ /
      Last update: 2017-10-16 20:55    [W:4.987 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site