Trigger the monitor with an interrupt
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 22 Apr 2010 02:56:21 +0000 (19:56 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:43 +0000 (17:35 -0700)
It will respond to keyboard or serial input (so it works with VMs).  Hit
the char, drop into the monitor.  Exit it to return from the interrupt.
To use it, set the __CONFIG_MONITOR_ON_INT__ variable in your Makelocal.

Careful KFS running from this.  In fact, you don't want to, since it
won't return, meaning you won't return from the keyboard interrupt to
whatever process you were running before.

Makeconfig
Makelocal.template
kern/arch/i686/init.c
kern/arch/i686/trap.c
kern/src/manager.c

index 89127c3..40600aa 100644 (file)
@@ -23,6 +23,7 @@ CONFIG_E1000_ON_BOXBORO:=          -DE1000_MMIO_ADDR=0x9bb20000
 CONFIG_E1000_ON_S142:=             -DE1000_MMIO_ADDR=0xfbee0000
 CONFIG_DISABLE_MPTABLES:=          -D__CONFIG_DISABLE_MPTABLES__
 CONFIG_EXPER_TRADPROC:=            -D__CONFIG_EXPER_TRADPROC__
+CONFIG_MONITOR_ON_INT:=            -D__CONFIG_MONITOR_ON_INT__
 
 # Userspace configuration parameters
 # By default, each of these options will be turned off
index 37adece..6b7c6c7 100644 (file)
@@ -18,7 +18,8 @@
 #KERN_CFLAGS += $(CONFIG_E1000_ON_BOXBORO)
 #KERN_CFLAGS += $(CONFIG_E1000_ON_S142)
 #KERN_CFLAGS += $(CONFIG_DISABLE_MPTABLES)
-#KERN_CFLAGS += $(CONFIG_EXPER_TRADPROC))
+#KERN_CFLAGS += $(CONFIG_EXPER_TRADPROC)
+#KERN_CFLAGS += $(CONFIG_MONITOR_ON_INT)
 #KERN_CFLAGS += -DDEVELOPER_NAME=waterman
 #KERN_CFLAGS += -DDEVELOPER_NAME=brho
 
index 6601d11..851361f 100644 (file)
@@ -12,6 +12,8 @@
 #include <arch/mptables.h>
 #include <arch/pci.h>
 #include <arch/ioapic.h>
+#include <arch/console.h>
+#include <monitor.h>
 
 void arch_init()
 {
@@ -50,5 +52,31 @@ void arch_init()
                e1000_init();
        #endif // __CONFIG_SINGLE_CORE__
        #endif // __CONFIG_NETWORKING__
-}
 
+#ifdef __CONFIG_MONITOR_ON_INT__
+       /* Handler to read a char from the interrupt source and call the monitor.
+        * Need to read the character so the device will send another interrupt.
+        * Note this will read from both the serial and the keyboard, and throw away
+        * the result.  We condition, since we don't want to trigger on a keyboard
+        * up interrupt */
+       void mon_int(struct trapframe *tf, void *data)
+       {
+               if (cons_getc())
+                       monitor(0);
+       }
+       register_interrupt_handler(interrupt_handlers, 1 + PIC1_OFFSET, mon_int, 0);
+       register_interrupt_handler(interrupt_handlers, 3 + PIC1_OFFSET, mon_int, 0);
+       register_interrupt_handler(interrupt_handlers, 4 + PIC1_OFFSET, mon_int, 0);
+# ifdef __CONFIG_DISABLE_MPTABLES__
+       pic_unmask_irq(1);      /* keyboard */
+       pic_unmask_irq(3);      /* serial 2 or 4 */
+       pic_unmask_irq(4);      /* serial 1 or 3 */
+       unmask_lapic_lvt(LAPIC_LVT_LINT0);
+# else 
+       ioapic_route_irq(1, 0);
+       ioapic_route_irq(3, 0);
+       ioapic_route_irq(4, 0);
+# endif /* __CONFIG_DISABLE_MPTABLES__ */
+       enable_irq(); /* we want these interrupts to work in the kernel. */
+#endif /* __CONFIG_MONITOR_ON_INT__ */
+}
index cc6201f..82097ab 100644 (file)
@@ -239,7 +239,7 @@ env_pop_ancillary_state(env_t* e)
 void
 trap(trapframe_t *tf)
 {
-       //printk("Incoming TRAP frame on core %d at %p\n", core_id(), tf);
+       printd("Incoming TRAP frame on core %d at %p\n", core_id(), tf);
 
        /* Note we are not preemptively saving the TF in the env_tf.  We do maintain
         * a reference to it in current_tf (a per-cpu pointer).
@@ -267,8 +267,7 @@ irq_handler(trapframe_t *tf)
        if (!in_kernel(tf))
                set_current_tf(tf);
        //if (core_id())
-       //      cprintf("Incoming IRQ, ISR: %d on core %d\n", tf->tf_trapno, core_id());
-       // merge this with alltraps?  other than the EOI... or do the same in all traps
+               printd("Incoming IRQ, ISR: %d on core %d\n", tf->tf_trapno, core_id());
 
        extern handler_wrapper_t (RO handler_wrappers)[NUM_HANDLER_WRAPPERS];
 
index 39d02c2..475eb94 100644 (file)
@@ -89,7 +89,7 @@ void manager_brho(void)
                        #endif
                        break;
                case 1:
-                       monitor(0);
+                       //monitor(0);
                        #if 0
                        udelay(10000000);
                        // this is a ghetto way to test restarting an _M
@@ -131,7 +131,7 @@ void manager_brho(void)
                        test_pit();
                        */
                default:
-                       printk("Manager Progress: %d\n", progress);
+                       printd("Manager Progress: %d\n", progress);
                        // delay if you want to test rescheduling an MCP that yielded
                        //udelay(15000000);
                        schedule();