diff options
Diffstat (limited to 'dev')
| -rw-r--r-- | dev/ZKAKit/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc | 87 | ||||
| -rw-r--r-- | dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm | 31 | ||||
| -rw-r--r-- | dev/ZKAKit/HALKit/AMD64/Storage/AHCI-DMA.cc | 4 | ||||
| -rw-r--r-- | dev/ZKAKit/KernelKit/UserProcessScheduler.h | 16 | ||||
| -rw-r--r-- | dev/ZKAKit/NewKit/Defines.h | 16 | ||||
| -rw-r--r-- | dev/ZKAKit/NewKit/Macros.h | 36 | ||||
| -rw-r--r-- | dev/ZKAKit/PosixKit/Signals.h | 16 | ||||
| -rw-r--r-- | dev/ZKAKit/src/UserProcessScheduler.cc | 10 |
8 files changed, 166 insertions, 50 deletions
diff --git a/dev/ZKAKit/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/ZKAKit/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc index f6956793..149f2391 100644 --- a/dev/ZKAKit/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc +++ b/dev/ZKAKit/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc @@ -7,6 +7,7 @@ #include <ArchKit/ArchKit.h> #include <KernelKit/UserProcessScheduler.h> #include <NewKit/KString.h> +#include <PosixKit/Signals.h> /// @brief Handle GPF fault. /// @param rsp @@ -21,13 +22,26 @@ EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) { kcout << "Kernel: Page Fault.\r"; - Kernel::UserProcessScheduler::The().GetCurrentProcess().Leak().Crash(); + + kcout << "Kernel: SIGKILL set.\r"; + + auto process = Kernel::UserProcessScheduler::The().GetCurrentProcess(); + + process.Leak().ProcessSignal.SignalIP = 0UL; + process.Leak().ProcessSignal.SignalID = SIGKILL; + process.Leak().ProcessSignal.PreviousStatus = process.Leak().Status; + + kcout << "Kernel: PRCFROZE status set..\r"; + + process.Leak().Status = Kernel::ProcessStatusKind::kFrozen; + + process.Leak().Crash(); } /// @brief Handle scheduler interrupt. EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp) { - kcout << "Kernel: IRQ0.\r"; + kcout << "Kernel: Timer IRQ (Scheduler Notification).\r"; Kernel::UserProcessHelper::StartScheduling(); } @@ -35,16 +49,56 @@ EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp) /// @param rsp EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) { - kcout << "Kernel: Math.\r"; - Kernel::UserProcessScheduler::The().GetCurrentProcess().Leak().Crash(); + kcout << "Kernel: Math error (division by zero?).\r"; + + auto process = Kernel::UserProcessScheduler::The().GetCurrentProcess(); + + process.Leak().ProcessSignal.SignalIP = 0UL; + process.Leak().ProcessSignal.SignalID = SIGKILL; + process.Leak().ProcessSignal.PreviousStatus = process.Leak().Status; + + kcout << "Kernel: PRCFROZE status set..\r"; + + process.Leak().Status = Kernel::ProcessStatusKind::kFrozen; + + process.Leak().Crash(); } /// @brief Handle any generic fault. /// @param rsp EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) { - kcout << "Kernel: Generic Fault.\r"; - Kernel::UserProcessScheduler::The().GetCurrentProcess().Leak().Crash(); + kcout << "Kernel: Generic Process Fault.\r"; + + auto process = Kernel::UserProcessScheduler::The().GetCurrentProcess(); + + process.Leak().ProcessSignal.SignalIP = 0UL; + process.Leak().ProcessSignal.SignalID = SIGKILL; + process.Leak().ProcessSignal.PreviousStatus = process.Leak().Status; + + kcout << "Kernel: PRCFROZE status set..\r"; + + process.Leak().Status = Kernel::ProcessStatusKind::kFrozen; + + process.Leak().Crash(); +} + +EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) +{ + auto process = Kernel::UserProcessScheduler::The().GetCurrentProcess(); + + kcout << "Kernel: Process RIP: " << Kernel::number(rip) << endl; + kcout << "Kernel: Process Name: " << process.Leak().Name << endl; + + kcout << "Kernel: SIGTRAP set.\r"; + + process.Leak().ProcessSignal.SignalIP = rip; + process.Leak().ProcessSignal.SignalID = SIGTRAP; + process.Leak().ProcessSignal.PreviousStatus = process.Leak().Status; + + kcout << "Kernel: PRCFROZE status set..\r"; + + process.Leak().Status = Kernel::ProcessStatusKind::kFrozen; } /// @brief Handle #UD fault. @@ -52,7 +106,18 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) { kcout << "Kernel: Undefined Opcode.\r"; - Kernel::UserProcessScheduler::The().GetCurrentProcess().Leak().Crash(); + + auto process = Kernel::UserProcessScheduler::The().GetCurrentProcess(); + + process.Leak().ProcessSignal.SignalIP = 0UL; + process.Leak().ProcessSignal.SignalID = SIGKILL; + process.Leak().ProcessSignal.PreviousStatus = process.Leak().Status; + + kcout << "Kernel: PRCFROZE status set..\r"; + + process.Leak().Status = Kernel::ProcessStatusKind::kFrozen; + + process.Leak().Crash(); } /// @brief Enter syscall from assembly. @@ -91,7 +156,7 @@ EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_kerncall_index, { if (rcx_kerncall_index < kKerncalls.Count()) { - kcout << "kerncall: Enter Kcall.\r"; + kcout << "kerncall: Enter Kernel Call List.\r"; if (kKerncalls[rcx_kerncall_index].fHooked) { @@ -101,14 +166,14 @@ EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_kerncall_index, } else { - kcout << "kerncall: syscall isn't valid at all! (is nullptr)\r"; + kcout << "kerncall: Kernel call isn't valid at all! (is nullptr)\r"; } } else { - kcout << "kerncall: syscall isn't hooked at all! (is set to false)\r"; + kcout << "kerncall: Kernel call isn't hooked at all! (is set to false)\r"; } - kcout << "kerncall: Exit Kcall.\r"; + kcout << "kerncall: Exit Kernel Calls.\r"; } } diff --git a/dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm b/dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm index 9121edb9..293dafde 100644 --- a/dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm +++ b/dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm @@ -50,15 +50,42 @@ extern idt_handle_pf extern ke_io_write extern idt_handle_ud extern idt_handle_generic +extern idt_handle_breakpoint section .text IntNormal 0 IntNormal 1 - IntNormal 2 -IntNormal 3 +section .data + +__ZKA_INT_3_GET_RIP: + dq 0 +__ZKA_INT_3_GET_RIP_END: + +section .text + +;; @brief Triggers a breakpoint and freeze the process. RIP is also fetched. +__ZKA_INT_3: + cli + + mov al, 0x20 + out 0x20, al + out 0xA0, al + + push rax + mov rax, idt_handle_breakpoint + + lea rcx, [rel __ZKA_INT_3_GET_RIP] + mov [rcx], rcx + + call rax + pop rax + + sti + o64 iret + IntNormal 4 IntNormal 5 diff --git a/dev/ZKAKit/HALKit/AMD64/Storage/AHCI-DMA.cc b/dev/ZKAKit/HALKit/AMD64/Storage/AHCI-DMA.cc index 8ac97a14..dd9a07b2 100644 --- a/dev/ZKAKit/HALKit/AMD64/Storage/AHCI-DMA.cc +++ b/dev/ZKAKit/HALKit/AMD64/Storage/AHCI-DMA.cc @@ -242,8 +242,6 @@ Kernel::Void drv_std_read(Kernel::UInt64 lba, Kernel::Char* buffer, Kernel::Size { return; // Error in task file } - - kcout << Kernel::number((kAhciPort->Ci & 1)) << endl; } } @@ -311,8 +309,6 @@ Kernel::Void drv_std_write(Kernel::UInt64 lba, Kernel::Char* buffer, Kernel::Siz Kernel::ke_stop(RUNTIME_CHECK_UNEXCPECTED); return; // Error in task file } - - kcout << Kernel::number((kAhciPort->Ci & 1)) << endl; } } diff --git a/dev/ZKAKit/KernelKit/UserProcessScheduler.h b/dev/ZKAKit/KernelKit/UserProcessScheduler.h index 18567cb6..19075405 100644 --- a/dev/ZKAKit/KernelKit/UserProcessScheduler.h +++ b/dev/ZKAKit/KernelKit/UserProcessScheduler.h @@ -155,17 +155,25 @@ namespace Kernel SizeT MemoryCursor{0}; SizeT MemoryLimit{kSchedMaxMemoryLimit}; - struct USER_PROCESS_HEAP final + struct UserProcessHeapList final { VoidPtr MemoryEntry{nullptr}; SizeT MemoryEntrySize{0UL}; SizeT MemoryEntryPad{0UL}; - struct USER_PROCESS_HEAP* MemoryPrev{nullptr}; - struct USER_PROCESS_HEAP* MemoryNext{nullptr}; + struct UserProcessHeapList* MemoryPrev{nullptr}; + struct UserProcessHeapList* MemoryNext{nullptr}; }; - USER_PROCESS_HEAP* MemoryHeap{nullptr}; + struct UserProcessSignal final + { + UIntPtr SignalIP; + ProcessStatusKind PreviousStatus; + UIntPtr SignalID; + }; + + UserProcessSignal ProcessSignal; + UserProcessHeapList* MemoryHeap{nullptr}; VoidPtr VMRegister{0UL}; diff --git a/dev/ZKAKit/NewKit/Defines.h b/dev/ZKAKit/NewKit/Defines.h index 51f915c3..8ca5e0e4 100644 --- a/dev/ZKAKit/NewKit/Defines.h +++ b/dev/ZKAKit/NewKit/Defines.h @@ -173,19 +173,3 @@ namespace Kernel } }; } // namespace Kernel - -#define DEDUCE_ENDIAN(address, value) \ - (((reinterpret_cast<Kernel::Char*>(address)[0]) == (value)) \ - ? (Kernel::Endian::kEndianBig) \ - : (Kernel::Endian::kEndianLittle)) - -#define Yes true -#define No false - -#define VoidStar Kernel::VoidPtr - -#ifdef INIT_OBJECT -#undef INIT_OBJECT -#endif // ifdef INIT_OBJECT - -#define INIT_OBJECT(OBJ, TYPE, ...) TYPE OBJ = TYPE(__VA_ARGS__) diff --git a/dev/ZKAKit/NewKit/Macros.h b/dev/ZKAKit/NewKit/Macros.h index 0730a1f6..de48144b 100644 --- a/dev/ZKAKit/NewKit/Macros.h +++ b/dev/ZKAKit/NewKit/Macros.h @@ -118,24 +118,44 @@ #define RGB(R, G, B) (Kernel::UInt32)(R | G << 0x8 | B << 0x10) #endif // !RGB -#define BREAK_POINT() \ - while (Yes) \ - ; +#define BREAK_POINT() asm volatile ("int $3") -/// @brief The system page file. -#define kPageSys "/System/syspage.sys" +/// @brief The system page file, located on the mount directory, as mulitple system pages can be mounted. +#define kPageSys "/Mount/syspage.sys" /// @brief The main system driver. #define kStartupSys "/Boot/startup.sys" /// @brief The main font file. -#define kUrbanistTTF "/Fonts/urbanist.ttf" +#define kUrbanistTTF "/Resources/Fonts/urbanist.ttf" /// @brief License file -#define kEulaTxt "/Misc/EULA.txt" +#define kEulaTxt "/Resources/EULA.txt" /// @brief The main kernel file. -#define kStartupWav "/Rsrc/startup.wav" +#define kStartupWav "/Resources/startup.wav" /// @brief The main system loader. #define kUserName "ZKA AUTHORITY/KERNEL" + +#define DEDUCE_ENDIAN(address, value) \ + (((reinterpret_cast<Kernel::Char*>(address)[0]) == (value)) \ + ? (Kernel::Endian::kEndianBig) \ + : (Kernel::Endian::kEndianLittle)) + +#define Yes true +#define No false + +#define YES true +#define NO false + +#define TRUE true +#define FALSE false + +#define BOOL Kernel::Boolean + +#ifdef INIT_OBJECT +#undef INIT_OBJECT +#endif // ifdef INIT_OBJECT + +#define INIT_OBJECT(OBJ, TYPE, ...) TYPE OBJ = TYPE(__VA_ARGS__) diff --git a/dev/ZKAKit/PosixKit/Signals.h b/dev/ZKAKit/PosixKit/Signals.h new file mode 100644 index 00000000..498bbf0a --- /dev/null +++ b/dev/ZKAKit/PosixKit/Signals.h @@ -0,0 +1,16 @@ +/* ------------------------------------------- + + Copyright (C) 2024, EL Mahrouss Logic, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include <NewKit/Defines.h> + +typedef Kernel::UInt32 signal_t; + +#define SIGKILL 0 +#define SIGPAUS 1 +#define SIGEXEC 2 +#define SIGTRAP 3
\ No newline at end of file diff --git a/dev/ZKAKit/src/UserProcessScheduler.cc b/dev/ZKAKit/src/UserProcessScheduler.cc index 59978be1..3352085d 100644 --- a/dev/ZKAKit/src/UserProcessScheduler.cc +++ b/dev/ZKAKit/src/UserProcessScheduler.cc @@ -129,7 +129,7 @@ namespace Kernel if (!this->MemoryHeap) { - this->MemoryHeap = new UserProcess::USER_PROCESS_HEAP(); + this->MemoryHeap = new UserProcess::UserProcessHeapList(); this->MemoryHeap->MemoryEntryPad = pad_amount; this->MemoryHeap->MemoryEntrySize = sz; @@ -143,8 +143,8 @@ namespace Kernel } else { - USER_PROCESS_HEAP* entry = this->MemoryHeap; - USER_PROCESS_HEAP* prev_entry = nullptr; + UserProcessHeapList* entry = this->MemoryHeap; + UserProcessHeapList* prev_entry = nullptr; while (!entry) { @@ -155,7 +155,7 @@ namespace Kernel entry = entry->MemoryNext; } - entry->MemoryNext = new USER_PROCESS_HEAP(); + entry->MemoryNext = new UserProcessHeapList(); entry->MemoryNext->MemoryEntry = ptr; entry->MemoryNext->MemoryPrev = entry; @@ -175,7 +175,7 @@ namespace Kernel sz == 0) return No; - USER_PROCESS_HEAP* entry = this->MemoryHeap; + UserProcessHeapList* entry = this->MemoryHeap; while (entry != nullptr) { |
