Some idt routines can be reused in early boot stage. Splitting them out.

Signed-off-by: Pingfan Liu <kernelf...@gmail.com>
Cc: Thomas Gleixner <t...@linutronix.de>
Cc: Ingo Molnar <mi...@redhat.com>
Cc: Borislav Petkov <b...@alien8.de>
Cc: "H. Peter Anvin" <h...@zytor.com>
Cc: "Kirill A. Shutemov" <kirill.shute...@linux.intel.com>
Cc: Cao jin <caoj.f...@cn.fujitsu.com>
Cc: Wei Huang <w...@redhat.com>
Cc: Chao Fan <fanc.f...@cn.fujitsu.com>
Cc: Nicolai Stange <nsta...@suse.de>
Cc: Dou Liyang <douly.f...@cn.fujitsu.com>
Cc: linux-kernel@vger.kernel.org
---
 arch/x86/include/asm/idt.h | 64 ++++++++++++++++++++++++++++++++++++++++++++++
 arch/x86/kernel/idt.c      | 58 +----------------------------------------
 2 files changed, 65 insertions(+), 57 deletions(-)
 create mode 100644 arch/x86/include/asm/idt.h

diff --git a/arch/x86/include/asm/idt.h b/arch/x86/include/asm/idt.h
new file mode 100644
index 0000000..147f128
--- /dev/null
+++ b/arch/x86/include/asm/idt.h
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _ASM_X86_IDT_H
+#define _ASM_X86_IDT_H
+
+#include <asm/desc_defs.h>
+
+struct idt_data {
+       unsigned int    vector;
+       unsigned int    segment;
+       struct idt_bits bits;
+       const void      *addr;
+};
+
+#define DPL0           0x0
+#define DPL3           0x3
+
+#define DEFAULT_STACK  0
+
+#define G(_vector, _addr, _ist, _type, _dpl, _segment) \
+       {                                               \
+               .vector         = _vector,              \
+               .bits.ist       = _ist,                 \
+               .bits.type      = _type,                \
+               .bits.dpl       = _dpl,                 \
+               .bits.p         = 1,                    \
+               .addr           = _addr,                \
+               .segment        = _segment,             \
+       }
+
+/* Interrupt gate */
+#define INTG(_vector, _addr)                           \
+       G(_vector, _addr, DEFAULT_STACK, GATE_INTERRUPT, DPL0, __KERNEL_CS)
+
+/* System interrupt gate */
+#define SYSG(_vector, _addr)                           \
+       G(_vector, _addr, DEFAULT_STACK, GATE_INTERRUPT, DPL3, __KERNEL_CS)
+
+/* Interrupt gate with interrupt stack */
+#define ISTG(_vector, _addr, _ist)                     \
+       G(_vector, _addr, _ist, GATE_INTERRUPT, DPL0, __KERNEL_CS)
+
+/* System interrupt gate with interrupt stack */
+#define SISTG(_vector, _addr, _ist)                    \
+       G(_vector, _addr, _ist, GATE_INTERRUPT, DPL3, __KERNEL_CS)
+
+/* Task gate */
+#define TSKG(_vector, _gdt)                            \
+       G(_vector, NULL, DEFAULT_STACK, GATE_TASK, DPL0, _gdt << 3)
+
+static inline void idt_init_desc(gate_desc *gate, const struct idt_data *d)
+{
+       unsigned long addr = (unsigned long) d->addr;
+
+       gate->offset_low        = (u16) addr;
+       gate->segment           = (u16) d->segment;
+       gate->bits              = d->bits;
+       gate->offset_middle     = (u16) (addr >> 16);
+#ifdef CONFIG_X86_64
+       gate->offset_high       = (u32) (addr >> 32);
+       gate->reserved          = 0;
+#endif
+}
+
+#endif
diff --git a/arch/x86/kernel/idt.c b/arch/x86/kernel/idt.c
index 01adea2..80b811a 100644
--- a/arch/x86/kernel/idt.c
+++ b/arch/x86/kernel/idt.c
@@ -9,49 +9,7 @@
 #include <asm/proto.h>
 #include <asm/desc.h>
 #include <asm/hw_irq.h>
-
-struct idt_data {
-       unsigned int    vector;
-       unsigned int    segment;
-       struct idt_bits bits;
-       const void      *addr;
-};
-
-#define DPL0           0x0
-#define DPL3           0x3
-
-#define DEFAULT_STACK  0
-
-#define G(_vector, _addr, _ist, _type, _dpl, _segment) \
-       {                                               \
-               .vector         = _vector,              \
-               .bits.ist       = _ist,                 \
-               .bits.type      = _type,                \
-               .bits.dpl       = _dpl,                 \
-               .bits.p         = 1,                    \
-               .addr           = _addr,                \
-               .segment        = _segment,             \
-       }
-
-/* Interrupt gate */
-#define INTG(_vector, _addr)                           \
-       G(_vector, _addr, DEFAULT_STACK, GATE_INTERRUPT, DPL0, __KERNEL_CS)
-
-/* System interrupt gate */
-#define SYSG(_vector, _addr)                           \
-       G(_vector, _addr, DEFAULT_STACK, GATE_INTERRUPT, DPL3, __KERNEL_CS)
-
-/* Interrupt gate with interrupt stack */
-#define ISTG(_vector, _addr, _ist)                     \
-       G(_vector, _addr, _ist, GATE_INTERRUPT, DPL0, __KERNEL_CS)
-
-/* System interrupt gate with interrupt stack */
-#define SISTG(_vector, _addr, _ist)                    \
-       G(_vector, _addr, _ist, GATE_INTERRUPT, DPL3, __KERNEL_CS)
-
-/* Task gate */
-#define TSKG(_vector, _gdt)                            \
-       G(_vector, NULL, DEFAULT_STACK, GATE_TASK, DPL0, _gdt << 3)
+#include <asm/idt.h>
 
 /*
  * Early traps running on the DEFAULT_STACK because the other interrupt
@@ -202,20 +160,6 @@ const struct desc_ptr debug_idt_descr = {
 };
 #endif
 
-static inline void idt_init_desc(gate_desc *gate, const struct idt_data *d)
-{
-       unsigned long addr = (unsigned long) d->addr;
-
-       gate->offset_low        = (u16) addr;
-       gate->segment           = (u16) d->segment;
-       gate->bits              = d->bits;
-       gate->offset_middle     = (u16) (addr >> 16);
-#ifdef CONFIG_X86_64
-       gate->offset_high       = (u32) (addr >> 32);
-       gate->reserved          = 0;
-#endif
-}
-
 static void
 idt_setup_from_table(gate_desc *idt, const struct idt_data *t, int size, bool 
sys)
 {
-- 
2.7.4

Reply via email to