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