x86 kernel messages go through irq_handler()
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 26 Sep 2011 23:36:18 +0000 (16:36 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:36:07 +0000 (17:36 -0700)
Previously, __kernel_message() was getting called directly from the
assembly routines.  Now, it goes through irq_handler() like all other
traps.  While it is slightly slower, it will go through the same path,
including proc_restartcore() on the way back out.

kern/arch/i686/trap.c
kern/arch/i686/trapentry.S

index 3ac776f..6b38037 100644 (file)
@@ -43,6 +43,9 @@ pseudodesc_t RO idt_pd = {
 spinlock_t iht_lock;
 handler_t TP(TV(t)) LCKD(&iht_lock) (RO interrupt_handlers)[NUM_INTERRUPT_HANDLERS];
 
+/* x86-specific interrupt handlers */
+void __kernel_message(struct trapframe *tf, void *data);
+
 static const char *NTS trapname(int trapno)
 {
     // zra: excnames is SREADONLY because Ivy doesn't trust const
@@ -195,6 +198,9 @@ void idt_init(void)
        /* register the generic timer_interrupt() handler for the per-core timers */
        register_interrupt_handler(interrupt_handlers, LAPIC_TIMER_DEFAULT_VECTOR,
                                   timer_interrupt, NULL);
+       /* register the kernel message handler */
+       register_interrupt_handler(interrupt_handlers, I_KERNEL_MSG,
+                                  __kernel_message, NULL);
 }
 
 void
@@ -536,7 +542,7 @@ static kernel_message_t *get_next_amsg(struct kernel_msg_list *list_head,
  * Note that all of this happens from interrupt context, and interrupts are
  * currently disabled for this gate.  Interrupts need to be disabled so that the
  * self-ipi doesn't preempt the execution of this kernel message. */
-void __kernel_message(struct trapframe *tf)
+void __kernel_message(struct trapframe *tf, void *data)
 {
        per_cpu_info_t *myinfo = &per_cpu_info[core_id()];
        kernel_message_t msg_cp, *k_msg;
@@ -575,9 +581,6 @@ void __kernel_message(struct trapframe *tf)
                        msg_cp.pc(tf, msg_cp.srcid, msg_cp.arg0, msg_cp.arg1, msg_cp.arg2);
                }
        }
-       /* TODO: should this proc_restartcore, like the irq/trap paths?  Or at least
-        * take some things from __proc_startcore() (since we don't want to re-run
-        * kmsgs). */
 }
 
 /* Runs any outstanding routine kernel messages from within the kernel.  Will
index f282bee..8b22fcd 100644 (file)
@@ -174,7 +174,7 @@ IRQ_HANDLER(IRQ219, 251)
 IRQ_HANDLER(IRQ220, 252)
 IRQ_HANDLER(IRQ221, 253)
 IRQ_HANDLER(IRQ222, 254)
-IRQ_HANDLER_SPEC(IRQ223, I_KERNEL_MSG, __kernel_message)
+IRQ_HANDLER(IRQ223, I_KERNEL_MSG)
 
 /* Technically, these HANDLER entries do not need to be in numeric order */
 TRAPHANDLER_NOEC(ISR_syscall, T_SYSCALL)