panic stops every other processor
A panic used to stop only the processor it happened on. The rest carried on with a dead kernel: on the ASUS laptop the report flashed up and was drawn over, and the fans stayed loud until the power button was held. Now the panicking processor sends every other one an NMI, which arrives even with interrupts off, and trap() halts a processor that takes one while panic_stop is set -- first thing, before the canary check, since that stack may be what broke. NMI gets its own per-CPU stack (IST 1): for a few instructions at the top of syscall_entry the live stack is the user's, at ring 0, and a fault pushing the frame there would be a double fault on the same stack and a reset instead of a report. A second processor that panics while one is already reporting halts instead of drawing over it; the owner's own nested panic still gets through. Checked under QEMU with -smp 4: after a sysrq crash CPUs 1-3 sit in hlt with IF clear and CPU 0 is in the report's blink loop. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S1giNvrHTrPMPw7V6x1kQ4
This commit is contained in:
parent
d8e8ae604f
commit
38c89b1a9a
5 changed files with 57 additions and 0 deletions
|
|
@ -457,6 +457,8 @@ extern uint64 boot_epoch;
|
|||
int cpunum(void);
|
||||
extern volatile uint* lapic;
|
||||
void lapiceoi(void);
|
||||
extern volatile int panic_stop; // kernel/core/panic.c
|
||||
void lapic_nmi_others(void);
|
||||
void lapicinit(void);
|
||||
void lapicstartap(uchar, uint);
|
||||
void microdelay(int);
|
||||
|
|
|
|||
Loading…
Reference in a new issue