Nucleus
Barry Per-CPU Scheduler bb0cb77 (3 years, 2 months ago)
diff --git a/kernel/idt.c b/kernel/idt.c
index 6aceb88..37d38d6 100644
--- a/kernel/idt.c
+++ b/kernel/idt.c
@@ -21,7 +21,6 @@ static struct IDTEntry {
uint16_t offsetHigher;
} __attribute__((packed)) *IDT;
-void (**exceptions)(struct InterruptFrame *);
void (**interrupts)(struct InterruptFrame *);
/* Install an IDT Entry */
@@ -43,12 +42,12 @@ install_idt_entry(uint8_t num, void *addr)
void
isr_handler(struct InterruptFrame frame)
{
- if (!exceptions[frame.intnum] && frame.intnum < 32)
+ if (!interrupts[frame.intnum] && frame.intnum < 32)
panic("[CPU#%d] Failed to handle exception %d (%#.8x) @ %#.8x",
cpu->id, frame.intnum, frame.err, frame.eip);
/* Run registered handler */
- exc_handler_t handler = exceptions[frame.intnum];
+ int_handler_t handler = interrupts[frame.intnum];
if (handler)
handler(&frame);
@@ -65,18 +64,25 @@ isr_handler(struct InterruptFrame frame)
/* Register an exception handler */
void
-register_exception(int num, exc_handler_t addr)
+register_exception(uint8_t num, int_handler_t addr)
{
- if (num >= 0 && num < 256)
- exceptions[num] = addr;
+ interrupts[num] = addr;
}
/* Register an interrupt handler */
void
-register_interrupt(int num, int_handler_t addr)
+register_interrupt(uint8_t num, int_handler_t addr)
{
if (num >= 0 && num < 16)
- interrupts[num] = addr;
+ register_exception(num + 32, addr);
+}
+
+/* Register an IPI handler */
+void
+register_ipi(uint8_t num, int_handler_t addr)
+{
+ if (num >= 0 && num < 16)
+ register_exception(num + 48, addr);
}
/* Exceptions */
@@ -88,6 +94,10 @@ extern char exc0[], exc1[], exc2[], exc3[], exc4[], exc5[], exc6[],
extern char exc32[], exc33[], exc34[], exc35[], exc36[], exc37[], exc38[],
exc39[], exc40[], exc41[], exc42[], exc43[], exc44[], exc45[],
exc46[], exc47[];
+/* IPIs */
+extern char exc48[], exc49[], exc50[], exc51[], exc52[], exc53[], exc54[],
+ exc55[], exc56[], exc57[], exc58[], exc59[], exc60[], exc61[],
+ exc62[], exc63[];
/* System Call */
extern char exc128[];
@@ -139,12 +149,29 @@ init_idt(void)
install_idt_entry(46, exc46);
install_idt_entry(47, exc47);
+ /* Install IPIs */
+ install_idt_entry(48, exc48);
+ install_idt_entry(49, exc49);
+ install_idt_entry(50, exc50);
+ install_idt_entry(51, exc51);
+ install_idt_entry(52, exc52);
+ install_idt_entry(53, exc53);
+ install_idt_entry(54, exc54);
+ install_idt_entry(55, exc55);
+ install_idt_entry(56, exc56);
+ install_idt_entry(57, exc57);
+ install_idt_entry(58, exc58);
+ install_idt_entry(59, exc59);
+ install_idt_entry(60, exc60);
+ install_idt_entry(61, exc61);
+ install_idt_entry(62, exc62);
+ install_idt_entry(63, exc63);
+
/* Install system call handler */
install_idt_entry(128, exc128);
- exceptions = (void *) (IDT + 256);
- interrupts = (void *) (exceptions + 32);
- memset(exceptions, 0, 1024);
+ interrupts = (void *) (IDT + 256);
+ memset(interrupts, 0, 1024);
}
/* Load the IDT */