summaryrefslogtreecommitdiffhomepage
path: root/Kernel/HALKit
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-06-13 19:38:29 +0200
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-06-13 19:38:29 +0200
commit7327f305efb1c6678722308cc5f9645dd39f451e (patch)
tree0e15f4ad6f275aa689f5d66641d3d9ad59d15472 /Kernel/HALKit
parent349fe48baf941b2d1b571d3a5d0d796823bae312 (diff)
MHR-31: Lots of fixes and improvements regarding the kernel.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'Kernel/HALKit')
-rw-r--r--Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp25
-rw-r--r--Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp7
-rw-r--r--Kernel/HALKit/AMD64/HalHart.cpp (renamed from Kernel/HALKit/AMD64/HalHardwareMP.cpp)0
-rw-r--r--Kernel/HALKit/AMD64/HalInterruptAPI.asm47
-rw-r--r--Kernel/HALKit/AMD64/HalKernelMain.cxx19
-rw-r--r--Kernel/HALKit/AMD64/PCI/Iterator.cxx6
6 files changed, 37 insertions, 67 deletions
diff --git a/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp b/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp
index a21a4c47..51570b86 100644
--- a/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp
+++ b/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp
@@ -12,11 +12,6 @@
/// @param rsp
EXTERN_C void idt_handle_gpf(NewOS::UIntPtr rsp)
{
- MUST_PASS(NewOS::ProcessScheduler::The().Leak().GetCurrent());
-
- NewOS::kcout << "newoskrnl: Stack Pointer: "
- << NewOS::StringBuilder::FromInt("rsp{%}", rsp);
-
NewOS::kcout
<< "newoskrnl: General Protection Fault, caused by "
<< NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName();
@@ -28,9 +23,6 @@ EXTERN_C void idt_handle_gpf(NewOS::UIntPtr rsp)
/// @param rsp
EXTERN_C void idt_handle_pf(NewOS::UIntPtr rsp)
{
- MUST_PASS(NewOS::ProcessScheduler::The().Leak().GetCurrent());
- NewOS::kcout << NewOS::StringBuilder::FromInt("rsp{%}", rsp);
-
NewOS::kcout
<< "newoskrnl: Segmentation Fault, caused by "
<< NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName();
@@ -42,9 +34,6 @@ EXTERN_C void idt_handle_pf(NewOS::UIntPtr rsp)
/// @param rsp
EXTERN_C void idt_handle_math(NewOS::UIntPtr rsp)
{
- MUST_PASS(NewOS::ProcessScheduler::The().Leak().GetCurrent());
- NewOS::kcout << NewOS::StringBuilder::FromInt("rsp{%}", rsp);
-
NewOS::kcout
<< "newoskrnl: Math error, caused by "
<< NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName();
@@ -56,9 +45,6 @@ EXTERN_C void idt_handle_math(NewOS::UIntPtr rsp)
/// @param rsp
EXTERN_C void idt_handle_generic(NewOS::UIntPtr rsp)
{
- MUST_PASS(NewOS::ProcessScheduler::The().Leak().GetCurrent());
- NewOS::kcout << NewOS::StringBuilder::FromInt("sp{%}", rsp);
-
NewOS::kcout
<< "newoskrnl: Execution error, caused by "
<< NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName();
@@ -70,11 +56,6 @@ EXTERN_C void idt_handle_generic(NewOS::UIntPtr rsp)
/// @param rsp
EXTERN_C void idt_handle_ud(NewOS::UIntPtr rsp)
{
- MUST_PASS(NewOS::ProcessScheduler::The().Leak().GetCurrent());
-
- NewOS::kcout << "newoskrnl: Stack Pointer: "
- << NewOS::StringBuilder::FromInt("rsp{%}", rsp);
-
NewOS::kcout
<< "newoskrnl: Invalid interrupt, caused by "
<< NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName();
@@ -91,10 +72,8 @@ EXTERN_C NewOS::Void hal_system_call_enter(NewOS::UIntPtr rcx, NewOS::UIntPtr rd
{
NewOS::kcout << "newoskrnl: syscall: enter.\r";
- NewOS::kcout << "rcx: " << NewOS::number(rcx) << NewOS::endl;
-
- if (kSyscalls[rcx].Leak().Leak().fHooked)
- (kSyscalls[rcx].Leak().Leak().fProc)((NewOS::HAL::StackFramePtr)rdx);
+ if (kSyscalls[rcx].Leak().Leak()->fHooked)
+ (kSyscalls[rcx].Leak().Leak()->fProc)((NewOS::VoidPtr)rdx);
NewOS::kcout << "newoskrnl: syscall: exit.\r";
}
diff --git a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
index e2520332..c15a7b55 100644
--- a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
+++ b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
@@ -16,9 +16,6 @@
#define kAPIC_SIPI_Vector 0x00500
#define kAPIC_EIPI_Vector 0x00400
-/// @brief This symbol is the kernel main symbol.
-EXTERN_C void KeMain();
-
/// @brief assembly routine. internal use only.
EXTERN_C void _hal_enable_smp(void);
@@ -159,9 +156,7 @@ namespace NewOS::HAL
EXTERN_C Void hal_apic_acknowledge_cont(Void)
{
- /// TODO: better init code.
- KeMain();
-
+ ProcessHelper::StartScheduling();
_hal_spin_core();
}
diff --git a/Kernel/HALKit/AMD64/HalHardwareMP.cpp b/Kernel/HALKit/AMD64/HalHart.cpp
index 92e075aa..92e075aa 100644
--- a/Kernel/HALKit/AMD64/HalHardwareMP.cpp
+++ b/Kernel/HALKit/AMD64/HalHart.cpp
diff --git a/Kernel/HALKit/AMD64/HalInterruptAPI.asm b/Kernel/HALKit/AMD64/HalInterruptAPI.asm
index e88ffc0d..150cfc10 100644
--- a/Kernel/HALKit/AMD64/HalInterruptAPI.asm
+++ b/Kernel/HALKit/AMD64/HalInterruptAPI.asm
@@ -201,11 +201,15 @@ IntNormal 49
__NEW_INT_50:
cli
+ push rcx
+ push rdx
push rax
call hal_system_call_enter
pop rax
+ pop rdx
+ pop rcx
sti
iretq
@@ -213,47 +217,19 @@ __NEW_INT_50:
__NEW_INT_51:
cli
- push 0
- push 51
- push rax
push rcx
push rdx
- push rbx
- push rbp
- push rsi
- push rdi
push r8
push r9
- push r10
- push r11
- push r12
- push r13
- push r14
- push r15
- push gs
- push fs
-
- mov rcx, rbp
+ push rax
call hal_kernel_call_enter
- pop fs
- pop gs
- pop r15
- pop r14
- pop r13
- pop r12
- pop r11
- pop r10
+ pop rax
pop r9
pop r8
- pop rdi
- pop rsi
- pop rbp
- pop rbx
pop rdx
pop rcx
- pop rax
sti
iretq
@@ -278,13 +254,18 @@ IntNormal 60
;; testing interrupts.
_ke_power_on_self_test:
mov rcx, 0x10
- int 0x32
- int 0x32
- int 0x32
+ mov rdx, _ke_string_post
+
int 0x32
ret
+section .data
+_ke_string_post:
+ db "POST has been successful.", 0
+
+section .text
+
[global hal_load_gdt]
hal_load_gdt:
diff --git a/Kernel/HALKit/AMD64/HalKernelMain.cxx b/Kernel/HALKit/AMD64/HalKernelMain.cxx
index 708004b3..6f01734e 100644
--- a/Kernel/HALKit/AMD64/HalKernelMain.cxx
+++ b/Kernel/HALKit/AMD64/HalKernelMain.cxx
@@ -14,6 +14,10 @@
#include <KernelKit/ProcessScheduler.hxx>
#include <KernelKit/UserHeap.hpp>
#include <NewKit/Json.hpp>
+#include <KernelKit/CodeManager.hpp>
+
+/// @brief This symbol is the kernel main symbol.
+EXTERN_C void KeMain();
EXTERN_C NewOS::VoidPtr kInterruptVectorTable[];
@@ -72,13 +76,24 @@ EXTERN_C void hal_init_platform(
/// START POST
+ constexpr auto cDummyInterrupt = 0x10; // 16
+
+ kSyscalls[cDummyInterrupt].Leak().Leak()->fProc = [](NewOS::VoidPtr sf) -> void {
+ const char* msg = (const char*)sf;
+ NewOS::kcout << "newoskrnl: " << msg << "\r";
+ };
+
+ kSyscalls[cDummyInterrupt].Leak().Leak()->fHooked = true;
+
NewOS::HAL::Detail::_ke_power_on_self_test();
+ auto cLoaderName = "newoskrnl";
+ NewOS::execute_from_image(KeMain, cLoaderName);
+
NewOS::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_RsdPtr);
NewOS::kcout << "newoskrnl: We're done here...\r";
while (true)
- {
- }
+ {}
}
diff --git a/Kernel/HALKit/AMD64/PCI/Iterator.cxx b/Kernel/HALKit/AMD64/PCI/Iterator.cxx
index 8675f171..297aa89c 100644
--- a/Kernel/HALKit/AMD64/PCI/Iterator.cxx
+++ b/Kernel/HALKit/AMD64/PCI/Iterator.cxx
@@ -7,8 +7,8 @@
#include <KernelKit/PCI/Iterator.hpp>
#define PCI_ITERATOR_FIND_AND_UNWRAP(DEV, SZ) \
- if (DEV.Leak()) \
- return DEV.Leak();
+ if (DEV.Leak().Leak()) \
+ return *DEV.Leak().Leak();
namespace NewOS::PCI
{
@@ -25,7 +25,7 @@ namespace NewOS::PCI
if (dev.Class() == (UChar)type)
{
- fDevices[bus].Leak().Leak() = dev;
+ *fDevices[bus].Leak().Leak() = dev;
}
}
}