common entry point for "software" and "hardware" "panics"

Andriy Gapon avg at FreeBSD.org
Tue Aug 23 14:09:03 UTC 2011


Too many quote signs in the subject line... let me try to explain.

Currently we have two sources of detecting some trouble/inconsistency that
requires a system panic/reset or debugging.  One source is various checks in the
program code (e.g. KASSERTs) that call panic() when a fatal inconsistency is
detected.  The other source is the hardware that generates a trap when something
is wrong from its point of view.  In this case the trap need not be a fatal one,
so the software (the kernel) checks a type of trap and decides whether the
condition is fatal.  But let's distinguish the purely software source from the
hardware+software source.

Depending on the kernel options/configuration the kernel can also react in
different ways to the fatal conditions.  One way is to call panic(9) , the other
way is to call kdb_trap.  But it's even a little bit more complicated than that.

So, let's consider some possibilities.

!KDB, software problem:
panic -> kern_reboot

!KDB, fatal trap:
trap -> trap_fatal -> panic -> kern_reboot

KDB, !KDB_UNATTENDED, software problem:
panic -> kdb_enter -> breakpoint ~> trap -> kdb_trap

KDB, !KDB_UNATTENDED, fatal trap:
trap -> trap_fatal -> kdb_trap

Also, kdb key from console:
kdb_enter -> breakpoint ~> trap -> kdb_trap

panic key from console:
kdb_panic -> panic -> ...

and also some code calls kdb_enter instead of panic in situations that require
debugging:
kdb_enter -> breakpoint ~> kdb_trap

So, we can see that in these examples that currently we do not have a function
that would be called in all the cases.
I think that it would be nice if we had some sort of a (semi-)universal front-end
to panic and kdb_trap.  E.g. it could be useful for some common tasks like
stopping other CPUs in SMP environment.  Then, it could be useful for printing
some information useful in both cases like e.g. a stack trace.  Or perhaps
deciding whether KDB should be actually entered in a common place.

Unfortunately, this is not a proposal, just sort of musings on the topic.
Does anybody have some more concrete ideas here?
Thank you!
-- 
Andriy Gapon


More information about the freebsd-arch mailing list