]> Zhao Yanbai Git Server - minix.git/commitdiff
saved_proc in exception() may be NULL
authorTomas Hruby <tom@minix3.org>
Sat, 29 Aug 2009 19:26:46 +0000 (19:26 +0000)
committerTomas Hruby <tom@minix3.org>
Sat, 29 Aug 2009 19:26:46 +0000 (19:26 +0000)
If an exception happens in kernel while the kernel is booting and no processes
are running yet, saved_proc == NULL and priting any process related information
results in dumping rubish.

This check is mostly useful when debugging kernel stuff. Should _never_ happen
on a production kernel.

kernel/arch/i386/exception.c

index 2657482deb9276e4eec3fd55e7a8525de18d13fa..21fe09709c63cd02afd3cf6a873315999c303446 100755 (executable)
@@ -163,16 +163,25 @@ struct proc *t;
   else
        kprintf("\n%s\n", ep->msg);
   kprintf("k_reenter = %d ", k_reenter);
-  kprintf("process %d (%s), ", proc_nr(saved_proc), saved_proc->p_name);
-  kprintf("pc = %u:0x%x\n", (unsigned) saved_proc->p_reg.cs,
-         (unsigned) saved_proc->p_reg.pc);
-  kprintf(
-  "vec_nr= %d, trap_errno= 0x%lx, eip= 0x%lx, cs= 0x%x, eflags= 0x%lx\n",
-       vec_nr, (unsigned long)trap_errno,
-       (unsigned long)old_eip, old_cs, (unsigned long)old_eflags);
-  proc_stacktrace(saved_proc);
 
-  minix_panic("exception in a kernel task", saved_proc->p_endpoint);
+  /* TODO should we enable this only when compiled for some debug mode? */
+  if (saved_proc) {
+         kprintf("process %d (%s), ", proc_nr(saved_proc), saved_proc->p_name);
+         kprintf("pc = %u:0x%x\n", (unsigned) saved_proc->p_reg.cs,
+                         (unsigned) saved_proc->p_reg.pc);
+         kprintf("vec_nr= %d, trap_errno= 0x%lx, eip= 0x%lx, "
+                         "cs= 0x%x, eflags= 0x%lx\n",
+                         vec_nr, (unsigned long)trap_errno,
+                         (unsigned long)old_eip, old_cs,
+                         (unsigned long)old_eflags);
+         proc_stacktrace(saved_proc);
+
+         minix_panic("exception in a kernel task", saved_proc->p_endpoint);
+  }
+  else {
+         /* in an early stage of boot process we don't have processes yet */
+         minix_panic("exception in kernel while booting", NO_NUM);
+  }
 }
 
 /*===========================================================================*