summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-06-15 16:03:38 +0200
committerGitHub <noreply@github.com>2025-06-15 16:03:38 +0200
commiteb9df5eea339812513c25a8d3b2eeb03c633e7ac (patch)
treeefcdaaa25d08daadcd27e0597a0fb20defc49a23 /dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc
parent6511afbf405c31513bc88ab06bca58218610a994 (diff)
parentf7e5542dc13519cc78c204b4062acb0b71296a58 (diff)
Merge pull request #41 from nekernel-org/dev
NeKernel v0.0.3e1
Diffstat (limited to 'dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc')
-rw-r--r--dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc35
1 files changed, 21 insertions, 14 deletions
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);
}
}
}