aboutsummaryrefslogtreecommitdiff
path: root/i386/i386at/int_init.c
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2023-01-29 23:45:38 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2023-01-29 23:49:04 +0100
commitfc0d49a3eda8b89497d1f2908b29b5476019a818 (patch)
tree51a607c61cbbc1d9b9c582c3a0afcf9dfdfb4e63 /i386/i386at/int_init.c
parent6ebd651d6f6244315a84b8355d801d118869f722 (diff)
downloadgnumach-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.c41
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