diff options
author | Damien Zammit <damien@zamaudio.com> | 2023-01-29 23:45:38 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2023-01-29 23:49:04 +0100 |
commit | fc0d49a3eda8b89497d1f2908b29b5476019a818 (patch) | |
tree | 51a607c61cbbc1d9b9c582c3a0afcf9dfdfb4e63 /i386/i386at/int_init.c | |
parent | 6ebd651d6f6244315a84b8355d801d118869f722 (diff) | |
download | gnumach-fc0d49a3eda8b89497d1f2908b29b5476019a818.tar.gz gnumach-fc0d49a3eda8b89497d1f2908b29b5476019a818.tar.bz2 gnumach-fc0d49a3eda8b89497d1f2908b29b5476019a818.zip |
i386: Add AP variants of descriptor tables
Diffstat (limited to 'i386/i386at/int_init.c')
-rw-r--r-- | i386/i386at/int_init.c | 41 |
1 files changed, 31 insertions, 10 deletions
diff --git a/i386/i386at/int_init.c b/i386/i386at/int_init.c index 3fed4197..964ce1bb 100644 --- a/i386/i386at/int_init.c +++ b/i386/i386at/int_init.c @@ -23,29 +23,50 @@ #include <i386at/idt.h> #include <i386at/int_init.h> -#include <i386/gdt.h> +#include <i386/mp_desc.h> +#include <i386/i386asm.h> /* defined in locore.S */ extern vm_offset_t int_entry_table[]; -void int_init(void) +void +int_fill(struct real_gate *myidt) { int i; #ifndef APIC - for (i = 0; i < 16; i++) { - fill_idt_gate(PIC_INT_BASE + i, + int base = PIC_INT_BASE; + int nirq = 16; +#else + int base = IOAPIC_INT_BASE; + int nirq = 24; +#endif + + for (i = 0; i < nirq; i++) { + fill_idt_gate(myidt, base + i, int_entry_table[i], KERNEL_CS, ACC_PL_K|ACC_INTR_GATE, 0); } -#else - for (i = 0; i < 24; i++) { - fill_idt_gate(IOAPIC_INT_BASE + i, + fill_idt_gate(myidt, CALL_SINGLE_FUNCTION_BASE, int_entry_table[i], KERNEL_CS, ACC_PL_K|ACC_INTR_GATE, 0); - } - fill_idt_gate(IOAPIC_SPURIOUS_BASE, - int_entry_table[24], KERNEL_CS, + i++; +#ifdef APIC + fill_idt_gate(myidt, IOAPIC_SPURIOUS_BASE, + int_entry_table[i], KERNEL_CS, ACC_PL_K|ACC_INTR_GATE, 0); + i++; #endif } +void +int_init(void) +{ + int_fill(idt); +} + +#if NCPUS > 1 +void ap_int_init(int cpu) +{ + int_fill(mp_desc_table[cpu]->idt); +} +#endif |