diff options
| -rw-r--r-- | Boot/makefile | 2 | ||||
| -rw-r--r-- | DDK/KernelCall.c | 11 | ||||
| -rw-r--r-- | DDK/KernelDev.c | 7 | ||||
| -rw-r--r-- | DDK/KernelPrint.c | 2 | ||||
| -rw-r--r-- | DDK/KernelStd.h | 8 | ||||
| -rw-r--r-- | DDK/KernelStdCxx.cc | 6 | ||||
| -rw-r--r-- | Kernel/ArchKit/ArchKit.hpp | 13 | ||||
| -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 | ||||
| -rw-r--r-- | Kernel/NewKit/Array.hpp | 9 | ||||
| -rw-r--r-- | Kernel/Sources/SMPManager.cxx | 2 |
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); |
