]> Zhao Yanbai Git Server - minix.git/commitdiff
- panic if there's no runnable process
authorBen Gras <ben@minix3.org>
Sat, 3 Oct 2009 11:30:35 +0000 (11:30 +0000)
committerBen Gras <ben@minix3.org>
Sat, 3 Oct 2009 11:30:35 +0000 (11:30 +0000)
 - more basic sanity check before recursive enter check (data segment)
 - try to jump to boot monitor instantly on recursive panic

kernel/arch/i386/system.c
kernel/debug.h
kernel/glo.h
kernel/main.c
kernel/proc.c
kernel/proto.h
kernel/utility.c

index b8bb73f227871bce32fefd0cde17c88ec7ccdf39..9aef4ea2dd32827d2fc26480ea26a2be6c7b7cf2 100644 (file)
 
 FORWARD _PROTOTYPE( void ser_debug, (int c));
 
+PUBLIC void arch_monitor(void)
+{
+       level0(monitor);
+}
+
 PUBLIC void arch_shutdown(int how)
 {
        /* Mask all interrupts, including the clock. */
@@ -68,7 +73,7 @@ PUBLIC void arch_shutdown(int how)
 
                        arch_set_params(mybuffer, strlen(mybuffer)+1);
                }
-               level0(monitor);
+               arch_monitor();
        } else {
                /* Reset the system by forcing a processor shutdown. First stop
                 * the BIOS memory test by setting a soft reset flag.
index e9de2a5ca79aee75249c0c725318f2d86591c0d9..c170039d0af653e80b93d55f61e7eea6823aee59 100644 (file)
@@ -45,6 +45,9 @@
        static int varname = 0; \
        int mustunlock = 0; \
        if(!intr_disabled()) { lock; mustunlock = 1; } \
+       if(magictest != MAGICTEST) {    \
+               minix_panic(#varname " magictest failed", __LINE__); \
+       }       \
        if(varname) {   \
                minix_panic(#varname " recursive enter", __LINE__); \
        } \
index 2088183536dae6680d9e6be7877333a1526f0a27..7c340560cb715440b352c24b60a246b288eef6ba 100755 (executable)
@@ -58,6 +58,8 @@ EXTERN time_t boottime;
 EXTERN char params_buffer[512];                /* boot monitor parameters */
 EXTERN int minix_panicing;
 EXTERN int locklevel;
+#define MAGICTEST 0xC0FFEE23
+EXTERN u32_t magictest;                        /* global magic number */
 
 #if DEBUG_TRACE
 EXTERN int verboseflags;
index 885dddb94a0b8e6d2e2ff8ef4aced4681d5c6fb3..c867544ecf2597ef9c80f123f5c25bf2f0109cb7 100755 (executable)
@@ -40,6 +40,9 @@ PUBLIC void main()
 
    /* Architecture-dependent initialization. */
    arch_init();
+
+   /* Global value to test segment sanity. */
+   magictest = MAGICTEST;
  
   /* Clear the process table. Anounce each slot as empty and set up mappings 
    * for proc_addr() and proc_nr() macros. Do the same for the table with 
index 5ef4555e9fde898eee72f092b58f9bf542ae85ee..5d6afee47441b430c6d710dfcff1c5bd3f21e3d3 100755 (executable)
@@ -1327,6 +1327,7 @@ PRIVATE void pick_proc()
                bill_ptr = rp;          /* bill for system time */
        NOREC_RETURN(pick, );
   }
+  minix_panic("no runnable processes", NO_NUM);
 }
 
 /*===========================================================================*
index 3f8cfa1d92799dee6cb604199e7b8deea9025d63..cfdcdf87e8f85f78176f4d7d835205d0049b4325 100755 (executable)
@@ -149,6 +149,7 @@ _PROTOTYPE( void idle_task, (void)                                     );
 _PROTOTYPE( void arch_init, (void)                                     );
 _PROTOTYPE( void ser_putc, (char)                                              );
 _PROTOTYPE( void arch_shutdown, (int)                                  );
+_PROTOTYPE( void arch_monitor, (void)                                  );
 _PROTOTYPE( void arch_get_aout_headers, (int i, struct exec *h)                );
 _PROTOTYPE( void restart, (void)                                        );
 _PROTOTYPE( void read_tsc, (unsigned long *high, unsigned long *low)    );
index 0e3ac6ca2ed8fa8efd26e4e88a964296470c35e8..fa31cf3fe779e3d004585adc9a9dc39760d7a3a9 100755 (executable)
@@ -37,7 +37,9 @@ char *mess;
 int nr;
 {
 /* The system has run aground of a fatal kernel error. Terminate execution. */
-if (!minix_panicing++) {
+if (minix_panicing++) {
+       arch_monitor();
+}
 
   if (mess != NULL) {
        kprintf("kernel panic: %s", mess);
@@ -48,7 +50,6 @@ if (!minix_panicing++) {
 
   kprintf("kernel: ");
   util_stacktrace();
-}
 
   /* Abort MINIX. */
   minix_shutdown(NULL);