kernel: introduce per-CPU panic(9) message buffers
authorcheloha <cheloha@openbsd.org>
Wed, 2 Jun 2021 00:39:25 +0000 (00:39 +0000)
committercheloha <cheloha@openbsd.org>
Wed, 2 Jun 2021 00:39:25 +0000 (00:39 +0000)
commit1a4a9ab2b0c2c1651f94c16723a3fbc048452fbf
tree2117961c73a9c82f6116344fce45141e7e23f9a7
parent677ce7a9c66c728ce6e57235e4607f0de02b6907
kernel: introduce per-CPU panic(9) message buffers

Add a 512-byte buffer (ci_panicbuf) to each cpu_info struct on each
platform for use by panic(9).  The first panic on a given CPU writes
its message to this buffer.  Subsequent panics on a given CPU print
the panic message to the console but do not modify the buffer.  This
aids debugging in two cases:

- If 2+ CPUs panic simultaneously there is no risk of garbled messages
  in the panic buffer.

- If a CPU panics and then the operator causes a second panic while
  using ddb(4), the operator can still recall the first failure on
  a particular CPU.

Misc. changes to support this bigger change:

- Set panicstr atomically to identify the first CPU to reach panic().

- Tweak db_show_panic_cmd() to print all panic messages across all
  CPUs.  Prefix the first panic with an asterisk ('*').

- Prefer db_printf() to printf() during a panic if we have it.
  Apparently it disturbs less global state.

- On amd64, tweak fault() to write the local panic buffer.  This needs
  more work.

Prompted by bluhm@ and deraadt@.  Mostly written by deraadt@.
Discussed with bluhm@, deraadt@ and kettenis@.

Borne from a discussion on tech@ about making panic(9) more MP-safe:

https://marc.info/?l=openbsd-tech&m=162086462316143&w=2

ok kettenis@, visa@, bluhm@, deraadt@
17 files changed:
sys/arch/alpha/include/cpu.h
sys/arch/amd64/amd64/trap.c
sys/arch/amd64/include/cpu.h
sys/arch/arm/include/cpu.h
sys/arch/arm64/include/cpu.h
sys/arch/hppa/include/cpu.h
sys/arch/i386/include/cpu.h
sys/arch/m88k/include/cpu.h
sys/arch/mips64/include/cpu.h
sys/arch/powerpc/include/cpu.h
sys/arch/powerpc64/include/cpu.h
sys/arch/riscv64/include/cpu.h
sys/arch/sh/include/cpu.h
sys/arch/sparc64/include/cpu.h
sys/ddb/db_command.c
sys/kern/subr_prf.c
sys/sys/systm.h