diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2017-08-28 08:47:57 +0200 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2017-08-29 12:07:28 +0200 |
commit | db18da78f9a8bbab1bdc5968ba47ace788b5061f (patch) | |
tree | 52cb2a64b00c992d5f857fac031a76d108464c64 /arch/x86/kernel | |
parent | 485fa57bd73a0b79987d144e15bdc582f926701d (diff) |
x86/idt: Deinline setup functions
None of this is performance sensitive in any way - so debloat the kernel.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Link: http://lkml.kernel.org/r/20170828064959.502052875@linutronix.de
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r-- | arch/x86/kernel/idt.c | 43 |
1 files changed, 34 insertions, 9 deletions
diff --git a/arch/x86/kernel/idt.c b/arch/x86/kernel/idt.c index 99f93a6fb92a..8e9318d2b56d 100644 --- a/arch/x86/kernel/idt.c +++ b/arch/x86/kernel/idt.c @@ -212,15 +212,16 @@ static inline void idt_init_desc(gate_desc *gate, const struct idt_data *d) #endif } -static __init void -idt_setup_from_table(gate_desc *idt, const struct idt_data *t, int size) +static void +idt_setup_from_table(gate_desc *idt, const struct idt_data *t, int size, bool sys) { gate_desc desc; for (; size > 0; t++, size--) { idt_init_desc(&desc, t); - set_bit(t->vector, used_vectors); write_idt_entry(idt, t->vector, &desc); + if (sys) + set_bit(t->vector, used_vectors); } } @@ -233,7 +234,8 @@ idt_setup_from_table(gate_desc *idt, const struct idt_data *t, int size) */ void __init idt_setup_early_traps(void) { - idt_setup_from_table(idt_table, early_idts, ARRAY_SIZE(early_idts)); + idt_setup_from_table(idt_table, early_idts, ARRAY_SIZE(early_idts), + true); load_idt(&idt_descr); } @@ -242,7 +244,7 @@ void __init idt_setup_early_traps(void) */ void __init idt_setup_traps(void) { - idt_setup_from_table(idt_table, def_idts, ARRAY_SIZE(def_idts)); + idt_setup_from_table(idt_table, def_idts, ARRAY_SIZE(def_idts), true); } #ifdef CONFIG_X86_64 @@ -259,7 +261,7 @@ void __init idt_setup_traps(void) void __init idt_setup_early_pf(void) { idt_setup_from_table(idt_table, early_pf_idts, - ARRAY_SIZE(early_pf_idts)); + ARRAY_SIZE(early_pf_idts), true); } /** @@ -267,7 +269,7 @@ void __init idt_setup_early_pf(void) */ void __init idt_setup_ist_traps(void) { - idt_setup_from_table(idt_table, ist_idts, ARRAY_SIZE(ist_idts)); + idt_setup_from_table(idt_table, ist_idts, ARRAY_SIZE(ist_idts), true); } /** @@ -277,7 +279,7 @@ void __init idt_setup_debugidt_traps(void) { memcpy(&debug_idt_table, &idt_table, IDT_ENTRIES * 16); - idt_setup_from_table(debug_idt_table, dbg_idts, ARRAY_SIZE(dbg_idts)); + idt_setup_from_table(debug_idt_table, dbg_idts, ARRAY_SIZE(dbg_idts), false); } #endif @@ -289,7 +291,7 @@ void __init idt_setup_apic_and_irq_gates(void) int i = FIRST_EXTERNAL_VECTOR; void *entry; - idt_setup_from_table(idt_table, apic_idts, ARRAY_SIZE(apic_idts)); + idt_setup_from_table(idt_table, apic_idts, ARRAY_SIZE(apic_idts), true); for_each_clear_bit_from(i, used_vectors, FIRST_SYSTEM_VECTOR) { entry = irq_entries_start + 8 * (i - FIRST_EXTERNAL_VECTOR); @@ -333,3 +335,26 @@ void idt_invalidate(void *addr) load_idt(&idt); } + +void set_intr_gate(unsigned int n, const void *addr) +{ + struct idt_data data; + + BUG_ON(n > 0xFF); + + memset(&data, 0, sizeof(data)); + data.vector = n; + data.addr = addr; + data.segment = __KERNEL_CS; + data.bits.type = GATE_INTERRUPT; + data.bits.p = 1; + + idt_setup_from_table(idt_table, &data, 1, false); +} + +void alloc_intr_gate(unsigned int n, const void *addr) +{ + BUG_ON(test_bit(n, used_vectors) || n < FIRST_SYSTEM_VECTOR); + set_bit(n, used_vectors); + set_intr_gate(n, addr); +} |