diff options
| author | Amlal EL Mahrouss <amlal@softwarelabs.com> | 2024-06-13 17:41:19 +0200 |
|---|---|---|
| committer | Amlal EL Mahrouss <amlal@softwarelabs.com> | 2024-06-13 17:41:19 +0200 |
| commit | 349fe48baf941b2d1b571d3a5d0d796823bae312 (patch) | |
| tree | 6258abfbede227d0a7806530ccbf3cdf3ca3699c /Kernel/HALKit | |
| parent | 70ae21935c7c68ed8a380611481b553b94cee657 (diff) | |
MHR-31: New systemcall/kernelcall architecture.
Signed-off-by: Amlal EL Mahrouss <amlal@softwarelabs.com>
Diffstat (limited to 'Kernel/HALKit')
| -rw-r--r-- | Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp | 50 | ||||
| -rw-r--r-- | Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp | 22 | ||||
| -rw-r--r-- | Kernel/HALKit/AMD64/HalInterruptAPI.asm | 59 | ||||
| -rw-r--r-- | Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp | 20 |
4 files changed, 106 insertions, 45 deletions
diff --git a/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp b/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp index 5f64cc20..a21a4c47 100644 --- a/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp +++ b/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp @@ -24,24 +24,6 @@ EXTERN_C void idt_handle_gpf(NewOS::UIntPtr rsp) NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().Crash(); } -/// @brief Handle the scheduler interrupt, raised from the HPET timer. -/// @param rsp -EXTERN_C void idt_handle_scheduler(NewOS::UIntPtr rsp) -{ - NewOS::kcout << NewOS::StringBuilder::FromInt("rsp{%}", rsp); - - NewOS::kcout - << "newoskrnl: Will be scheduled back later " - << NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName() - << NewOS::end_line(); - - /// schedule another process. - if (!NewOS::ProcessHelper::StartScheduling()) - { - NewOS::kcout << "newoskrnl: Continue schedule this process...\r"; - } -} - /// @brief Handle page fault. /// @param rsp EXTERN_C void idt_handle_pf(NewOS::UIntPtr rsp) @@ -99,3 +81,35 @@ EXTERN_C void idt_handle_ud(NewOS::UIntPtr rsp) NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().Crash(); } + +/// @brief Enter syscall from assembly. +/// @param stack the stack pushed from assembly routine. +/// @return nothing. +EXTERN_C NewOS::Void hal_system_call_enter(NewOS::UIntPtr rcx, NewOS::UIntPtr rdx) +{ + if (rcx <= (kSyscalls.Count() - 1)) + { + 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); + + NewOS::kcout << "newoskrnl: syscall: exit.\r"; + } +} + +/// @brief Enter kernel call from assembly (DDK only). +/// @param stack the stack pushed from assembly routine. +/// @return nothing. +EXTERN_C NewOS::Void hal_kernel_call_enter(NewOS::UIntPtr rcx, NewOS::UIntPtr rdx, + NewOS::UIntPtr r8, NewOS::UIntPtr r9) +{ + if (rcx != 0) + { + NewOS::kcout << "newoskrnl: kerncall: enter.\r"; + + NewOS::kcout << "newoskrnl: kerncall: exit.\r"; + } +} diff --git a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp index b70649ee..e2520332 100644 --- a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp +++ b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp @@ -159,23 +159,10 @@ namespace NewOS::HAL EXTERN_C Void hal_apic_acknowledge_cont(Void) { - kcout << "newoskrnl: finish kernel init... \r"; + /// TODO: better init code. + KeMain(); - if (cProgramInitialized && - *cProgramInitialized) - { - *cProgramInitialized = false; - - kcout << "newoskrnl: putting thread to sleep...\r"; - - KeMain(); - - _hal_spin_core(); - } - else - { - _hal_spin_core(); - } + _hal_spin_core(); } EXTERN_C StackFramePtr _hal_leak_current_context(Void) @@ -196,6 +183,7 @@ namespace NewOS::HAL STATIC Void hal_switch_context(HAL::StackFramePtr stackFrame) { Semaphore sem; + while (sem.IsLocked()) { } @@ -205,7 +193,7 @@ namespace NewOS::HAL cFramePtr = stackFrame; /// yes the exception field contains the core id. - hal_send_start_ipi(stackFrame->Exception, 0x40, cBaseAddressAPIC); + hal_send_start_ipi(stackFrame->Rcx, 0x40, cBaseAddressAPIC); sem.Unlock(); } diff --git a/Kernel/HALKit/AMD64/HalInterruptAPI.asm b/Kernel/HALKit/AMD64/HalInterruptAPI.asm index ef5a8319..e88ffc0d 100644 --- a/Kernel/HALKit/AMD64/HalInterruptAPI.asm +++ b/Kernel/HALKit/AMD64/HalInterruptAPI.asm @@ -195,15 +195,69 @@ IntNormal 47 IntNormal 48 IntNormal 49 +[extern hal_system_call_enter] +[extern hal_kernel_call_enter] + __NEW_INT_50: cli - ;; todo handle system calls. + push rax + + call hal_system_call_enter + + pop rax + + sti + iretq + +__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 + + call hal_kernel_call_enter + + pop fs + pop gs + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop rdi + pop rsi + pop rbp + pop rbx + pop rdx + pop rcx + pop rax sti iretq -IntNormal 51 IntNormal 52 IntNormal 53 IntNormal 54 @@ -223,6 +277,7 @@ IntNormal 60 ;; this one is doing a POST for us. ;; testing interrupts. _ke_power_on_self_test: + mov rcx, 0x10 int 0x32 int 0x32 int 0x32 diff --git a/Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp b/Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp index ea0997ed..3217a660 100644 --- a/Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp +++ b/Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp @@ -5,16 +5,20 @@ ------------------------------------------- */ #include <ArchKit/ArchKit.hpp> -#include <HALKit/Alpha/Processor.hpp> +#include <HALKit/AXP/Processor.hpp> -NewOS::Array<void (*)(NewOS::Int32 id, NewOS::HAL::StackFrame*), - kKernelMaxSystemCalls> - kSyscalls; - -extern "C" void rt_syscall_handle(NewOS::HAL::StackFrame* stack) +/// @brief Internal call for syscall, to work with C++. +/// @param stack +/// @return nothing. +EXTERN_C void rt_syscall_handle(NewOS::HAL::StackFrame* stack) { - for (NewOS::SizeT index = 0UL; index < kKernelMaxSystemCalls; ++index) + if (stack->Rcx <= (kSyscalls.Count() - 1)) { - (kSyscalls[index].Leak().Leak())(stack->ID, stack); + NewOS::kcout << "newoskrnl: syscall: enter.\r"; + + if (kSyscalls[stack->Rcx].Leak().Leak().fHooked) + (kSyscalls[stack->Rcx].Leak().Leak().fProc)(stack); + + NewOS::kcout << "newoskrnl: syscall: exit.\r"; } } |
