summaryrefslogtreecommitdiffhomepage
path: root/dev/ZKA/Sources/KernelCheck.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'dev/ZKA/Sources/KernelCheck.cxx')
-rw-r--r--dev/ZKA/Sources/KernelCheck.cxx136
1 files changed, 136 insertions, 0 deletions
diff --git a/dev/ZKA/Sources/KernelCheck.cxx b/dev/ZKA/Sources/KernelCheck.cxx
new file mode 100644
index 00000000..27519369
--- /dev/null
+++ b/dev/ZKA/Sources/KernelCheck.cxx
@@ -0,0 +1,136 @@
+/* -------------------------------------------
+
+ Copyright ZKA Technologies.
+
+------------------------------------------- */
+
+#include <ArchKit/ArchKit.hxx>
+#include <KernelKit/DebugOutput.hxx>
+#include <NewKit/KernelCheck.hxx>
+#include <NewKit/String.hxx>
+#include <FirmwareKit/Handover.hxx>
+#include <Modules/ACPI/ACPIFactoryInterface.hxx>
+
+#include <Modules/CoreCG/Accessibility.hxx>
+#include <Modules/CoreCG/FbRenderer.hxx>
+#include <Modules/CoreCG/TextRenderer.hxx>
+
+#define SetMem(dst, byte, sz) Kernel::rt_set_memory((Kernel::VoidPtr)dst, byte, sz)
+#define CopyMem(dst, src, sz) Kernel::rt_copy_memory((Kernel::VoidPtr)src, (Kernel::VoidPtr)dst, sz)
+#define MoveMem(dst, src, sz) Kernel::rt_copy_memory((Kernel::VoidPtr)src, (Kernel::VoidPtr)dst, sz)
+
+#define cWebsiteMacro "https://zka.nl/help"
+
+#include <BootKit/Vendor/Qr.hxx>
+
+/* Each error code is attributed with an ID, which will prompt a string onto the
+ * screen. Wait for debugger... */
+
+namespace Kernel
+{
+ void ke_stop(const Kernel::Int& id)
+ {
+ CGInit();
+
+ auto panicBack = RGB(0xff, 0x3a, 0x3a);
+ auto panicTxt = RGB(0xff, 0xff, 0xff);
+
+ CGDrawInRegion(panicBack, UIAccessibilty::The().Height(), UIAccessibilty::The().Width(), 0, 0);
+
+ auto start_y = 10;
+ auto x = 10;
+
+ cg_write_text("newoskrnl.dll stopped working properly so we had to stop.", start_y, x, panicTxt);
+
+ CGFini();
+
+ // Show the QR code now.
+
+ constexpr auto cVer = 4;
+ const auto cECC = qr::Ecc::H;
+ const auto cInput = cWebsiteMacro;
+ const auto cInputLen = rt_string_len(cWebsiteMacro);
+
+ qr::Qr<cVer> encoder;
+ qr::QrDelegate encoderDelegate;
+
+ encoder.encode(cInput, cInputLen, cECC, 0); // Manual mask 0
+
+ const auto cWhereStartX = (kHandoverHeader->f_GOP.f_Width - encoder.side_size()) - 20;
+ const auto cWhereStartY = (kHandoverHeader->f_GOP.f_Height - encoder.side_size()) / 2;
+
+ // tell delegate to draw encoded QR now.
+ encoderDelegate.draw<cVer>(encoder, cWhereStartX,
+ cWhereStartY);
+
+ start_y += 10;
+
+ // show text according to error id.
+
+ switch (id)
+ {
+ case RUNTIME_CHECK_PROCESS: {
+ cg_write_text("0x00000008 Process scheduler error (Catasrophic failure).", start_y, x, panicTxt);
+ break;
+ }
+ case RUNTIME_CHECK_ACPI: {
+ cg_write_text("0x00000006 ACPI error.", start_y, x, panicTxt);
+ break;
+ }
+ case RUNTIME_CHECK_POINTER: {
+ cg_write_text("0x00000000 Kernel heap error.", start_y, x, panicTxt);
+ break;
+ }
+ case RUNTIME_CHECK_BAD_BEHAVIOR: {
+ cg_write_text("0x00000009 Undefined Behavior error.", start_y, x, panicTxt);
+ break;
+ }
+ case RUNTIME_CHECK_BOOTSTRAP: {
+ cg_write_text("0x0000000A End of code.", start_y, x, panicTxt);
+ break;
+ }
+ case RUNTIME_CHECK_HANDSHAKE: {
+ cg_write_text("0x00000005 Handshake error.", start_y, x, panicTxt);
+ break;
+ }
+ case RUNTIME_CHECK_IPC: {
+ cg_write_text("0x00000003 Kernel IPC error.", start_y, x, panicTxt);
+ break;
+ }
+ case RUNTIME_CHECK_INVALID_PRIVILEGE: {
+ cg_write_text("0x00000007 Kernel privilege violation.", start_y, x, panicTxt);
+ break;
+ case RUNTIME_CHECK_UNEXCPECTED: {
+ cg_write_text("0x0000000B Catasrophic failure.", start_y, x, panicTxt);
+ break;
+ }
+ case RUNTIME_CHECK_FAILED: {
+ cg_write_text("0x10000001 Assertion failed.", start_y, x, panicTxt);
+ break;
+ }
+ default: {
+ cg_write_text("0xFFFFFFFF Unknown error.", start_y, x, panicTxt);
+ break;
+ }
+ }
+ };
+
+ RecoveryFactory::Recover();
+ }
+
+ Void RecoveryFactory::Recover() noexcept
+ {
+ while (Yes)
+ {
+ asm volatile("cli; hlt");
+ }
+ }
+
+ void ke_runtime_check(bool expr, const char* file, const char* line)
+ {
+ if (!expr)
+ {
+ ke_stop(RUNTIME_CHECK_FAILED); // Runtime Check failed
+ }
+ }
+} // namespace Kernel