瀏覽代碼

Kernel: Reset on panic in self-test mode

This makes a kernel panic immediately fail the on-target CI job.
Otherwise the failed job looks like a test timeout unless one digs into
the details of the job.
Ali Mohammad Pur 4 年之前
父節點
當前提交
6b606771b5
共有 1 個文件被更改,包括 15 次插入2 次删除
  1. 15 2
      Kernel/Panic.cpp

+ 15 - 2
Kernel/Panic.cpp

@@ -6,16 +6,29 @@
 
 
 #include <AK/Format.h>
 #include <AK/Format.h>
 #include <Kernel/Arch/x86/Processor.h>
 #include <Kernel/Arch/x86/Processor.h>
+#include <Kernel/CommandLine.h>
 #include <Kernel/KSyms.h>
 #include <Kernel/KSyms.h>
 #include <Kernel/Panic.h>
 #include <Kernel/Panic.h>
 
 
 namespace Kernel {
 namespace Kernel {
 
 
+[[noreturn]] static void __reset()
+{
+    // FIXME: This works for i686/x86_64, but needs to be ported to any other arch when needed.
+    asm(
+        "lidt 0\n"
+        "movl $0, 0\n");
+
+    __builtin_unreachable();
+}
+
 void __panic(const char* file, unsigned int line, const char* function)
 void __panic(const char* file, unsigned int line, const char* function)
 {
 {
     critical_dmesgln("at {}:{} in {}", file, line, function);
     critical_dmesgln("at {}:{} in {}", file, line, function);
     dump_backtrace();
     dump_backtrace();
-    Processor::halt();
+    if (kernel_command_line().boot_mode() == BootMode::SelfTest)
+        __reset();
+    else
+        Processor::halt();
 }
 }
-
 }
 }