From 4ed658c633ce5d7c5bde4acdbe322e5f51592369 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 25 Dec 2024 14:04:14 +0100 Subject: IMPL: Important refactors and improvements of ZkaOS. Signed-off-by: Amlal El Mahrouss --- dev/Kernel/FirmwareKit/EFI/API.h | 2 +- .../HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc | 22 ++-- dev/Kernel/HALKit/AMD64/HalCoreScheduler.cc | 4 +- dev/Kernel/HALKit/AMD64/HalDebugOutput.cc | 2 +- dev/Kernel/HALKit/AMD64/HalKernelMain.cc | 8 +- dev/Kernel/HALKit/ARM64/HalKernelMain.cc | 6 +- dev/Kernel/HALKit/ARM64/Storage/.gitkeep | 0 dev/Kernel/HALKit/ARM64/Storage/HalFlash.cc | 66 ----------- dev/Kernel/HALKit/ARM64/Storage/HalFlashMemory.cc | 66 +++++++++++ dev/Kernel/KernelKit/DebugOutput.h | 2 +- dev/Kernel/KernelKit/Heap.h | 2 +- dev/Kernel/NewKit/DriverMgr.h | 19 +++ dev/Kernel/NewKit/KString.h | 2 +- dev/Kernel/NewKit/KernelPanic.h | 71 +++++++++++ dev/Kernel/NewKit/New.h | 4 +- dev/Kernel/NewKit/NewKit.h | 2 +- dev/Kernel/NewKit/OwnPtr.h | 2 +- dev/Kernel/NewKit/Ref.h | 2 +- dev/Kernel/NewKit/Stop.h | 71 ----------- dev/Kernel/NewKit/SwapMgr.h | 21 ++++ dev/Kernel/NewKit/ThreadMgr.h | 20 ++++ dev/Kernel/src/ACPIFactoryInterface.cc | 2 +- dev/Kernel/src/BitMapMgr.cc | 2 +- dev/Kernel/src/FS/HPFS.cc | 2 +- dev/Kernel/src/FS/NeFS.cc | 2 +- dev/Kernel/src/Heap.cc | 4 +- dev/Kernel/src/KernelMain.cc | 4 +- dev/Kernel/src/KernelPanic.cc | 130 +++++++++++++++++++++ dev/Kernel/src/LPC.cc | 4 +- dev/Kernel/src/PEFCodeMgr.cc | 2 +- dev/Kernel/src/Stop.cc | 130 --------------------- dev/Kernel/src/User.cc | 2 +- dev/Kernel/src/UserProcessScheduler.cc | 2 +- 33 files changed, 371 insertions(+), 309 deletions(-) delete mode 100644 dev/Kernel/HALKit/ARM64/Storage/.gitkeep delete mode 100644 dev/Kernel/HALKit/ARM64/Storage/HalFlash.cc create mode 100644 dev/Kernel/HALKit/ARM64/Storage/HalFlashMemory.cc create mode 100644 dev/Kernel/NewKit/DriverMgr.h create mode 100644 dev/Kernel/NewKit/KernelPanic.h delete mode 100644 dev/Kernel/NewKit/Stop.h create mode 100644 dev/Kernel/NewKit/SwapMgr.h create mode 100644 dev/Kernel/NewKit/ThreadMgr.h create mode 100644 dev/Kernel/src/KernelPanic.cc delete mode 100644 dev/Kernel/src/Stop.cc (limited to 'dev/Kernel') diff --git a/dev/Kernel/FirmwareKit/EFI/API.h b/dev/Kernel/FirmwareKit/EFI/API.h index 7bb83ebf..218ca85a 100644 --- a/dev/Kernel/FirmwareKit/EFI/API.h +++ b/dev/Kernel/FirmwareKit/EFI/API.h @@ -21,7 +21,7 @@ class BTextWriter; #define __BOOTKIT_NO_INCLUDE__ 1 #include -#include +#include #endif // ifdef __ZBAOSLDR__ inline EfiSystemTable* ST = nullptr; diff --git a/dev/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc index 036593e5..aa1d66d7 100644 --- a/dev/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc +++ b/dev/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc @@ -18,7 +18,7 @@ EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) auto process = Kernel::UserProcessScheduler::The().GetCurrentProcess(); if (!process) - Kernel::ke_stop(RUNTIME_CHECK_PAGE); + Kernel::ke_panic(RUNTIME_CHECK_PAGE); process.Leak().ProcessSignal.SignalIP = 0UL; process.Leak().ProcessSignal.SignalID = SIGKILL; @@ -30,7 +30,7 @@ EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) process.Leak().Crash(); - Kernel::ke_stop(RUNTIME_CHECK_POINTER); + Kernel::ke_panic(RUNTIME_CHECK_POINTER); } /// @brief Handle page fault. @@ -43,7 +43,7 @@ EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) auto process = Kernel::UserProcessScheduler::The().GetCurrentProcess(); if (!process) - Kernel::ke_stop(RUNTIME_CHECK_PAGE); + Kernel::ke_panic(RUNTIME_CHECK_PAGE); process.Leak().ProcessSignal.SignalIP = 0UL; process.Leak().ProcessSignal.SignalID = SIGKILL; @@ -55,7 +55,7 @@ EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) process.Leak().Crash(); - Kernel::ke_stop(RUNTIME_CHECK_PAGE); + Kernel::ke_panic(RUNTIME_CHECK_PAGE); } /// @brief Handle scheduler interrupt. @@ -90,7 +90,7 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) auto process = Kernel::UserProcessScheduler::The().GetCurrentProcess(); if (!process) - Kernel::ke_stop(RUNTIME_CHECK_PAGE); + Kernel::ke_panic(RUNTIME_CHECK_PAGE); process.Leak().ProcessSignal.SignalIP = 0UL; process.Leak().ProcessSignal.SignalID = SIGKILL; @@ -102,7 +102,7 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) process.Leak().Crash(); - Kernel::ke_stop(RUNTIME_CHECK_UNEXCPECTED); + Kernel::ke_panic(RUNTIME_CHECK_UNEXCPECTED); } /// @brief Handle any generic fault. @@ -114,7 +114,7 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) auto process = Kernel::UserProcessScheduler::The().GetCurrentProcess(); if (!process) - Kernel::ke_stop(RUNTIME_CHECK_PAGE); + Kernel::ke_panic(RUNTIME_CHECK_PAGE); process.Leak().ProcessSignal.SignalIP = 0UL; process.Leak().ProcessSignal.SignalID = SIGKILL; @@ -126,7 +126,7 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) process.Leak().Crash(); - Kernel::ke_stop(RUNTIME_CHECK_UNEXCPECTED); + Kernel::ke_panic(RUNTIME_CHECK_UNEXCPECTED); } EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) @@ -134,7 +134,7 @@ EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) auto process = Kernel::UserProcessScheduler::The().GetCurrentProcess(); if (!process) - Kernel::ke_stop(RUNTIME_CHECK_PAGE); + Kernel::ke_panic(RUNTIME_CHECK_PAGE); kcout << "Kernel: Process RIP: " << Kernel::hex_number(rip) << endl; kcout << "Kernel: SIGTRAP set.\r"; @@ -158,7 +158,7 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) auto process = Kernel::UserProcessScheduler::The().GetCurrentProcess(); if (!process) - Kernel::ke_stop(RUNTIME_CHECK_PAGE); + Kernel::ke_panic(RUNTIME_CHECK_PAGE); process.Leak().ProcessSignal.SignalIP = 0UL; process.Leak().ProcessSignal.SignalID = SIGKILL; @@ -170,7 +170,7 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) process.Leak().Crash(); - Kernel::ke_stop(RUNTIME_CHECK_UNEXCPECTED); + Kernel::ke_panic(RUNTIME_CHECK_UNEXCPECTED); } /// @brief Enter syscall from assembly. diff --git a/dev/Kernel/HALKit/AMD64/HalCoreScheduler.cc b/dev/Kernel/HALKit/AMD64/HalCoreScheduler.cc index 02150f6e..ac103d0d 100644 --- a/dev/Kernel/HALKit/AMD64/HalCoreScheduler.cc +++ b/dev/Kernel/HALKit/AMD64/HalCoreScheduler.cc @@ -11,8 +11,8 @@ #include #include #include -#include -#include +#include +#include // Needed for SMP. #include diff --git a/dev/Kernel/HALKit/AMD64/HalDebugOutput.cc b/dev/Kernel/HALKit/AMD64/HalDebugOutput.cc index 6ae5859d..ce3690b3 100644 --- a/dev/Kernel/HALKit/AMD64/HalDebugOutput.cc +++ b/dev/Kernel/HALKit/AMD64/HalDebugOutput.cc @@ -47,7 +47,7 @@ namespace Kernel // Check if serial is faulty (i.e: not same byte as sent) if (HAL::rt_in8(PORT) != 0xAE) { - ke_stop(RUNTIME_CHECK_HANDSHAKE); + ke_panic(RUNTIME_CHECK_HANDSHAKE); } kState = kStateReady; diff --git a/dev/Kernel/HALKit/AMD64/HalKernelMain.cc b/dev/Kernel/HALKit/AMD64/HalKernelMain.cc index bf297d6a..75c41433 100644 --- a/dev/Kernel/HALKit/AMD64/HalKernelMain.cc +++ b/dev/Kernel/HALKit/AMD64/HalKernelMain.cc @@ -11,8 +11,8 @@ #include #include #include -#include -#include +#include +#include EXTERN_C Kernel::VoidPtr kInterruptVectorTable[]; EXTERN_C Kernel::VoidPtr mp_user_switch_proc; @@ -79,12 +79,12 @@ EXTERN_C void hal_init_platform( Kernel::HAL::GDTLoader gdt_loader; gdt_loader.Load(gdt_reg); - Kernel::ke_stop(RUNTIME_CHECK_BOOTSTRAP); + Kernel::ke_panic(RUNTIME_CHECK_BOOTSTRAP); } EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept { - CG::ui_draw_background(); + UI::ui_draw_background(); auto str_proc = Kernel::rt_alloc_string("System"); Kernel::rtl_create_process(rtl_kernel_main, str_proc); diff --git a/dev/Kernel/HALKit/ARM64/HalKernelMain.cc b/dev/Kernel/HALKit/ARM64/HalKernelMain.cc index 3892e31b..ff4676e4 100644 --- a/dev/Kernel/HALKit/ARM64/HalKernelMain.cc +++ b/dev/Kernel/HALKit/ARM64/HalKernelMain.cc @@ -5,7 +5,7 @@ ------------------------------------------- */ #include -#include +#include #include #include #include @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include Kernel::Void hal_real_init(Kernel::Void) noexcept; @@ -47,7 +47,7 @@ EXTERN_C void hal_init_platform( /// @note do initialize the interrupts after it. - CG::ui_draw_background(); + UI::ui_draw_background(); auto str_proc = Kernel::rt_alloc_string("System"); Kernel::rtl_create_process(rtl_kernel_main, str_proc); diff --git a/dev/Kernel/HALKit/ARM64/Storage/.gitkeep b/dev/Kernel/HALKit/ARM64/Storage/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/dev/Kernel/HALKit/ARM64/Storage/HalFlash.cc b/dev/Kernel/HALKit/ARM64/Storage/HalFlash.cc deleted file mode 100644 index 9bd71b57..00000000 --- a/dev/Kernel/HALKit/ARM64/Storage/HalFlash.cc +++ /dev/null @@ -1,66 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024, Theater Quality Inc, all rights reserved. - -------------------------------------------- */ - -#include -#include - -/// @file Flash.cc -/// @brief Flash memory builtin. - -#ifdef __USE_MBCI_FLASH__ - -#define kMaxFlash (4U) - -namespace Kernel -{ - /// /:/BRIDGE/FLSH/1 - constexpr auto kFlashBridgeMagic = "FLSH"; - constexpr auto kFlashBridgeRevision = 1; - - STATIC const Boolean kFlashEnabled = No; - STATIC SizeT kFlashSize[kMaxFlash] = {}; - STATIC SizeT kFlashSectorSz[kMaxFlash] = {}; - - /// @brief Enable flash memory builtin. - STATIC Void drv_enable_flash(Int32 slot); - - /// @brief Disable flash memory builtin. - STATIC Void drv_disable_flash(Int32 slot); - - /// @brief get sector count. - /// @return drive sector count. - SizeT drv_get_sector_count(Int32 slot) - { - if (slot > kMaxFlash) - return 0; - - return kFlashSectorSz[slot]; - } - - /// @brief get device size. - /// @return drive size - SizeT drv_get_size(Int32 slot) - { - if (slot > kMaxFlash) - return 0; - - return kFlashSize[slot]; - } - - /// @brief Enable flash memory at slot. - STATIC Void drv_enable_flash(Int32 arg) - { - kcout << "Enabled FLSH hardware.\r"; - } - - /// @brief Disable flash memory at slot. - STATIC Void drv_disable_flash(Int32 arg) - { - kcout << "Disabled FLSH hardware.\r"; - } -} // namespace Kernel - -#endif // if __USE_MBCI_FLASH__ (Bridge) diff --git a/dev/Kernel/HALKit/ARM64/Storage/HalFlashMemory.cc b/dev/Kernel/HALKit/ARM64/Storage/HalFlashMemory.cc new file mode 100644 index 00000000..d5a9ecf4 --- /dev/null +++ b/dev/Kernel/HALKit/ARM64/Storage/HalFlashMemory.cc @@ -0,0 +1,66 @@ +/* ------------------------------------------- + + Copyright (C) 2024, Theater Quality Inc, all rights reserved. + +------------------------------------------- */ + +#include +#include + +/// @file Flash.cc +/// @brief Flash memory builtin. + +#ifdef ZKA_USE_MBCI_FLASH + +#define kMaxFlash (4U) + +namespace Kernel +{ + /// /Mount/Flash/n + constexpr auto kFlashBridgeMagic = "FLSH"; + constexpr auto kFlashBridgeRevision = 1; + + STATIC const Boolean kFlashEnabled = No; + STATIC SizeT kFlashSize[kMaxFlash] = {}; + STATIC SizeT kFlashSectorSz[kMaxFlash] = {}; + + /// @brief Enable flash memory builtin. + STATIC Void drv_enable_flash(Int32 slot); + + /// @brief Disable flash memory builtin. + STATIC Void drv_disable_flash(Int32 slot); + + /// @brief get sector count. + /// @return drive sector count. + SizeT drv_get_sector_count(Int32 slot) + { + if (slot > kMaxFlash) + return 0; + + return kFlashSectorSz[slot]; + } + + /// @brief get device size. + /// @return drive size + SizeT drv_get_size(Int32 slot) + { + if (slot > kMaxFlash) + return 0; + + return kFlashSize[slot]; + } + + /// @brief Enable flash memory at slot. + STATIC Void drv_enable_flash(Int32 arg) + { + kcout << "Enabled FLSH hardware.\r"; + } + + /// @brief Disable flash memory at slot. + STATIC Void drv_disable_flash(Int32 arg) + { + kcout << "Disabled FLSH hardware.\r"; + } +} // namespace Kernel + +#endif // if ZKA_USE_MBCI_FLASH (Bridge) diff --git a/dev/Kernel/KernelKit/DebugOutput.h b/dev/Kernel/KernelKit/DebugOutput.h index 42cd8748..af9c5b79 100644 --- a/dev/Kernel/KernelKit/DebugOutput.h +++ b/dev/Kernel/KernelKit/DebugOutput.h @@ -192,7 +192,7 @@ namespace Kernel #endif // ifdef kcout #define kcout \ - (Kernel::TerminalDevice::The() << "\e[0;31m [ " << __FILE__ << ": LINE: " << Kernel::number(__LINE__)); \ + (Kernel::TerminalDevice::The() << "\e[0;31m [ (" << __FILE__ << ") Line: " << Kernel::number(__LINE__)); \ (Kernel::TerminalDevice::The() << " ] \e[0m" \ << ": ") #define endl Kernel::TerminalDevice::The() << Kernel::end_line() diff --git a/dev/Kernel/KernelKit/Heap.h b/dev/Kernel/KernelKit/Heap.h index 6c7e04bd..90ed6266 100644 --- a/dev/Kernel/KernelKit/Heap.h +++ b/dev/Kernel/KernelKit/Heap.h @@ -11,7 +11,7 @@ // file: Heap.h // description: heap allocation support. -#include +#include #include #include diff --git a/dev/Kernel/NewKit/DriverMgr.h b/dev/Kernel/NewKit/DriverMgr.h new file mode 100644 index 00000000..a23ce4f2 --- /dev/null +++ b/dev/Kernel/NewKit/DriverMgr.h @@ -0,0 +1,19 @@ + +/* ------------------------------------------- + + Copyright (C) 2024, Theater Quality Inc, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include + +/// @file DriverMgr.h +/// @brief Driver loader manager. + +namespace Kernel +{ + class UserDriver; + class KernelDriver; +} \ No newline at end of file diff --git a/dev/Kernel/NewKit/KString.h b/dev/Kernel/NewKit/KString.h index a7020a10..9ea2f0e4 100644 --- a/dev/Kernel/NewKit/KString.h +++ b/dev/Kernel/NewKit/KString.h @@ -10,7 +10,7 @@ #include #include #include -#include +#include #define cMinimumStringSize 8196 diff --git a/dev/Kernel/NewKit/KernelPanic.h b/dev/Kernel/NewKit/KernelPanic.h new file mode 100644 index 00000000..7fc2ab30 --- /dev/null +++ b/dev/Kernel/NewKit/KernelPanic.h @@ -0,0 +1,71 @@ + +/* ------------------------------------------- + + Copyright (C) 2024, Theater Quality Inc, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include + +namespace Kernel +{ + void ke_runtime_check(bool bExpression, const Char* file, const Char* line); +} + +#define MUST_PASS_COMPILER(EXPR, MSG) static_assert(EXPR, MSG) + +#define __MUST_PASS(EXPR, FILE, LINE) \ + Kernel::ke_runtime_check(EXPR, FILE, STRINGIFY(LINE)) + +#ifdef __DEBUG__ +#define MUST_PASS(EXPR) __MUST_PASS((EXPR), __FILE__, __LINE__) +#define assert(EXPR) MUST_PASS(EXPR, RUNTIME_CHECK_EXPRESSION) +#else +#define MUST_PASS(EXPR) (Kernel::Void)(EXPR) +#define assert(EXPR) (Kernel::Void)(EXPR) +#endif + +enum RUNTIME_CHECK +{ + RUNTIME_CHECK_FAILED = -1, + RUNTIME_CHECK_POINTER = 0, + RUNTIME_CHECK_EXPRESSION, + RUNTIME_CHECK_FILE, + RUNTIME_CHECK_IPC, + RUNTIME_CHECK_TLS, + RUNTIME_CHECK_HANDSHAKE, + RUNTIME_CHECK_ACPI, + RUNTIME_CHECK_INVALID_PRIVILEGE, + RUNTIME_CHECK_PROCESS, + RUNTIME_CHECK_BAD_BEHAVIOR, + RUNTIME_CHECK_BOOTSTRAP, + RUNTIME_CHECK_UNEXCPECTED, + RUNTIME_CHECK_FILESYSTEM, + RUNTIME_CHECK_VIRTUAL_OUT_OF_MEM, + RUNTIME_CHECK_PAGE, + RUNTIME_CHECK_COUNT, +}; + +namespace Kernel +{ + /// @brief Dumping factory class. + class RecoveryFactory final + { + public: + STATIC Void Recover() noexcept; + }; + + void ke_panic(const Int32& id); +} // namespace Kernel + +#ifdef TRY +#undef TRY +#endif + +#define TRY(FN) \ + if (!FN()) \ + { \ + MUST_PASS(false); \ + } diff --git a/dev/Kernel/NewKit/New.h b/dev/Kernel/NewKit/New.h index eb6c33e4..8ee33232 100644 --- a/dev/Kernel/NewKit/New.h +++ b/dev/Kernel/NewKit/New.h @@ -4,11 +4,13 @@ Copyright (C) 2024, Theater Quality Inc, all rights reserved. ------------------------------------------- */ + #pragma once #include -typedef __SIZE_TYPE__ size_t; // gcc will complain about that +/// @note compatible with tk too. +typedef __SIZE_TYPE__ size_t; void* operator new(size_t ptr); void* operator new[](size_t ptr); diff --git a/dev/Kernel/NewKit/NewKit.h b/dev/Kernel/NewKit/NewKit.h index e17c3465..e32e96b4 100644 --- a/dev/Kernel/NewKit/NewKit.h +++ b/dev/Kernel/NewKit/NewKit.h @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/dev/Kernel/NewKit/OwnPtr.h b/dev/Kernel/NewKit/OwnPtr.h index 36d1cdea..4f1cec7a 100644 --- a/dev/Kernel/NewKit/OwnPtr.h +++ b/dev/Kernel/NewKit/OwnPtr.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include #include namespace Kernel diff --git a/dev/Kernel/NewKit/Ref.h b/dev/Kernel/NewKit/Ref.h index 75500693..34b8891a 100644 --- a/dev/Kernel/NewKit/Ref.h +++ b/dev/Kernel/NewKit/Ref.h @@ -9,7 +9,7 @@ #define _NEWKIT_REF_H_ #include -#include +#include #include namespace Kernel diff --git a/dev/Kernel/NewKit/Stop.h b/dev/Kernel/NewKit/Stop.h deleted file mode 100644 index 0d7bf27b..00000000 --- a/dev/Kernel/NewKit/Stop.h +++ /dev/null @@ -1,71 +0,0 @@ - -/* ------------------------------------------- - - Copyright (C) 2024, Theater Quality Inc, all rights reserved. - -------------------------------------------- */ - -#pragma once - -#include - -namespace Kernel -{ - void ke_runtime_check(bool bExpression, const Char* file, const Char* line); -} - -#define MUST_PASS_COMPILER(EXPR, MSG) static_assert(EXPR, MSG) - -#define __MUST_PASS(EXPR, FILE, LINE) \ - Kernel::ke_runtime_check(EXPR, FILE, STRINGIFY(LINE)) - -#ifdef __DEBUG__ -#define MUST_PASS(EXPR) __MUST_PASS((EXPR), __FILE__, __LINE__) -#define assert(EXPR) MUST_PASS(EXPR, RUNTIME_CHECK_EXPRESSION) -#else -#define MUST_PASS(EXPR) (Kernel::Void)(EXPR) -#define assert(EXPR) (Kernel::Void)(EXPR) -#endif - -enum RUNTIME_CHECK -{ - RUNTIME_CHECK_FAILED = -1, - RUNTIME_CHECK_POINTER = 0, - RUNTIME_CHECK_EXPRESSION, - RUNTIME_CHECK_FILE, - RUNTIME_CHECK_IPC, - RUNTIME_CHECK_TLS, - RUNTIME_CHECK_HANDSHAKE, - RUNTIME_CHECK_ACPI, - RUNTIME_CHECK_INVALID_PRIVILEGE, - RUNTIME_CHECK_PROCESS, - RUNTIME_CHECK_BAD_BEHAVIOR, - RUNTIME_CHECK_BOOTSTRAP, - RUNTIME_CHECK_UNEXCPECTED, - RUNTIME_CHECK_FILESYSTEM, - RUNTIME_CHECK_VIRTUAL_OUT_OF_MEM, - RUNTIME_CHECK_PAGE, - RUNTIME_CHECK_COUNT, -}; - -namespace Kernel -{ - /// @brief Dumping factory class. - class RecoveryFactory final - { - public: - STATIC Void Recover() noexcept; - }; - - void ke_stop(const Int32& id); -} // namespace Kernel - -#ifdef TRY -#undef TRY -#endif - -#define TRY(FN) \ - if (!FN()) \ - { \ - MUST_PASS(false); \ - } diff --git a/dev/Kernel/NewKit/SwapMgr.h b/dev/Kernel/NewKit/SwapMgr.h new file mode 100644 index 00000000..822a1565 --- /dev/null +++ b/dev/Kernel/NewKit/SwapMgr.h @@ -0,0 +1,21 @@ + +/* ------------------------------------------- + + Copyright (C) 2024, Theater Quality Inc, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include + +#define kSwapMgrBlockMaxSize mib_cast(16) +#define KSwapMgrBlockMagic "SWEP " + +/// @file SwapMgr.h +/// @brief Virtual memory swap API. + +namespace Kernel +{ + class UserSwapProcess; +} \ No newline at end of file diff --git a/dev/Kernel/NewKit/ThreadMgr.h b/dev/Kernel/NewKit/ThreadMgr.h new file mode 100644 index 00000000..8148c28d --- /dev/null +++ b/dev/Kernel/NewKit/ThreadMgr.h @@ -0,0 +1,20 @@ + +/* ------------------------------------------- + + Copyright (C) 2024, Theater Quality Inc, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include + +/// @file ThreadMgr.h +/// @brief This file takes care of creating processes/threads from a subsystem context. + +namespace Kernel +{ + class UserSubsystem; + class UserEnvVar; + class UserEnv; +} \ No newline at end of file diff --git a/dev/Kernel/src/ACPIFactoryInterface.cc b/dev/Kernel/src/ACPIFactoryInterface.cc index 424a951a..83890220 100644 --- a/dev/Kernel/src/ACPIFactoryInterface.cc +++ b/dev/Kernel/src/ACPIFactoryInterface.cc @@ -37,7 +37,7 @@ namespace Kernel if (num < 1) { /// stop here, we should have entries... - ke_stop(RUNTIME_CHECK_ACPI); + ke_panic(RUNTIME_CHECK_ACPI); return ErrorOr{-1}; } diff --git a/dev/Kernel/src/BitMapMgr.cc b/dev/Kernel/src/BitMapMgr.cc index be9f73b8..f73ea911 100644 --- a/dev/Kernel/src/BitMapMgr.cc +++ b/dev/Kernel/src/BitMapMgr.cc @@ -13,7 +13,7 @@ #endif #include -#include +#include #define kBitMapMagic (0x10210U) diff --git a/dev/Kernel/src/FS/HPFS.cc b/dev/Kernel/src/FS/HPFS.cc index 8aba73ac..98c41f23 100644 --- a/dev/Kernel/src/FS/HPFS.cc +++ b/dev/Kernel/src/FS/HPFS.cc @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/dev/Kernel/src/FS/NeFS.cc b/dev/Kernel/src/FS/NeFS.cc index 1dd08e4f..650d42c3 100644 --- a/dev/Kernel/src/FS/NeFS.cc +++ b/dev/Kernel/src/FS/NeFS.cc @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/dev/Kernel/src/Heap.cc b/dev/Kernel/src/Heap.cc index 77425670..2575bbcc 100644 --- a/dev/Kernel/src/Heap.cc +++ b/dev/Kernel/src/Heap.cc @@ -105,7 +105,7 @@ namespace Kernel return nullptr; kcout << "This function is not implemented by minOSKrnl, please use the BSD's realloc instead.\r"; - ke_stop(RUNTIME_CHECK_PROCESS); + ke_panic(RUNTIME_CHECK_PROCESS); return nullptr; } @@ -235,7 +235,7 @@ namespace Kernel { if (!heap_info_ptr->fUser) { - ke_stop(RUNTIME_CHECK_POINTER); + ke_panic(RUNTIME_CHECK_POINTER); } } } diff --git a/dev/Kernel/src/KernelMain.cc b/dev/Kernel/src/KernelMain.cc index cc889619..d3498f24 100644 --- a/dev/Kernel/src/KernelMain.cc +++ b/dev/Kernel/src/KernelMain.cc @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright ZKA Technologies + Copyright Theater Quality Inc File: Main.cxx Purpose: Main entrypoint of kernel. @@ -22,7 +22,7 @@ #include #include #include -#include +#include #include namespace Kernel::Detail diff --git a/dev/Kernel/src/KernelPanic.cc b/dev/Kernel/src/KernelPanic.cc new file mode 100644 index 00000000..0fd2ec64 --- /dev/null +++ b/dev/Kernel/src/KernelPanic.cc @@ -0,0 +1,130 @@ +/* ------------------------------------------- + + Copyright (C) 2024, Theater Quality Inc, all rights reserved. + +------------------------------------------- */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define kWebsiteURL "https://el-mahrouss-logic.com/products/help/" + +/* Each error code is attributed with an ID, which will prompt a string onto the + * screen. Wait for debugger... */ + +namespace Kernel +{ + /***********************************************************************************/ + /// @brief Stops execution of the kernel. + /// @param id kernel stop ID. + /***********************************************************************************/ + Void ke_panic(const Kernel::Int32& id) + { + fb_init(); + + auto panic_text = RGB(0xff, 0xff, 0xff); + + auto start_y = 50; + auto x = 10; + + if (id != RUNTIME_CHECK_BOOTSTRAP) + fb_render_string("Kernel Panic!", start_y, x, panic_text); + else + fb_render_string("Kernel Bootstrap:", start_y, x, panic_text); + + start_y += 10; + + fb_fini(); + + // show text according to error id. + + switch (id) + { + case RUNTIME_CHECK_PROCESS: { + fb_render_string("0x00000008: Invalid process behavior.", start_y, x, panic_text); + break; + } + case RUNTIME_CHECK_ACPI: { + fb_render_string("0x00000006: ACPI configuration error.", start_y, x, panic_text); + break; + } + case RUNTIME_CHECK_PAGE: { + fb_render_string("0x0000000B: Write/Read in non paged area.", start_y, x, panic_text); + break; + } + case RUNTIME_CHECK_FILESYSTEM: { + fb_render_string("0x0000000A: Filesystem driver error.", start_y, x, panic_text); + break; + } + case RUNTIME_CHECK_POINTER: { + fb_render_string("0x00000000: Kernel heap is corrupted.", start_y, x, panic_text); + break; + } + case RUNTIME_CHECK_BAD_BEHAVIOR: { + fb_render_string("0x00000009: Bad behavior.", start_y, x, panic_text); + break; + } + case RUNTIME_CHECK_BOOTSTRAP: { + fb_render_string("0x0000000A: Kernel has finished running, running OSLdr...", start_y, x, panic_text); + return; + } + case RUNTIME_CHECK_HANDSHAKE: { + fb_render_string("0x00000005: Handshake fault.", start_y, x, panic_text); + break; + } + case RUNTIME_CHECK_IPC: { + fb_render_string("0x00000003: Bad LPC message.", start_y, x, panic_text); + break; + } + case RUNTIME_CHECK_INVALID_PRIVILEGE: { + fb_render_string("0x00000007: Privilege access violation.", start_y, x, panic_text); + break; + case RUNTIME_CHECK_UNEXCPECTED: { + fb_render_string("0x0000000B: Unexpected violation.", start_y, x, panic_text); + break; + } + case RUNTIME_CHECK_VIRTUAL_OUT_OF_MEM: { + fb_render_string("0x10000001: Out of virtual memory.", start_y, x, panic_text); + + break; + } + case RUNTIME_CHECK_FAILED: { + fb_render_string("0x10000001: Kernel Bug check appears to have failed, a dump has been written to the storage.", start_y, x, panic_text); + break; + } + default: { + fb_render_string("0xFFFFFFFC: Unknown Kernel Error code.", start_y, x, panic_text); + break; + } + } + }; + + RecoveryFactory::Recover(); + } + + Void RecoveryFactory::Recover() noexcept + { + while (YES) + { + HAL::rt_halt(); + } + } + + void ke_runtime_check(bool expr, const Char* file, const Char* line) + { + if (!expr) + { + kcout << "FAILED: FILE: " << file << endl; + kcout << "FAILED: LINE: " << line << endl; + + ke_panic(RUNTIME_CHECK_FAILED); // Runtime Check failed + } + } +} // namespace Kernel diff --git a/dev/Kernel/src/LPC.cc b/dev/Kernel/src/LPC.cc index 07a7b982..f9a13796 100644 --- a/dev/Kernel/src/LPC.cc +++ b/dev/Kernel/src/LPC.cc @@ -5,7 +5,7 @@ ------------------------------------------- */ #include -#include +#include namespace Kernel { @@ -18,7 +18,7 @@ namespace Kernel { if (kRaiseOnBugCheck) { - ke_stop(RUNTIME_CHECK_BAD_BEHAVIOR); + ke_panic(RUNTIME_CHECK_BAD_BEHAVIOR); } return No; diff --git a/dev/Kernel/src/PEFCodeMgr.cc b/dev/Kernel/src/PEFCodeMgr.cc index a27db7e3..a8205004 100644 --- a/dev/Kernel/src/PEFCodeMgr.cc +++ b/dev/Kernel/src/PEFCodeMgr.cc @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include #include diff --git a/dev/Kernel/src/Stop.cc b/dev/Kernel/src/Stop.cc deleted file mode 100644 index a8974849..00000000 --- a/dev/Kernel/src/Stop.cc +++ /dev/null @@ -1,130 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024, Theater Quality Inc, all rights reserved. - -------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define kWebsiteURL "https://el-mahrouss-logic.com/products/help/" - -/* Each error code is attributed with an ID, which will prompt a string onto the - * screen. Wait for debugger... */ - -namespace Kernel -{ - /***********************************************************************************/ - /// @brief Stops execution of the kernel. - /// @param id kernel stop ID. - /***********************************************************************************/ - Void ke_stop(const Kernel::Int32& id) - { - cg_init(); - - auto panic_text = RGB(0xff, 0xff, 0xff); - - auto start_y = 50; - auto x = 10; - - if (id != RUNTIME_CHECK_BOOTSTRAP) - fb_render_string("Kernel Panic!", start_y, x, panic_text); - else - fb_render_string("Kernel Bootstrap:", start_y, x, panic_text); - - start_y += 10; - - cg_fini(); - - // show text according to error id. - - switch (id) - { - case RUNTIME_CHECK_PROCESS: { - fb_render_string("0x00000008: Invalid process behavior.", start_y, x, panic_text); - break; - } - case RUNTIME_CHECK_ACPI: { - fb_render_string("0x00000006: ACPI configuration error.", start_y, x, panic_text); - break; - } - case RUNTIME_CHECK_PAGE: { - fb_render_string("0x0000000B: Write/Read in non paged area.", start_y, x, panic_text); - break; - } - case RUNTIME_CHECK_FILESYSTEM: { - fb_render_string("0x0000000A: Filesystem driver error.", start_y, x, panic_text); - break; - } - case RUNTIME_CHECK_POINTER: { - fb_render_string("0x00000000: Kernel heap is corrupted.", start_y, x, panic_text); - break; - } - case RUNTIME_CHECK_BAD_BEHAVIOR: { - fb_render_string("0x00000009: Bad behavior.", start_y, x, panic_text); - break; - } - case RUNTIME_CHECK_BOOTSTRAP: { - fb_render_string("0x0000000A: Kernel has finished running, running OSLdr...", start_y, x, panic_text); - return; - } - case RUNTIME_CHECK_HANDSHAKE: { - fb_render_string("0x00000005: Handshake fault.", start_y, x, panic_text); - break; - } - case RUNTIME_CHECK_IPC: { - fb_render_string("0x00000003: Bad LPC message.", start_y, x, panic_text); - break; - } - case RUNTIME_CHECK_INVALID_PRIVILEGE: { - fb_render_string("0x00000007: Privilege access violation.", start_y, x, panic_text); - break; - case RUNTIME_CHECK_UNEXCPECTED: { - fb_render_string("0x0000000B: Unexpected violation.", start_y, x, panic_text); - break; - } - case RUNTIME_CHECK_VIRTUAL_OUT_OF_MEM: { - fb_render_string("0x10000001: Out of virtual memory.", start_y, x, panic_text); - - break; - } - case RUNTIME_CHECK_FAILED: { - fb_render_string("0x10000001: Kernel Bug check appears to have failed, a dump has been written to the storage.", start_y, x, panic_text); - break; - } - default: { - fb_render_string("0xFFFFFFFC: Unknown Kernel Error code.", start_y, x, panic_text); - break; - } - } - }; - - RecoveryFactory::Recover(); - } - - Void RecoveryFactory::Recover() noexcept - { - while (YES) - { - HAL::rt_halt(); - } - } - - void ke_runtime_check(bool expr, const Char* file, const Char* line) - { - if (!expr) - { - kcout << "FAILED: FILE: " << file << endl; - kcout << "FAILED: LINE: " << line << endl; - - ke_stop(RUNTIME_CHECK_FAILED); // Runtime Check failed - } - } -} // namespace Kernel diff --git a/dev/Kernel/src/User.cc b/dev/Kernel/src/User.cc index d45c8e1b..8d1bcac9 100644 --- a/dev/Kernel/src/User.cc +++ b/dev/Kernel/src/User.cc @@ -12,7 +12,7 @@ #include #include -#include +#include #include #include #include diff --git a/dev/Kernel/src/UserProcessScheduler.cc b/dev/Kernel/src/UserProcessScheduler.cc index 512b0c22..3904c222 100644 --- a/dev/Kernel/src/UserProcessScheduler.cc +++ b/dev/Kernel/src/UserProcessScheduler.cc @@ -256,7 +256,7 @@ namespace Kernel if (!success) { - ke_stop(RUNTIME_CHECK_PROCESS); + ke_panic(RUNTIME_CHECK_PROCESS); } this->DylibDelegate = nullptr; -- cgit v1.2.3