Monitor exit
authorBarret Rhoden <brho@cs.berkeley.edu>
Sat, 9 Jan 2010 00:58:25 +0000 (16:58 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sat, 9 Jan 2010 00:58:25 +0000 (16:58 -0800)
Can leave the monitor, which is useful when dealing with breakpoints for
debugging.  Also cleans up the x86 trap return path.

kern/arch/i386/trap.c
kern/include/monitor.h
kern/src/monitor.c

index a48988a..b4cac03 100644 (file)
@@ -174,10 +174,8 @@ trap_dispatch(trapframe_t *tf)
        // Handle processor exceptions.
        switch(tf->tf_trapno) {
                case T_BRKPT:
-                       while (1)
-                               monitor(tf);
-                       // never get to this
-                       assert(0);
+                       monitor(tf);
+                       break;
                case T_PGFLT:
                        page_fault_handler(tf);
                        break;
@@ -191,7 +189,6 @@ trap_dispatch(trapframe_t *tf)
                                        tf->tf_regs.reg_ecx, tf->tf_regs.reg_ebx,
                                        tf->tf_regs.reg_edi, tf->tf_regs.reg_esi);
                        proc_decref(current, 1);
-                       proc_startcore(current, tf); // Note the comment in syscall.c
                        break;
                default:
                        // Unexpected trap: The user process or the kernel has a bug.
@@ -241,12 +238,7 @@ trap(trapframe_t *tf)
        // Dispatch based on what type of trap occurred
        trap_dispatch(tf);
 
-       // should this be if == 3?  Sort out later when we handle traps.
-       // so far we never get here.  managed to get here once when a MCP took two
-       // page faults and both called proc_destroy().  one of which returned since
-       // it was already DYING (though it should have waited for it's death IPI).
-       assert(0);
-       // Return to the current environment, which should be runnable.
+       // Return to the current process, which should be runnable.
        proc_startcore(current, tf); // Note the comment in syscall.c
 }
 
index 3c55410..f8f4b2f 100644 (file)
@@ -23,5 +23,6 @@ int mon_kfs_ls(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
 int mon_kfs_run(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
 int mon_manager(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
 int mon_procinfo(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
+int mon_exit(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
 
 #endif // !ROS_KERN_MONITOR_H
index 50f6487..707f1b1 100644 (file)
@@ -48,6 +48,7 @@ static command_t (RO commands)[] = {
        { "kfs_run", "Create and run a program from KFS", mon_kfs_run},
        { "manager", "Run the manager", mon_manager},
        { "procinfo", "Show information about processes", mon_procinfo},
+       { "exit", "Leave the monitor", mon_exit},
 };
 #define NCOMMANDS (sizeof(commands)/sizeof(commands[0]))
 
@@ -334,6 +335,11 @@ int mon_procinfo(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf)
        return 0;
 }
 
+int mon_exit(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf)
+{
+       return -1;
+}
+
 /***** Kernel monitor command interpreter *****/
 
 #define WHITESPACE "\t\r\n "