1 // SPDX-License-Identifier: GPL-2.0-only
3 * Interrupt descriptor table related code
5 #include <linux/interrupt.h>
10 #include <asm/hw_irq.h>
22 #define DEFAULT_STACK 0
24 #define G(_vector, _addr, _ist, _type, _dpl, _segment) \
32 .segment = _segment, \
36 #define INTG(_vector, _addr) \
37 G(_vector, _addr, DEFAULT_STACK, GATE_INTERRUPT, DPL0, __KERNEL_CS)
39 /* System interrupt gate */
40 #define SYSG(_vector, _addr) \
41 G(_vector, _addr, DEFAULT_STACK, GATE_INTERRUPT, DPL3, __KERNEL_CS)
44 * Interrupt gate with interrupt stack. The _ist index is the index in
45 * the tss.ist[] array, but for the descriptor it needs to start at 1.
47 #define ISTG(_vector, _addr, _ist) \
48 G(_vector, _addr, _ist + 1, GATE_INTERRUPT, DPL0, __KERNEL_CS)
51 #define TSKG(_vector, _gdt) \
52 G(_vector, NULL, DEFAULT_STACK, GATE_TASK, DPL0, _gdt << 3)
55 * Early traps running on the DEFAULT_STACK because the other interrupt
56 * stacks work only after cpu_init().
58 static const __initconst
struct idt_data early_idts
[] = {
59 INTG(X86_TRAP_DB
, debug
),
60 SYSG(X86_TRAP_BP
, int3
),
62 INTG(X86_TRAP_PF
, page_fault
),
67 * The default IDT entries which are set up in trap_init() before
68 * cpu_init() is invoked. Interrupt stacks cannot be used at that point and
69 * the traps which use them are reinitialized with IST after cpu_init() has
72 static const __initconst
struct idt_data def_idts
[] = {
73 INTG(X86_TRAP_DE
, divide_error
),
74 INTG(X86_TRAP_NMI
, nmi
),
75 INTG(X86_TRAP_BR
, bounds
),
76 INTG(X86_TRAP_UD
, invalid_op
),
77 INTG(X86_TRAP_NM
, device_not_available
),
78 INTG(X86_TRAP_OLD_MF
, coprocessor_segment_overrun
),
79 INTG(X86_TRAP_TS
, invalid_TSS
),
80 INTG(X86_TRAP_NP
, segment_not_present
),
81 INTG(X86_TRAP_SS
, stack_segment
),
82 INTG(X86_TRAP_GP
, general_protection
),
83 INTG(X86_TRAP_SPURIOUS
, spurious_interrupt_bug
),
84 INTG(X86_TRAP_MF
, coprocessor_error
),
85 INTG(X86_TRAP_AC
, alignment_check
),
86 INTG(X86_TRAP_XF
, simd_coprocessor_error
),
89 TSKG(X86_TRAP_DF
, GDT_ENTRY_DOUBLEFAULT_TSS
),
91 INTG(X86_TRAP_DF
, double_fault
),
93 INTG(X86_TRAP_DB
, debug
),
96 INTG(X86_TRAP_MC
, &machine_check
),
99 SYSG(X86_TRAP_OF
, overflow
),
100 #if defined(CONFIG_IA32_EMULATION)
101 SYSG(IA32_SYSCALL_VECTOR
, entry_INT80_compat
),
102 #elif defined(CONFIG_X86_32)
103 SYSG(IA32_SYSCALL_VECTOR
, entry_INT80_32
),
108 * The APIC and SMP idt entries
110 static const __initconst
struct idt_data apic_idts
[] = {
112 INTG(RESCHEDULE_VECTOR
, reschedule_interrupt
),
113 INTG(CALL_FUNCTION_VECTOR
, call_function_interrupt
),
114 INTG(CALL_FUNCTION_SINGLE_VECTOR
, call_function_single_interrupt
),
115 INTG(IRQ_MOVE_CLEANUP_VECTOR
, irq_move_cleanup_interrupt
),
116 INTG(REBOOT_VECTOR
, reboot_interrupt
),
119 #ifdef CONFIG_X86_THERMAL_VECTOR
120 INTG(THERMAL_APIC_VECTOR
, thermal_interrupt
),
123 #ifdef CONFIG_X86_MCE_THRESHOLD
124 INTG(THRESHOLD_APIC_VECTOR
, threshold_interrupt
),
127 #ifdef CONFIG_X86_MCE_AMD
128 INTG(DEFERRED_ERROR_VECTOR
, deferred_error_interrupt
),
131 #ifdef CONFIG_X86_LOCAL_APIC
132 INTG(LOCAL_TIMER_VECTOR
, apic_timer_interrupt
),
133 INTG(X86_PLATFORM_IPI_VECTOR
, x86_platform_ipi
),
134 # ifdef CONFIG_HAVE_KVM
135 INTG(POSTED_INTR_VECTOR
, kvm_posted_intr_ipi
),
136 INTG(POSTED_INTR_WAKEUP_VECTOR
, kvm_posted_intr_wakeup_ipi
),
137 INTG(POSTED_INTR_NESTED_VECTOR
, kvm_posted_intr_nested_ipi
),
139 # ifdef CONFIG_IRQ_WORK
140 INTG(IRQ_WORK_VECTOR
, irq_work_interrupt
),
143 INTG(UV_BAU_MESSAGE
, uv_bau_message_intr1
),
145 INTG(SPURIOUS_APIC_VECTOR
, spurious_interrupt
),
146 INTG(ERROR_APIC_VECTOR
, error_interrupt
),
152 * Early traps running on the DEFAULT_STACK because the other interrupt
153 * stacks work only after cpu_init().
155 static const __initconst
struct idt_data early_pf_idts
[] = {
156 INTG(X86_TRAP_PF
, page_fault
),
160 * Override for the debug_idt. Same as the default, but with interrupt
161 * stack set to DEFAULT_STACK (0). Required for NMI trap handling.
163 static const __initconst
struct idt_data dbg_idts
[] = {
164 INTG(X86_TRAP_DB
, debug
),
168 /* Must be page-aligned because the real IDT is used in a fixmap. */
169 gate_desc idt_table
[IDT_ENTRIES
] __page_aligned_bss
;
171 struct desc_ptr idt_descr __ro_after_init
= {
172 .size
= (IDT_ENTRIES
* 2 * sizeof(unsigned long)) - 1,
173 .address
= (unsigned long) idt_table
,
177 /* No need to be aligned, but done to keep all IDTs defined the same way. */
178 gate_desc debug_idt_table
[IDT_ENTRIES
] __page_aligned_bss
;
181 * The exceptions which use Interrupt stacks. They are setup after
182 * cpu_init() when the TSS has been initialized.
184 static const __initconst
struct idt_data ist_idts
[] = {
185 ISTG(X86_TRAP_DB
, debug
, IST_INDEX_DB
),
186 ISTG(X86_TRAP_NMI
, nmi
, IST_INDEX_NMI
),
187 ISTG(X86_TRAP_DF
, double_fault
, IST_INDEX_DF
),
188 #ifdef CONFIG_X86_MCE
189 ISTG(X86_TRAP_MC
, &machine_check
, IST_INDEX_MCE
),
194 * Override for the debug_idt. Same as the default, but with interrupt
195 * stack set to DEFAULT_STACK (0). Required for NMI trap handling.
197 const struct desc_ptr debug_idt_descr
= {
198 .size
= IDT_ENTRIES
* 16 - 1,
199 .address
= (unsigned long) debug_idt_table
,
203 static inline void idt_init_desc(gate_desc
*gate
, const struct idt_data
*d
)
205 unsigned long addr
= (unsigned long) d
->addr
;
207 gate
->offset_low
= (u16
) addr
;
208 gate
->segment
= (u16
) d
->segment
;
209 gate
->bits
= d
->bits
;
210 gate
->offset_middle
= (u16
) (addr
>> 16);
212 gate
->offset_high
= (u32
) (addr
>> 32);
218 idt_setup_from_table(gate_desc
*idt
, const struct idt_data
*t
, int size
, bool sys
)
222 for (; size
> 0; t
++, size
--) {
223 idt_init_desc(&desc
, t
);
224 write_idt_entry(idt
, t
->vector
, &desc
);
226 set_bit(t
->vector
, system_vectors
);
230 static void set_intr_gate(unsigned int n
, const void *addr
)
232 struct idt_data data
;
236 memset(&data
, 0, sizeof(data
));
239 data
.segment
= __KERNEL_CS
;
240 data
.bits
.type
= GATE_INTERRUPT
;
243 idt_setup_from_table(idt_table
, &data
, 1, false);
247 * idt_setup_early_traps - Initialize the idt table with early traps
249 * On X8664 these traps do not use interrupt stacks as they can't work
250 * before cpu_init() is invoked and sets up TSS. The IST variants are
251 * installed after that.
253 void __init
idt_setup_early_traps(void)
255 idt_setup_from_table(idt_table
, early_idts
, ARRAY_SIZE(early_idts
),
257 load_idt(&idt_descr
);
261 * idt_setup_traps - Initialize the idt table with default traps
263 void __init
idt_setup_traps(void)
265 idt_setup_from_table(idt_table
, def_idts
, ARRAY_SIZE(def_idts
), true);
270 * idt_setup_early_pf - Initialize the idt table with early pagefault handler
272 * On X8664 this does not use interrupt stacks as they can't work before
273 * cpu_init() is invoked and sets up TSS. The IST variant is installed
276 * FIXME: Why is 32bit and 64bit installing the PF handler at different
277 * places in the early setup code?
279 void __init
idt_setup_early_pf(void)
281 idt_setup_from_table(idt_table
, early_pf_idts
,
282 ARRAY_SIZE(early_pf_idts
), true);
286 * idt_setup_ist_traps - Initialize the idt table with traps using IST
288 void __init
idt_setup_ist_traps(void)
290 idt_setup_from_table(idt_table
, ist_idts
, ARRAY_SIZE(ist_idts
), true);
294 * idt_setup_debugidt_traps - Initialize the debug idt table with debug traps
296 void __init
idt_setup_debugidt_traps(void)
298 memcpy(&debug_idt_table
, &idt_table
, IDT_ENTRIES
* 16);
300 idt_setup_from_table(debug_idt_table
, dbg_idts
, ARRAY_SIZE(dbg_idts
), false);
305 * idt_setup_apic_and_irq_gates - Setup APIC/SMP and normal interrupt gates
307 void __init
idt_setup_apic_and_irq_gates(void)
309 int i
= FIRST_EXTERNAL_VECTOR
;
312 idt_setup_from_table(idt_table
, apic_idts
, ARRAY_SIZE(apic_idts
), true);
314 for_each_clear_bit_from(i
, system_vectors
, FIRST_SYSTEM_VECTOR
) {
315 entry
= irq_entries_start
+ 8 * (i
- FIRST_EXTERNAL_VECTOR
);
316 set_intr_gate(i
, entry
);
319 #ifdef CONFIG_X86_LOCAL_APIC
320 for_each_clear_bit_from(i
, system_vectors
, NR_VECTORS
) {
321 set_bit(i
, system_vectors
);
322 entry
= spurious_entries_start
+ 8 * (i
- FIRST_SYSTEM_VECTOR
);
323 set_intr_gate(i
, entry
);
329 * idt_setup_early_handler - Initializes the idt table with early handlers
331 void __init
idt_setup_early_handler(void)
335 for (i
= 0; i
< NUM_EXCEPTION_VECTORS
; i
++)
336 set_intr_gate(i
, early_idt_handler_array
[i
]);
338 for ( ; i
< NR_VECTORS
; i
++)
339 set_intr_gate(i
, early_ignore_irq
);
341 load_idt(&idt_descr
);
345 * idt_invalidate - Invalidate interrupt descriptor table
346 * @addr: The virtual address of the 'invalid' IDT
348 void idt_invalidate(void *addr
)
350 struct desc_ptr idt
= { .address
= (unsigned long) addr
, .size
= 0 };
355 void __init
update_intr_gate(unsigned int n
, const void *addr
)
357 if (WARN_ON_ONCE(!test_bit(n
, system_vectors
)))
359 set_intr_gate(n
, addr
);
362 void alloc_intr_gate(unsigned int n
, const void *addr
)
364 BUG_ON(n
< FIRST_SYSTEM_VECTOR
);
365 if (!test_and_set_bit(n
, system_vectors
))
366 set_intr_gate(n
, addr
);