diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-06-15 16:03:38 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-06-15 16:03:38 +0200 |
| commit | eb9df5eea339812513c25a8d3b2eeb03c633e7ac (patch) | |
| tree | efcdaaa25d08daadcd27e0597a0fb20defc49a23 /dev/kernel/HALKit/AMD64 | |
| parent | 6511afbf405c31513bc88ab06bca58218610a994 (diff) | |
| parent | f7e5542dc13519cc78c204b4062acb0b71296a58 (diff) | |
Merge pull request #41 from nekernel-org/dev
NeKernel v0.0.3e1
Diffstat (limited to 'dev/kernel/HALKit/AMD64')
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc | 2 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc | 35 |
2 files changed, 22 insertions, 15 deletions
diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc index 24a81af9..aeaeff52 100644 --- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc +++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc @@ -216,7 +216,7 @@ Void mp_init_cores(VoidPtr vendor_ptr) noexcept { kout << "Kind: LAPIC: OFF\r"; } } else { - kout << "Kind: UNKNOWN\r"; + kout << "Kind: UNKNOWN: OFF\r"; } entry_ptr += length; diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc index 01456ae5..be6d0af5 100644 --- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc +++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc @@ -6,6 +6,7 @@ #include <ArchKit/ArchKit.h> #include <KernelKit/ProcessScheduler.h> +#include <KernelKit/UserMgr.h> #include <NeKit/KString.h> #include <SignalKit/Signals.h> @@ -126,33 +127,39 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) { process.Leak().Signal.Status = process.Leak().Status; } -/// @brief Enter syscall from assembly. +/// @brief Enter syscall from assembly (libSystem only) /// @param stack the stack pushed from assembly routine. /// @return nothing. -EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx_syscall_index, - Kernel::UIntPtr rdx_syscall_struct) { +EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx_hash, + Kernel::UIntPtr rdx_syscall_arg) { hal_idt_send_eoi(50); - if (rcx_syscall_index < kSysCalls.Count()) { - if (kSysCalls[rcx_syscall_index].fHooked) { - if (kSysCalls[rcx_syscall_index].fProc) { - (kSysCalls[rcx_syscall_index].fProc)((Kernel::VoidPtr) rdx_syscall_struct); + if (!Kernel::kCurrentUser) return; + + for (SizeT i = 0UL; i < kMaxDispatchCallCount; ++i) { + if (kSysCalls[i].fHooked && rcx_hash == kSysCalls[i].fHash) { + if (kSysCalls[i].fProc) { + (kSysCalls[i].fProc)((Kernel::VoidPtr) rdx_syscall_arg); } } } } -/// @brief Enter Kernel call from assembly (DDK only). +/// @brief Enter Kernel call from assembly (libDDK only). /// @param stack the stack pushed from assembly routine. /// @return nothing. -EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_kerncall_index, - Kernel::UIntPtr rdx_kerncall_struct) { +EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_hash, + Kernel::UIntPtr rdx_kerncall_arg) { hal_idt_send_eoi(51); - if (rcx_kerncall_index < kKernCalls.Count()) { - if (kKernCalls[rcx_kerncall_index].fHooked) { - if (kKernCalls[rcx_kerncall_index].fProc) { - (kKernCalls[rcx_kerncall_index].fProc)((Kernel::VoidPtr) rdx_kerncall_struct); + if (!Kernel::kRootUser) return; + if (Kernel::kCurrentUser != Kernel::kRootUser) return; + if (!Kernel::kCurrentUser->IsSuperUser()) return; + + for (SizeT i = 0UL; i < kMaxDispatchCallCount; ++i) { + if (kKernCalls[i].fHooked && rcx_hash == kKernCalls[rcx_hash].fHash) { + if (kKernCalls[i].fProc) { + (kKernCalls[i].fProc)((Kernel::VoidPtr) rdx_kerncall_arg); } } } |
