summaryrefslogtreecommitdiffhomepage
path: root/dev/Kernel
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-12-31 15:24:18 +0100
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-12-31 15:24:18 +0100
commit510c659355d9227d1b75edfe50c1b8691ea2f982 (patch)
tree56b5cc1b536555c5b313d4fb104410f9cf04fff0 /dev/Kernel
parente48bf6e7af428f34bd85b733060554cfec6591d5 (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/Kernel')
-rw-r--r--dev/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc10
-rw-r--r--dev/Kernel/HALKit/AMD64/HalCoreScheduler.cc10
-rw-r--r--dev/Kernel/HALKit/AMD64/HalInterruptAPI.asm135
-rw-r--r--dev/Kernel/HALKit/AMD64/HalKernelPanic.cc93
-rw-r--r--dev/Kernel/NewKit/KernelPanic.h15
-rw-r--r--dev/Kernel/NewKit/Utils.h2
-rw-r--r--dev/Kernel/src/KernelPanic.cc128
-rw-r--r--dev/Kernel/src/UserProcessScheduler.cc1
-rw-r--r--dev/Kernel/src/Utils.cc67
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)
{