summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-11-09 20:45:52 +0100
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-11-09 20:45:52 +0100
commit89a0b8efb6491b93a8a373ad36c0a3872cd2ed44 (patch)
treee75227186c7b5e1e99aa9b09da4cead2f6dfd3cc
parentc72867a43cdedd28783e188b1d44d566b92b6a37 (diff)
IMP: PosixKit, to communicate with pureDarwin correctly.
IMP: Breakpoint interrupt has been implemented. IMP: Interrupts handlers have been improved for AMD64 HAL.
-rw-r--r--dev/ZKAKit/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc87
-rw-r--r--dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm31
-rw-r--r--dev/ZKAKit/HALKit/AMD64/Storage/AHCI-DMA.cc4
-rw-r--r--dev/ZKAKit/KernelKit/UserProcessScheduler.h16
-rw-r--r--dev/ZKAKit/NewKit/Defines.h16
-rw-r--r--dev/ZKAKit/NewKit/Macros.h36
-rw-r--r--dev/ZKAKit/PosixKit/Signals.h16
-rw-r--r--dev/ZKAKit/src/UserProcessScheduler.cc10
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)
{