summaryrefslogtreecommitdiffhomepage
path: root/dev/ZKAKit/HALKit
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-11-07 16:30:10 +0100
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-11-07 16:30:10 +0100
commit516efdab62108ff03af7f1d91e6dcba02f6aad47 (patch)
tree5301fd170496f7562d0872c950cda0ec9d1f5db0 /dev/ZKAKit/HALKit
parent3bb0b718b3fde156b6f30b7f05fa34a4937befaf (diff)
Kernel: lots of fixes and improvements.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/ZKAKit/HALKit')
-rw-r--r--dev/ZKAKit/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc6
-rw-r--r--dev/ZKAKit/HALKit/AMD64/HalCoreMPScheduler.cc17
-rw-r--r--dev/ZKAKit/HALKit/AMD64/HalDescriptorLoader.cc12
-rw-r--r--dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm4
-rw-r--r--dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc27
-rw-r--r--dev/ZKAKit/HALKit/AMD64/Processor.h4
-rw-r--r--dev/ZKAKit/HALKit/ARM64/HalCoreMPScheduler.cc6
7 files changed, 41 insertions, 35 deletions
diff --git a/dev/ZKAKit/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/ZKAKit/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
index 2cef8125..f6956793 100644
--- a/dev/ZKAKit/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
+++ b/dev/ZKAKit/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
@@ -12,6 +12,7 @@
/// @param rsp
EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp)
{
+ kcout << "Kernel: GPF.\r";
Kernel::UserProcessScheduler::The().GetCurrentProcess().Leak().Crash();
}
@@ -19,12 +20,14 @@ EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp)
/// @param rsp
EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp)
{
+ kcout << "Kernel: Page Fault.\r";
Kernel::UserProcessScheduler::The().GetCurrentProcess().Leak().Crash();
}
/// @brief Handle scheduler interrupt.
EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp)
{
+ kcout << "Kernel: IRQ0.\r";
Kernel::UserProcessHelper::StartScheduling();
}
@@ -32,6 +35,7 @@ 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();
}
@@ -39,6 +43,7 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp)
/// @param rsp
EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp)
{
+ kcout << "Kernel: Generic Fault.\r";
Kernel::UserProcessScheduler::The().GetCurrentProcess().Leak().Crash();
}
@@ -46,6 +51,7 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp)
/// @param rsp
EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp)
{
+ kcout << "Kernel: Undefined Opcode.\r";
Kernel::UserProcessScheduler::The().GetCurrentProcess().Leak().Crash();
}
diff --git a/dev/ZKAKit/HALKit/AMD64/HalCoreMPScheduler.cc b/dev/ZKAKit/HALKit/AMD64/HalCoreMPScheduler.cc
index b3718b96..d484c2a0 100644
--- a/dev/ZKAKit/HALKit/AMD64/HalCoreMPScheduler.cc
+++ b/dev/ZKAKit/HALKit/AMD64/HalCoreMPScheduler.cc
@@ -133,8 +133,6 @@ namespace Kernel::HAL
Kernel::ke_dma_write(targetAddress, kAPIC_ICR_Low, kAPIC_EIPI_Vector | vector);
}
- EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame);
-
STATIC struct PROCESS_CONTROL_BLOCK final
{
HAL::StackFramePtr f_Frame;
@@ -142,18 +140,21 @@ namespace Kernel::HAL
VoidPtr f_Image;
} kProcessBlocks[kSchedProcessLimitPerTeam] = {0};
- EXTERN_C HAL::StackFramePtr mp_get_current_context(Void)
+ EXTERN_C HAL::StackFramePtr mp_get_current_context(Int64 pid)
{
- return kProcessBlocks[UserProcessScheduler::The().GetCurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Frame;
+ const auto process_index = pid % kSchedProcessLimitPerTeam;
+ return kProcessBlocks[process_index].f_Frame;
}
- EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame)
+ EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame, ProcessID pid)
{
MUST_PASS(image && stack_ptr && stack_frame);
- kProcessBlocks[UserProcessScheduler::The().GetCurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Frame = stack_frame;
- kProcessBlocks[UserProcessScheduler::The().GetCurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Stack = stack_ptr;
- kProcessBlocks[UserProcessScheduler::The().GetCurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Image = image;
+ const auto process_index = pid % kSchedProcessLimitPerTeam;
+
+ kProcessBlocks[process_index].f_Frame = stack_frame;
+ kProcessBlocks[process_index].f_Stack = stack_ptr;
+ kProcessBlocks[process_index].f_Image = image;
return Yes;
}
diff --git a/dev/ZKAKit/HALKit/AMD64/HalDescriptorLoader.cc b/dev/ZKAKit/HALKit/AMD64/HalDescriptorLoader.cc
index fe6491c6..bfa9bcf3 100644
--- a/dev/ZKAKit/HALKit/AMD64/HalDescriptorLoader.cc
+++ b/dev/ZKAKit/HALKit/AMD64/HalDescriptorLoader.cc
@@ -7,14 +7,14 @@
#include <ArchKit/ArchKit.h>
#include <HALKit/AMD64/Processor.h>
-#define kPITDefaultTicks (1000U)
+#define kPITDefaultTicks (100U)
namespace Kernel::HAL
{
namespace Detail
{
STATIC ::Kernel::Detail::AMD64::InterruptDescriptorAMD64
- kInterruptVectorTable[kKernelIdtSize];
+ kInterruptVectorTable[kKernelIdtSize] = { };
STATIC void hal_set_irq_mask(UInt8 irql);
STATIC void hal_clear_irq_mask(UInt8 irql);
@@ -84,11 +84,13 @@ namespace Kernel::HAL
Void IDTLoader::Load(Register64& idt)
{
+ rt_cli();
+
const Int16 kPITTickForScheduler = kPITDefaultTicks;
volatile ::Kernel::UIntPtr** ptr_ivt = (volatile ::Kernel::UIntPtr**)idt.Base;
- for (UInt16 idt_indx = 0; idt_indx < kKernelIdtSize; ++idt_indx)
+ for (SizeT idt_indx = 0; idt_indx < kKernelIdtSize; ++idt_indx)
{
Detail::kInterruptVectorTable[idt_indx].Selector = kIDTSelector;
Detail::kInterruptVectorTable[idt_indx].Ist = 0;
@@ -103,11 +105,13 @@ namespace Kernel::HAL
idt.Base = (UIntPtr)&Detail::kInterruptVectorTable[0];
idt.Limit = sizeof(::Kernel::Detail::AMD64::InterruptDescriptorAMD64) *
- (kKernelIdtSize)-1;
+ (kKernelIdtSize);
hal_load_idt(idt);
Detail::hal_enable_pit(kPITTickForScheduler);
+
+ rt_sti();
}
void GDTLoader::Load(Ref<RegisterGDT>& gdt)
diff --git a/dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm b/dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm
index d25d34f6..9121edb9 100644
--- a/dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm
+++ b/dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm
@@ -340,8 +340,6 @@ mp_system_call_handler:
o64 sysret
hal_load_idt:
- cli
-
lidt [rcx]
; Master PIC initialization
@@ -369,8 +367,6 @@ hal_load_idt:
out 0x21, al
out 0xA1, al
- sti
-
ret
section .data
diff --git a/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc b/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc
index 2e78a292..cebe2fe6 100644
--- a/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc
+++ b/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc
@@ -20,22 +20,22 @@ EXTERN_C Kernel::Char mp_user_switch_proc_stack_begin[];
EXTERN_C Kernel::MainKind __CTOR_LIST__[];
EXTERN_C Kernel::MainKind __DTOR_LIST__[];
+namespace Kernel
+{
+ EXTERN ProcessID kProcessIDCounter;
+}
+
STATIC Kernel::Void hal_init_cxx_ctors()
{
+ Kernel::kProcessIDCounter = 0UL;
+
for (Kernel::SizeT index = 0UL; __CTOR_LIST__[index] != __DTOR_LIST__[0]; ++index)
{
Kernel::MainKind constructor_cxx = (Kernel::MainKind)__CTOR_LIST__[index];
constructor_cxx();
-
- kcout << "Called constrcutor.\r";
}
}
-namespace Kernel
-{
- EXTERN ProcessID kProcessIDCounter;
-}
-
/// @brief Kernel init procedure.
EXTERN_C void hal_init_platform(
Kernel::HEL::HANDOVER_INFO_HEADER* HandoverHeader)
@@ -50,8 +50,6 @@ EXTERN_C void hal_init_platform(
hal_init_cxx_ctors();
- Kernel::kProcessIDCounter = 0UL;
-
/************************************** */
/* INITIALIZE BIT MAP. */
/************************************** */
@@ -93,22 +91,23 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept
/* Initialize filesystem. */
Kernel::NeFileSystemMgr::Mount(new Kernel::NeFileSystemMgr());
+ const Kernel::Char process_name[] = "Kernel";
+
Kernel::rtl_create_process([]() -> void {
while (Yes)
;
- }, "RtlProcess");
+ }, process_name);
+
+ /* Load interrupts and start SMP. */
- /* Start any cores. */
if (kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled)
Kernel::HAL::mp_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr);
Kernel::HAL::Register64 idt_reg;
idt_reg.Base = (Kernel::UIntPtr)kInterruptVectorTable;
- /* Load interrupts. */
Kernel::HAL::IDTLoader idt_loader;
idt_loader.Load(idt_reg);
- while (Yes)
- ;
+ Kernel::ke_stop(RUNTIME_CHECK_BOOTSTRAP);
}
diff --git a/dev/ZKAKit/HALKit/AMD64/Processor.h b/dev/ZKAKit/HALKit/AMD64/Processor.h
index c854969b..9d0a989c 100644
--- a/dev/ZKAKit/HALKit/AMD64/Processor.h
+++ b/dev/ZKAKit/HALKit/AMD64/Processor.h
@@ -306,8 +306,8 @@ EXTERN_C Kernel::Void idt_handle_gpf(Kernel::UIntPtr rsp);
EXTERN_C Kernel::Void idt_handle_math(Kernel::UIntPtr rsp);
EXTERN_C Kernel::Void idt_handle_pf(Kernel::UIntPtr rsp);
-EXTERN_C Kernel::Void hal_load_idt(Kernel::HAL::Register64 ptr);
-EXTERN_C Kernel::Void hal_load_gdt(Kernel::HAL::RegisterGDT ptr);
+EXTERN_C ATTRIBUTE(naked) Kernel::Void hal_load_idt(Kernel::HAL::Register64 ptr);
+EXTERN_C ATTRIBUTE(naked) Kernel::Void hal_load_gdt(Kernel::HAL::RegisterGDT ptr);
inline Kernel::VoidPtr kKernelBitMpStart = nullptr;
inline Kernel::UIntPtr kKernelBitMpSize = 0UL;
diff --git a/dev/ZKAKit/HALKit/ARM64/HalCoreMPScheduler.cc b/dev/ZKAKit/HALKit/ARM64/HalCoreMPScheduler.cc
index 28d36c5a..c6425cf1 100644
--- a/dev/ZKAKit/HALKit/ARM64/HalCoreMPScheduler.cc
+++ b/dev/ZKAKit/HALKit/ARM64/HalCoreMPScheduler.cc
@@ -16,12 +16,12 @@ STATIC struct PROCESS_CONTROL_BLOCK final
VoidPtr f_Image;
} kProcessBlocks[kSchedProcessLimitPerTeam] = {0};
-EXTERN_C HAL::StackFramePtr mp_get_current_context(Void)
+EXTERN_C HAL::StackFramePtr mp_get_current_context(ProcessID pid)
{
- return kProcessBlocks[UserProcessScheduler::The().GetCurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Frame;
+ return kProcessBlocks[pid % kSchedProcessLimitPerTeam].f_Frame;
}
-EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame)
+EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame, ProcessID pid)
{
MUST_PASS(image && stack_ptr && stack_frame);
return No;