[panic] Have panics stop all cores

Kernel panics previously only stopped the calling core. This commit
re-implements the panic system to allow us to stop all cores on a panic.

Changes include:

- panic now sends an NMI to all cores. This means we can't control the
  contents of their registers, so panic information has been moved to a
  global struct, and the panicking cpu sets the pointer to that data in
  its cpu_data.
- the panic_handler is now set up with mutexes to print appropriately
  and only initialize objects once.
- copying _current_gsbase into the panic handler, and #including the
  cpprt.cpp file (so that we can define NDEBUG and not have it try to
  link the assert code back in)
- making the symbol data pointer in kargs an actual pointer again, not
  an address - and carrying that through to the panic handler
- the number of cpus is now saved globally in the kernel as g_num_cpus
This commit is contained in:
Justin C. Miller
2022-01-08 01:00:43 -08:00
parent a3fff889d1
commit eeef23c2b7
12 changed files with 134 additions and 30 deletions

View File

@@ -1,4 +1,5 @@
#include <stdint.h>
#include <string.h>
#include "assert.h"
#include "cpu.h"
@@ -12,6 +13,11 @@
#include "syscall.h"
#include "tss.h"
unsigned g_num_cpus = 1;
panic_data g_panic_data;
panic_data *g_panic_data_p = &g_panic_data;
cpu_data g_bsp_cpu_data;
void
@@ -37,9 +43,18 @@ cpu_validate()
#undef CPU_FEATURE_REQ
}
void
global_cpu_init()
{
memset(&g_panic_data, 0, sizeof(g_panic_data));
}
void
cpu_early_init(cpu_data *cpu)
{
if (cpu->index == 0)
global_cpu_init();
cpu->idt->install();
cpu->gdt->install();