diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-12-31 15:24:18 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-12-31 15:24:18 +0100 |
| commit | 510c659355d9227d1b75edfe50c1b8691ea2f982 (patch) | |
| tree | 56b5cc1b536555c5b313d4fb104410f9cf04fff0 /dev | |
| parent | e48bf6e7af428f34bd85b733060554cfec6591d5 (diff) | |
IMPL: Better panic screen, fixing CUSA as in the gh issue.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev')
| -rw-r--r-- | dev/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc | 10 | ||||
| -rw-r--r-- | dev/Kernel/HALKit/AMD64/HalCoreScheduler.cc | 10 | ||||
| -rw-r--r-- | dev/Kernel/HALKit/AMD64/HalInterruptAPI.asm | 135 | ||||
| -rw-r--r-- | dev/Kernel/HALKit/AMD64/HalKernelPanic.cc | 93 | ||||
| -rw-r--r-- | dev/Kernel/NewKit/KernelPanic.h | 15 | ||||
| -rw-r--r-- | dev/Kernel/NewKit/Utils.h | 2 | ||||
| -rw-r--r-- | dev/Kernel/src/KernelPanic.cc | 128 | ||||
| -rw-r--r-- | dev/Kernel/src/UserProcessScheduler.cc | 1 | ||||
| -rw-r--r-- | dev/Kernel/src/Utils.cc | 67 |
9 files changed, 228 insertions, 233 deletions
diff --git a/dev/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc index aa986635..771a1e33 100644 --- a/dev/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc +++ b/dev/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc @@ -29,8 +29,6 @@ EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) process.Leak().Status = Kernel::ProcessStatusKind::kFrozen; process.Leak().Crash(); - - Kernel::ke_panic(RUNTIME_CHECK_POINTER); } /// @brief Handle page fault. @@ -54,8 +52,8 @@ EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) process.Leak().Status = Kernel::ProcessStatusKind::kFrozen; process.Leak().Crash(); + - Kernel::ke_panic(RUNTIME_CHECK_PAGE); } /// @brief Handle scheduler interrupt. @@ -102,7 +100,7 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) process.Leak().Crash(); - Kernel::ke_panic(RUNTIME_CHECK_UNEXCPECTED); + } /// @brief Handle any generic fault. @@ -125,8 +123,8 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) process.Leak().Status = Kernel::ProcessStatusKind::kFrozen; process.Leak().Crash(); + - Kernel::ke_panic(RUNTIME_CHECK_UNEXCPECTED); } EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) @@ -170,7 +168,7 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) process.Leak().Crash(); - 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 f42787c3..c8556ddc 100644 --- a/dev/Kernel/HALKit/AMD64/HalCoreScheduler.cc +++ b/dev/Kernel/HALKit/AMD64/HalCoreScheduler.cc @@ -28,7 +28,7 @@ #define kAPIC_BASE_MSR_BSP 0x100 #define kAPIC_BASE_MSR_ENABLE 0x800 -#define cSMPMax (32U) +#define kSMPMax (32U) /// @note: _hal_switch_context is internal @@ -48,8 +48,8 @@ namespace Kernel::HAL STATIC Bool kSMPAware = false; STATIC Int64 kSMPCount = 0; - STATIC Int32 cSMPInterrupt = 0; - STATIC UInt64 kAPICLocales[cSMPMax] = {0}; + STATIC Int32 kSMPInterrupt = 0; + STATIC UInt64 kAPICLocales[kSMPMax] = {0}; STATIC VoidPtr kRawMADT = nullptr; /// @brief Multiple APIC Descriptor Table. @@ -194,7 +194,7 @@ namespace Kernel::HAL // reset values. - cSMPInterrupt = 0; + kSMPInterrupt = 0; kSMPCount = 0; kcout << "SMP: Probing Local APICs...\r"; @@ -204,7 +204,7 @@ namespace Kernel::HAL while (Yes) { if (kMADTBlock->List[index].Type > 9 || - kSMPCount > cSMPMax) + kSMPCount > kSMPMax) break; switch (kMADTBlock->List[index].Type) diff --git a/dev/Kernel/HALKit/AMD64/HalInterruptAPI.asm b/dev/Kernel/HALKit/AMD64/HalInterruptAPI.asm index d0dcc2a9..11deca52 100644 --- a/dev/Kernel/HALKit/AMD64/HalInterruptAPI.asm +++ b/dev/Kernel/HALKit/AMD64/HalInterruptAPI.asm @@ -19,8 +19,8 @@ __ZKA_INT_%1: cli mov al, 0x20 - out 0x20, al out 0xA0, al + out 0x20, al sti o64 iret @@ -32,8 +32,8 @@ __ZKA_INT_%1: cli mov al, 0x20 - out 0x20, al out 0xA0, al + out 0x20, al sti o64 iret @@ -54,17 +54,36 @@ extern idt_handle_breakpoint section .text -IntNormal 0 -IntNormal 1 -IntNormal 2 +__ZKA_INT_0: + cli -section .data + mov al, 0x20 + out 0x20, al -__ZKA_INT_3_GET_RIP: - dq 0 -__ZKA_INT_3_GET_RIP_END: + sti + o64 iret -section .text +__ZKA_INT_1: + cli + + mov al, 0x20 + out 0x20, al + + sti + o64 iret + +__ZKA_INT_2: + cli + + mov al, 0x20 + out 0x20, al + + push rcx + call idt_handle_generic + pop rcx + + sti + o64 iret ;; @brief Triggers a breakpoint and freeze the process. RIP is also fetched. __ZKA_INT_3: @@ -72,23 +91,34 @@ __ZKA_INT_3: mov al, 0x20 out 0x20, al - out 0xA0, al - push rax - mov rax, idt_handle_breakpoint + push rcx + call idt_handle_generic + pop rcx + sti + o64 iret - lea rcx, [rel __ZKA_INT_3_GET_RIP] - sub rcx, 16 - mov [rcx], rcx +__ZKA_INT_4: + cli - call rax - pop rax + mov al, 0x20 + out 0x20, al + + push rcx + call idt_handle_generic + pop rcx sti o64 iret -IntNormal 4 -IntNormal 5 +__ZKA_INT_5: + cli + + mov al, 0x20 + out 0x20, al + + sti + o64 iret ;; Invalid opcode interrupt __ZKA_INT_6: @@ -96,36 +126,38 @@ __ZKA_INT_6: mov al, 0x20 out 0x20, al - out 0xA0, al - push rax - mov rax, idt_handle_ud + push rcx + call idt_handle_generic + pop rcx - mov rcx, rsp + sti + o64 iret - call rax - pop rax +__ZKA_INT_7: + cli + + mov al, 0x20 + out 0x20, al + + push rcx + call idt_handle_generic + pop rcx sti o64 iret -IntNormal 7 - ;; Invalid opcode interrupt __ZKA_INT_8: cli mov al, 0x20 - out 0x20, al out 0xA0, al + out 0x20, al - push rax - mov rax, idt_handle_generic - - mov rcx, rsp - - call rax - pop rax + push rcx + call idt_handle_generic + pop rcx sti o64 iret @@ -140,16 +172,12 @@ __ZKA_INT_13: cli mov al, 0x20 - out 0x20, al out 0xA0, al + out 0x20, al - push rax - mov rax, idt_handle_gpf - - mov rcx, rsp - - call rax - pop rax + push rcx + call idt_handle_gpf + pop rcx sti o64 iret @@ -158,15 +186,12 @@ __ZKA_INT_14: cli mov al, 0x20 - out 0x20, al out 0xA0, al - push rax - mov rax, idt_handle_pf - - mov rcx, rsp + out 0x20, al - call rax - pop rax + push rcx + call idt_handle_pf + pop rcx sti o64 iret @@ -197,9 +222,9 @@ __ZKA_INT_32: cli mov al, 0x20 - out 0x20, al out 0xA0, al - + out 0x20, al + push rax mov rcx, rsp call idt_handle_scheduler @@ -236,8 +261,8 @@ __ZKA_INT_50: cli mov al, 0x20 - out 0x20, al out 0xA0, al + out 0x20, al push rax mov rax, hal_system_call_enter @@ -256,8 +281,8 @@ __ZKA_INT_51: cli mov al, 0x20 - out 0x20, al out 0xA0, al + out 0x20, al push rax mov rax, hal_kernel_call_enter diff --git a/dev/Kernel/HALKit/AMD64/HalKernelPanic.cc b/dev/Kernel/HALKit/AMD64/HalKernelPanic.cc new file mode 100644 index 00000000..ac41f7fa --- /dev/null +++ b/dev/Kernel/HALKit/AMD64/HalKernelPanic.cc @@ -0,0 +1,93 @@ +/* ------------------------------------------- + + Copyright (C) 2024, Theater Quality Corp, all rights reserved. + +------------------------------------------- */ + +#include <NewKit/KernelPanic.h> +#include <ArchKit/ArchKit.h> +#include <KernelKit/Timer.h> +#include <KernelKit/DebugOutput.h> +#include <NewKit/KString.h> +#include <FirmwareKit/Handover.h> +#include <KernelKit/FileMgr.h> +#include <Mod/GfxMgr/FBMgr.h> +#include <Mod/GfxMgr/TextMgr.h> +#include <NewKit/Utils.h> + +/* Each error code is attributed with an ID, which will prompt a string onto the + * screen. Wait for debugger... */ + +namespace Kernel +{ + /// @brief Dumping factory class. + class RecoveryFactory final + { + public: + STATIC Void Recover() noexcept; + }; + + /***********************************************************************************/ + /// @brief Stops execution of the kernel. + /// @param id kernel stop ID. + /***********************************************************************************/ + Void ke_panic(const Kernel::Int32& id, const Char* message) + { + fb_init(); + + auto panic_text = RGB(0xff, 0xff, 0xff); + + auto y = 10; + auto x = 10; + + Char* message_apicid = new Char[128]; + rt_set_memory(message_apicid, 0, 128); + + rt_copy_memory((VoidPtr) "panic id: ", message_apicid, rt_string_len("panic id: ")); + rt_to_string(message_apicid + rt_string_len("panic id: "), (UIntPtr)id, 10); + + fb_render_string(message_apicid, y, x, panic_text); + + y += 10; + + fb_render_string((message ? message : "message: panic raised, going nowhere after this!"), y, x, panic_text); + + y += 10; + + Char* message_cr2 = new Char[128]; + rt_set_memory(message_cr2, 0, 128); + + rt_copy_memory((VoidPtr) "cr2: ", message_cr2, rt_string_len("cr2: ")); + rt_to_string(message_cr2 + rt_string_len("cr2: "), (UIntPtr)hal_read_cr2(), 10); + + fb_render_string(message_cr2, y, x, panic_text); + + kcout << message_apicid; + kcout << message_cr2; + + y += 10; + + fb_clear(); + + 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, file); // Runtime Check failed + } + } +} // namespace Kernel diff --git a/dev/Kernel/NewKit/KernelPanic.h b/dev/Kernel/NewKit/KernelPanic.h index bc61bd3b..bd119357 100644 --- a/dev/Kernel/NewKit/KernelPanic.h +++ b/dev/Kernel/NewKit/KernelPanic.h @@ -11,7 +11,7 @@ namespace Kernel { - void ke_runtime_check(bool bExpression, const Char* file, const Char* line); + void ke_runtime_check(bool expr, const Char* file, const Char* line); } #define MUST_PASS_COMPILER(EXPR, MSG) static_assert(EXPR, MSG) @@ -29,8 +29,8 @@ namespace Kernel enum RUNTIME_CHECK { - RUNTIME_CHECK_FAILED = -1, - RUNTIME_CHECK_POINTER = 0, + RUNTIME_CHECK_FAILED = 1111, + RUNTIME_CHECK_POINTER, RUNTIME_CHECK_EXPRESSION, RUNTIME_CHECK_FILE, RUNTIME_CHECK_IPC, @@ -50,14 +50,7 @@ enum RUNTIME_CHECK namespace Kernel { - /// @brief Dumping factory class. - class RecoveryFactory final - { - public: - STATIC Void Recover() noexcept; - }; - - void ke_panic(const Int32& id); + void ke_panic(const Int32& id, const Char* message = nullptr); } // namespace Kernel #ifdef TRY diff --git a/dev/Kernel/NewKit/Utils.h b/dev/Kernel/NewKit/Utils.h index fce335c0..af177550 100644 --- a/dev/Kernel/NewKit/Utils.h +++ b/dev/Kernel/NewKit/Utils.h @@ -19,7 +19,7 @@ namespace Kernel const Char* rt_alloc_string(const Char* text); Size rt_string_len(const Char* str); Size rt_string_len(const Char* str, SizeT _len); - Boolean rt_to_string(Char* buf, Int limit, Int base); + Boolean rt_to_string(Char* buf, UInt64 base, Int32 limit); Boolean is_newln(Char chr); Boolean is_space(Char chr); Int rt_to_uppercase(Int c); diff --git a/dev/Kernel/src/KernelPanic.cc b/dev/Kernel/src/KernelPanic.cc deleted file mode 100644 index d0119b5e..00000000 --- a/dev/Kernel/src/KernelPanic.cc +++ /dev/null @@ -1,128 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024, Theater Quality Corp, all rights reserved. - -------------------------------------------- */ - -#include <NewKit/KernelPanic.h> -#include <ArchKit/ArchKit.h> -#include <KernelKit/Timer.h> -#include <KernelKit/DebugOutput.h> -#include <NewKit/KString.h> -#include <FirmwareKit/Handover.h> -#include <KernelKit/FileMgr.h> -#include <Mod/GfxMgr/FBMgr.h> -#include <Mod/GfxMgr/TextMgr.h> - -/* 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_clear(); - - // 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: Pointer is invalid.", 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/UserProcessScheduler.cc b/dev/Kernel/src/UserProcessScheduler.cc index 831acf42..03fa58f6 100644 --- a/dev/Kernel/src/UserProcessScheduler.cc +++ b/dev/Kernel/src/UserProcessScheduler.cc @@ -12,7 +12,6 @@ /// @brief Low level/Ring-3 process scheduler. /***********************************************************************************/ -#include "HALKit/AMD64/Processor.h" #include <KernelKit/UserProcessScheduler.h> #include <KernelKit/HardwareThreadScheduler.h> #include <KernelKit/IPEFDLLObject.h> diff --git a/dev/Kernel/src/Utils.cc b/dev/Kernel/src/Utils.cc index 9f4a8609..9df612a3 100644 --- a/dev/Kernel/src/Utils.cc +++ b/dev/Kernel/src/Utils.cc @@ -109,7 +109,7 @@ namespace Kernel return nullptr; voidPtr v_src = reinterpret_cast<voidPtr>(const_cast<char*>(src)); - voidPtr v_dst = reinterpret_cast<voidPtr>(const_cast<char*>(string)); + voidPtr v_dst = reinterpret_cast<voidPtr>(const_cast<char*>(string)); rt_copy_memory(v_src, v_dst, rt_string_len(src) + 1); @@ -132,29 +132,6 @@ namespace Kernel return character; } - Bool rt_to_string(Char* str, Int32 limit, Int32 base) - { - if (limit == 0) - return false; - - Int copy_limit = limit; - Int cnt = 0; - Int ret = base; - - while (limit != 1) - { - ret = ret % 10; - str[cnt] = ret; - - ++cnt; - --limit; - --ret; - } - - str[copy_limit] = '\0'; - return true; - } - Boolean is_space(Char chr) { return chr == ' '; @@ -165,7 +142,7 @@ namespace Kernel return chr == '\n'; } - voidPtr rt_string_in_string(const Char* in, const Char* needle) + VoidPtr rt_string_in_string(const Char* in, const Char* needle) { for (SizeT i = 0; i < rt_string_len(in); ++i) { @@ -176,7 +153,45 @@ namespace Kernel return nullptr; } - // @brief Checks for a string start at the character. + Char rt_to_char(UInt64 base, Int32 limit) + { + const Char kNumbers[17] = "0123456789ABCDEF"; + return kNumbers[base % limit]; + } + + Bool rt_to_string(Char* str, UInt64 base, Int32 limit) + { +#ifdef __ZKA_AMD64__ + auto i = 0; + + auto final_number = base; + + auto mult = 1; + auto elems = 0L; + + base /= 10; + + while (base > 0) + { + elems++; + mult *= 10; + base /= 10; + } + + while (elems > -1) + { + final_number = (final_number % mult) * 10 + final_number / mult; + str[i] = rt_to_char(final_number, limit); + + --elems; + ++i; + } +#endif + + return YES; + } + + /// @brief Checks for a string start at the character. Char* rt_string_has_char(Char* str, const Char chr) { |
