x86/idt: Cleanup trap_init()
authorThomas Gleixner <tglx@linutronix.de>
Thu, 28 May 2020 14:53:19 +0000 (16:53 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 11 Jun 2020 13:15:26 +0000 (15:15 +0200)
No point in having all the IDT cruft in trap_init(). Move it into the IDT
code and fixup the comments.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lkml.kernel.org/r/20200528145522.992376498@linutronix.de
arch/x86/kernel/idt.c
arch/x86/kernel/traps.c

index b6e1a87..902cdd0 100644 (file)
@@ -4,6 +4,7 @@
  */
 #include <linux/interrupt.h>
 
+#include <asm/cpu_entry_area.h>
 #include <asm/traps.h>
 #include <asm/proto.h>
 #include <asm/desc.h>
@@ -281,6 +282,19 @@ void __init idt_setup_ist_traps(void)
 }
 #endif
 
+static void __init idt_map_in_cea(void)
+{
+       /*
+        * Set the IDT descriptor to a fixed read-only location in the cpu
+        * entry area, so that the "sidt" instruction will not leak the
+        * location of the kernel, and to defend the IDT against arbitrary
+        * memory write vulnerabilities.
+        */
+       cea_set_pte(CPU_ENTRY_AREA_RO_IDT_VADDR, __pa_symbol(idt_table),
+                   PAGE_KERNEL_RO);
+       idt_descr.address = CPU_ENTRY_AREA_RO_IDT;
+}
+
 /**
  * idt_setup_apic_and_irq_gates - Setup APIC/SMP and normal interrupt gates
  */
@@ -307,6 +321,10 @@ void __init idt_setup_apic_and_irq_gates(void)
                set_intr_gate(i, entry);
        }
 #endif
+       /* Map IDT into CPU entry area and reload it. */
+       idt_map_in_cea();
+       load_idt(&idt_descr);
+
        idt_setup_done = true;
 }
 
index 79af913..5566fe5 100644 (file)
@@ -1055,15 +1055,6 @@ void __init trap_init(void)
 
        idt_setup_traps();
 
-       /*
-        * Set the IDT descriptor to a fixed read-only location, so that the
-        * "sidt" instruction will not leak the location of the kernel, and
-        * to defend the IDT against arbitrary memory write vulnerabilities.
-        * It will be reloaded in cpu_init() */
-       cea_set_pte(CPU_ENTRY_AREA_RO_IDT_VADDR, __pa_symbol(idt_table),
-                   PAGE_KERNEL_RO);
-       idt_descr.address = CPU_ENTRY_AREA_RO_IDT;
-
        /*
         * Should be a barrier for any external CPU state:
         */