mirror of
https://github.com/justinian/jsix.git
synced 2025-12-10 00:14:32 -08:00
[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:
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user