summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Boot/makefile2
-rw-r--r--DDK/KernelCall.c11
-rw-r--r--DDK/KernelDev.c7
-rw-r--r--DDK/KernelPrint.c2
-rw-r--r--DDK/KernelStd.h8
-rw-r--r--DDK/KernelStdCxx.cc6
-rw-r--r--Kernel/ArchKit/ArchKit.hpp13
-rw-r--r--Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp50
-rw-r--r--Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp22
-rw-r--r--Kernel/HALKit/AMD64/HalInterruptAPI.asm59
-rw-r--r--Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp20
-rw-r--r--Kernel/NewKit/Array.hpp9
-rw-r--r--Kernel/Sources/SMPManager.cxx2
13 files changed, 139 insertions, 72 deletions
diff --git a/Boot/makefile b/Boot/makefile
index 4bee19a2..e54b1aa8 100644
--- a/Boot/makefile
+++ b/Boot/makefile
@@ -26,7 +26,7 @@ BIOS=OVMF.fd
IMG=epm.img
IMG_2=epm-slave.img
-EMU_FLAGS=-net none -smp 4 -serial stdio -m 4G -M q35 \
+EMU_FLAGS=-net none -smp 4 -m 4G -M q35 \
-bios $(BIOS) -device piix3-ide,id=ide \
-drive id=disk,file=$(IMG),format=raw,if=none \
-device ide-hd,drive=disk,bus=ide.0 -drive \
diff --git a/DDK/KernelCall.c b/DDK/KernelCall.c
index c20a4894..a16a5278 100644
--- a/DDK/KernelCall.c
+++ b/DDK/KernelCall.c
@@ -9,22 +9,17 @@
#include <DDK/KernelStd.h>
#include <stdarg.h>
-DK_EXTERN __attribute__((naked)) void __kernelDispatchCall(int32_t cnt, ...);
+DK_EXTERN __attribute__((naked)) void* __kernelDispatchCall(const char* name, int32_t cnt, void* data, size_t sz);
/// @brief Execute a function on the kernel.
/// @param kernelRpcName the name of the function.
/// @param cnt number of arguments.
/// @param
/// @return
-DK_EXTERN void* kernelCall(const char* kernelRpcName, int32_t cnt, ...)
+DK_EXTERN void* kernelCall(const char* kernelRpcName, int32_t cnt, void* data, size_t sz)
{
if (!kernelRpcName || cnt == 0)
return NIL;
- va_list arg;
- va_start(arg, cnt);
-
- __kernelDispatchCall(cnt, arg);
-
- va_end(arg);
+ return __kernelDispatchCall(kernelRpcName, cnt, data, sz);
}
diff --git a/DDK/KernelDev.c b/DDK/KernelDev.c
index f19f85c6..6a6aac99 100644
--- a/DDK/KernelDev.c
+++ b/DDK/KernelDev.c
@@ -7,6 +7,7 @@
------------------------------------------- */
#include <DDK/KernelDev.h>
+#include <DDK/KernelString.h>
/// @brief Open a new binary device from path.
DK_EXTERN kernelDeviceRef kernelOpenBinaryDevice(const char* devicePath)
@@ -14,7 +15,7 @@ DK_EXTERN kernelDeviceRef kernelOpenBinaryDevice(const char* devicePath)
if (!devicePath)
return NIL;
- return kernelCall("OpenBinaryDevice", 1, devicePath);
+ return kernelCall("OpenBinaryDevice", 1, devicePath, kernelStringLength(devicePath));
}
/// @brief Open a new character device from path.
@@ -23,7 +24,7 @@ DK_EXTERN kernelDeviceRef kernelOpenCharDevice(const char* devicePath)
if (!devicePath)
return NIL;
- return kernelCall("OpenCharDevice", 1, devicePath);
+ return kernelCall("OpenCharDevice", 1, devicePath, kernelStringLength(devicePath));
}
/// @brief Close any device.
@@ -33,5 +34,5 @@ DK_EXTERN void kernelCloseDevice(kernelDeviceRef device)
if (!device)
return;
- kernelCall("CloseDevice", 1, device);
+ kernelCall("CloseDevice", 1, device, sizeof(kernelDevice));
}
diff --git a/DDK/KernelPrint.c b/DDK/KernelPrint.c
index b7513149..77f70280 100644
--- a/DDK/KernelPrint.c
+++ b/DDK/KernelPrint.c
@@ -10,7 +10,7 @@
DK_EXTERN void kernelPrintChar(const char ch)
{
- kernelCall("WriteCharacter", 1, ch);
+ kernelCall("WriteCharacter", 1, ch, 1);
}
/// @brief print string to UART.
diff --git a/DDK/KernelStd.h b/DDK/KernelStd.h
index 61bc23a9..63df4c2a 100644
--- a/DDK/KernelStd.h
+++ b/DDK/KernelStd.h
@@ -19,4 +19,10 @@
#include <stdint.h>
#include <stddef.h>
-DK_EXTERN void* kernelCall(const char* kernelRpcName, int32_t cnt, ...);
+/// @brief Call kernel (interrupt 0x33)
+/// @param kernelRpcName
+/// @param cnt
+/// @param dat
+/// @param sz
+/// @return
+DK_EXTERN void* kernelCall(const char* kernelRpcName, int32_t cnt, void* dat, size_t sz);
diff --git a/DDK/KernelStdCxx.cc b/DDK/KernelStdCxx.cc
index b1d233fa..cdca85dc 100644
--- a/DDK/KernelStdCxx.cc
+++ b/DDK/KernelStdCxx.cc
@@ -11,8 +11,8 @@
void* operator new(size_t sz) {
if (!sz) ++sz;
- auto ptr = kernelCall("NewKernelHeap", 1, sz);
- kernelCall("ProtectKernelHeap", 1, ptr);
+ auto ptr = kernelCall("NewKernelHeap", 1, &sz, sizeof(size_t));
+ kernelCall("ProtectKernelHeap", 1, ptr, sz);
return ptr;
}
@@ -20,5 +20,5 @@ void* operator new(size_t sz) {
void operator delete(void* ptr) noexcept {
if (!ptr) return;
- kernelCall("DeleteKernelHeap", 1,ptr);
+ kernelCall("DeleteKernelHeap", 1, ptr, 0);
}
diff --git a/Kernel/ArchKit/ArchKit.hpp b/Kernel/ArchKit/ArchKit.hpp
index 419f2c7a..c2e5a967 100644
--- a/Kernel/ArchKit/ArchKit.hpp
+++ b/Kernel/ArchKit/ArchKit.hpp
@@ -81,10 +81,21 @@ namespace NewOS
typedef NewOS::Void (*rt_syscall_proc)(NewOS::HAL::StackFramePtr);
-extern NewOS::Array<rt_syscall_proc,
+struct RTSyscallInfoHdr final
+{
+ NewOS::Int64 fHash;
+ NewOS::Bool fHooked;
+ rt_syscall_proc fProc;
+};
+
+inline NewOS::Array<RTSyscallInfoHdr,
kKernelMaxSystemCalls>
kSyscalls;
+inline NewOS::Array<RTSyscallInfoHdr,
+ kKernelMaxSystemCalls>
+ kKerncalls;
+
EXTERN_C NewOS::HAL::StackFramePtr rt_get_current_context();
EXTERN_C NewOS::Void rt_do_context_switch(NewOS::HAL::StackFramePtr stackFrame);
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";
}
}
diff --git a/Kernel/NewKit/Array.hpp b/Kernel/NewKit/Array.hpp
index b8386c9a..1c89f365 100644
--- a/Kernel/NewKit/Array.hpp
+++ b/Kernel/NewKit/Array.hpp
@@ -43,14 +43,7 @@ namespace NewOS
SizeT Count() const
{
- SizeT cntElems = 0UL;
- for (auto Val : fArray)
- {
- if (Val)
- ++cntElems;
- }
-
- return cntElems;
+ return N;
}
const T* CData()
diff --git a/Kernel/Sources/SMPManager.cxx b/Kernel/Sources/SMPManager.cxx
index f0b680ce..99a3b025 100644
--- a/Kernel/Sources/SMPManager.cxx
+++ b/Kernel/Sources/SMPManager.cxx
@@ -113,7 +113,7 @@ namespace NewOS
fStack->R9 = stack->R9;
fStack->R8 = stack->R8;
- fStack->Exception = this->fID;
+ fStack->Rcx = this->fID;
}
rt_do_context_switch(fStack);