BarryServer : Git

All the code for all my projects
// BarryServer : Git / Nucleus / commit / bb0cb7718204df7c0cbaf87484b1def3c4b2880f / kernel / idt.c

// Related

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 */