From 2f921f57ec48cc8c98882d7150a08c354b60bb72 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 13 Jun 2024 09:41:32 +0200 Subject: MHR-31: initial commit. Signed-off-by: Amlal El Mahrouss --- Kernel/Sources/FS/NewFS.cxx | 2 ++ Kernel/Sources/KeMain.cxx | 24 ++++++++++++------------ 2 files changed, 14 insertions(+), 12 deletions(-) (limited to 'Kernel/Sources') diff --git a/Kernel/Sources/FS/NewFS.cxx b/Kernel/Sources/FS/NewFS.cxx index f015673d..2938c53f 100644 --- a/Kernel/Sources/FS/NewFS.cxx +++ b/Kernel/Sources/FS/NewFS.cxx @@ -593,6 +593,8 @@ _Output NewCatalog* NewFSParser::FindCatalog(_Input const char* catalogName, if (!sMountpointInterface.GetAddressOf(this->fDriveIndex)) return nullptr; + kcout << "newoskrnl: start finding catalog...\r"; + Char* sectorBuf = new Char[sizeof(NewPartitionBlock)]; auto drive = sMountpointInterface.GetAddressOf(this->fDriveIndex); diff --git a/Kernel/Sources/KeMain.cxx b/Kernel/Sources/KeMain.cxx index f4f9f44c..e2f41464 100644 --- a/Kernel/Sources/KeMain.cxx +++ b/Kernel/Sources/KeMain.cxx @@ -39,7 +39,7 @@ namespace NewOS::Detail { /// Mounted partition, cool! NewOS::kcout - << "New OS: No need to create for a NewFS partition here...\r"; + << "newoskrnl: No need to create for a NewFS partition here...\r"; } else { @@ -51,11 +51,11 @@ namespace NewOS::Detail if (fNewFS->GetParser()) { - constexpr auto cFolderInfo = "Metadata"; + constexpr auto cFolderInfo = "META-INF"; const auto cDirCount = 8; const char* cDirStr[cDirCount] = { - "/Boot/", "/System/", "/Support/", "/Applications/", - "/Users/", "/Library/", "/Mount/", "/Assistants/"}; + "\\Boot\\", "\\System\\", "\\Support\\", "\\Applications\\", + "\\Users\\", "\\Library\\", "\\Mount\\", "\\DCIM\\"}; for (NewOS::SizeT dirIndx = 0UL; dirIndx < cDirCount; ++dirIndx) { @@ -113,9 +113,9 @@ namespace NewOS::Detail } NewCatalog* catalogDisk = - this->fNewFS->GetParser()->GetCatalog("/Mount/This Disk"); + this->fNewFS->GetParser()->GetCatalog("\\Mount\\This Disk"); - const NewOS::Char* cSrcName = "DiskInfo"; + const NewOS::Char* cSrcName = "DISK-INF"; if (catalogDisk) { @@ -128,14 +128,14 @@ namespace NewOS::Detail else { catalogDisk = - (NewCatalog*)this->Leak()->CreateAlias("/Mount/This Disk"); + (NewCatalog*)this->Leak()->CreateAlias("\\Mount\\This Disk"); NewOS::StringView diskFolder(kNewFSSectorSz); diskFolder += - "

Kind: alias to disk

\r

Created by: system

\r

Edited " + "

Kind: alias to disk

\r

Created by: newoskrnl

\r

Edited " "by: " - "system

\r

Volume Type: New OS Standard

\r"; + "N/A

\r

Volume Type: New OS Standard

\r"; diskFolder += "

Original Path: "; diskFolder += NewOS::NewFilesystemHelper::Root(); @@ -184,7 +184,7 @@ namespace NewOS::Detail /// @return void no return value. STATIC NewOS::Void SystemLauncher_Main(NewOS::Void) { - NewOS::PEFLoader lockScreen("/System/LockScreen"); + NewOS::PEFLoader lockScreen("\\System\\LockScreen"); if (!lockScreen.IsLoaded()) { @@ -194,7 +194,7 @@ namespace NewOS::Detail NewOS::Utils::execute_from_image(lockScreen, NewOS::ProcessHeader::kAppKind); - NewOS::PEFLoader stageBoard("/System/StageBoard"); + NewOS::PEFLoader stageBoard("\\System\\StageBoard"); if (!stageBoard.IsLoaded()) { @@ -221,7 +221,7 @@ EXTERN_C NewOS::Void KeMain(NewOS::Void) auto cLoaderName = "SystemLauncher"; NewOS::execute_from_image(NewOS::Detail::SystemLauncher_Main, cLoaderName); - while (true) + while (true) { NewOS::ProcessScheduler::The().Leak().Run(); } -- cgit v1.2.3 From 349fe48baf941b2d1b571d3a5d0d796823bae312 Mon Sep 17 00:00:00 2001 From: Amlal EL Mahrouss Date: Thu, 13 Jun 2024 17:41:19 +0200 Subject: MHR-31: New systemcall/kernelcall architecture. Signed-off-by: Amlal EL Mahrouss --- Boot/makefile | 2 +- DDK/KernelCall.c | 11 ++-- DDK/KernelDev.c | 7 +-- DDK/KernelPrint.c | 2 +- DDK/KernelStd.h | 8 ++- DDK/KernelStdCxx.cc | 6 +-- Kernel/ArchKit/ArchKit.hpp | 13 ++++- .../HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp | 50 +++++++++++------- .../HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp | 22 ++------ Kernel/HALKit/AMD64/HalInterruptAPI.asm | 59 +++++++++++++++++++++- Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp | 20 +++++--- Kernel/NewKit/Array.hpp | 9 +--- Kernel/Sources/SMPManager.cxx | 2 +- 13 files changed, 139 insertions(+), 72 deletions(-) (limited to 'Kernel/Sources') 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 #include -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 +#include /// @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 #include -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 kSyscalls; +inline NewOS::Array + 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 -#include +#include -NewOS::Array - 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); -- cgit v1.2.3 From 7327f305efb1c6678722308cc5f9645dd39f451e Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 13 Jun 2024 19:38:29 +0200 Subject: MHR-31: Lots of fixes and improvements regarding the kernel. Signed-off-by: Amlal El Mahrouss --- Boot/makefile | 2 +- Kernel/ArchKit/ArchKit.hpp | 4 +- .../HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp | 25 +-------- .../HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp | 7 +-- Kernel/HALKit/AMD64/HalHardwareMP.cpp | 30 ----------- Kernel/HALKit/AMD64/HalHart.cpp | 30 +++++++++++ Kernel/HALKit/AMD64/HalInterruptAPI.asm | 47 +++++------------ Kernel/HALKit/AMD64/HalKernelMain.cxx | 19 ++++++- Kernel/HALKit/AMD64/PCI/Iterator.cxx | 6 +-- Kernel/KernelKit/ProcessScheduler.hxx | 19 ++----- Kernel/KernelKit/SMPManager.hpp | 6 +-- Kernel/NewKit/Array.hpp | 4 +- Kernel/NewKit/MutableArray.hpp | 7 +++ Kernel/Sources/HError.cxx | 3 +- Kernel/Sources/KeMain.cxx | 5 -- Kernel/Sources/ProcessScheduler.cxx | 61 +++++++++++----------- Kernel/Sources/SMPManager.cxx | 46 +++++++++------- 17 files changed, 145 insertions(+), 176 deletions(-) delete mode 100644 Kernel/HALKit/AMD64/HalHardwareMP.cpp create mode 100644 Kernel/HALKit/AMD64/HalHart.cpp (limited to 'Kernel/Sources') diff --git a/Boot/makefile b/Boot/makefile index e54b1aa8..4bee19a2 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 -m 4G -M q35 \ +EMU_FLAGS=-net none -smp 4 -serial stdio -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/Kernel/ArchKit/ArchKit.hpp b/Kernel/ArchKit/ArchKit.hpp index c2e5a967..6407a0d8 100644 --- a/Kernel/ArchKit/ArchKit.hpp +++ b/Kernel/ArchKit/ArchKit.hpp @@ -79,7 +79,7 @@ namespace NewOS #define kKernelMaxSystemCalls (256) -typedef NewOS::Void (*rt_syscall_proc)(NewOS::HAL::StackFramePtr); +typedef NewOS::Void (*rt_syscall_proc)(NewOS::VoidPtr); struct RTSyscallInfoHdr final { @@ -95,7 +95,7 @@ inline NewOS::Array 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 a21a4c47..51570b86 100644 --- a/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp +++ b/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp @@ -12,11 +12,6 @@ /// @param rsp EXTERN_C void idt_handle_gpf(NewOS::UIntPtr rsp) { - MUST_PASS(NewOS::ProcessScheduler::The().Leak().GetCurrent()); - - NewOS::kcout << "newoskrnl: Stack Pointer: " - << NewOS::StringBuilder::FromInt("rsp{%}", rsp); - NewOS::kcout << "newoskrnl: General Protection Fault, caused by " << NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName(); @@ -28,9 +23,6 @@ EXTERN_C void idt_handle_gpf(NewOS::UIntPtr rsp) /// @param rsp EXTERN_C void idt_handle_pf(NewOS::UIntPtr rsp) { - MUST_PASS(NewOS::ProcessScheduler::The().Leak().GetCurrent()); - NewOS::kcout << NewOS::StringBuilder::FromInt("rsp{%}", rsp); - NewOS::kcout << "newoskrnl: Segmentation Fault, caused by " << NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName(); @@ -42,9 +34,6 @@ EXTERN_C void idt_handle_pf(NewOS::UIntPtr rsp) /// @param rsp EXTERN_C void idt_handle_math(NewOS::UIntPtr rsp) { - MUST_PASS(NewOS::ProcessScheduler::The().Leak().GetCurrent()); - NewOS::kcout << NewOS::StringBuilder::FromInt("rsp{%}", rsp); - NewOS::kcout << "newoskrnl: Math error, caused by " << NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName(); @@ -56,9 +45,6 @@ EXTERN_C void idt_handle_math(NewOS::UIntPtr rsp) /// @param rsp EXTERN_C void idt_handle_generic(NewOS::UIntPtr rsp) { - MUST_PASS(NewOS::ProcessScheduler::The().Leak().GetCurrent()); - NewOS::kcout << NewOS::StringBuilder::FromInt("sp{%}", rsp); - NewOS::kcout << "newoskrnl: Execution error, caused by " << NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName(); @@ -70,11 +56,6 @@ EXTERN_C void idt_handle_generic(NewOS::UIntPtr rsp) /// @param rsp EXTERN_C void idt_handle_ud(NewOS::UIntPtr rsp) { - MUST_PASS(NewOS::ProcessScheduler::The().Leak().GetCurrent()); - - NewOS::kcout << "newoskrnl: Stack Pointer: " - << NewOS::StringBuilder::FromInt("rsp{%}", rsp); - NewOS::kcout << "newoskrnl: Invalid interrupt, caused by " << NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName(); @@ -91,10 +72,8 @@ EXTERN_C NewOS::Void hal_system_call_enter(NewOS::UIntPtr rcx, NewOS::UIntPtr rd { 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); + if (kSyscalls[rcx].Leak().Leak()->fHooked) + (kSyscalls[rcx].Leak().Leak()->fProc)((NewOS::VoidPtr)rdx); NewOS::kcout << "newoskrnl: syscall: exit.\r"; } diff --git a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp index e2520332..c15a7b55 100644 --- a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp +++ b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp @@ -16,9 +16,6 @@ #define kAPIC_SIPI_Vector 0x00500 #define kAPIC_EIPI_Vector 0x00400 -/// @brief This symbol is the kernel main symbol. -EXTERN_C void KeMain(); - /// @brief assembly routine. internal use only. EXTERN_C void _hal_enable_smp(void); @@ -159,9 +156,7 @@ namespace NewOS::HAL EXTERN_C Void hal_apic_acknowledge_cont(Void) { - /// TODO: better init code. - KeMain(); - + ProcessHelper::StartScheduling(); _hal_spin_core(); } diff --git a/Kernel/HALKit/AMD64/HalHardwareMP.cpp b/Kernel/HALKit/AMD64/HalHardwareMP.cpp deleted file mode 100644 index 92e075aa..00000000 --- a/Kernel/HALKit/AMD64/HalHardwareMP.cpp +++ /dev/null @@ -1,30 +0,0 @@ -/* ------------------------------------------- - - Copyright Zeta Electronics Corporation - -------------------------------------------- */ - -#include - -// bugs = 0 - -namespace NewOS -{ - /// @brief wakes up thread. - /// wakes up thread from hang. - void rt_wakeup_thread(HAL::StackFrame* stack) - { - HAL::rt_cli(); - - HAL::rt_sti(); - } - - /// @brief makes thread sleep. - /// hooks and hangs thread to prevent code from executing. - void rt_hang_thread(HAL::StackFrame* stack) - { - HAL::rt_cli(); - - HAL::rt_sti(); - } -} // namespace NewOS diff --git a/Kernel/HALKit/AMD64/HalHart.cpp b/Kernel/HALKit/AMD64/HalHart.cpp new file mode 100644 index 00000000..92e075aa --- /dev/null +++ b/Kernel/HALKit/AMD64/HalHart.cpp @@ -0,0 +1,30 @@ +/* ------------------------------------------- + + Copyright Zeta Electronics Corporation + +------------------------------------------- */ + +#include + +// bugs = 0 + +namespace NewOS +{ + /// @brief wakes up thread. + /// wakes up thread from hang. + void rt_wakeup_thread(HAL::StackFrame* stack) + { + HAL::rt_cli(); + + HAL::rt_sti(); + } + + /// @brief makes thread sleep. + /// hooks and hangs thread to prevent code from executing. + void rt_hang_thread(HAL::StackFrame* stack) + { + HAL::rt_cli(); + + HAL::rt_sti(); + } +} // namespace NewOS diff --git a/Kernel/HALKit/AMD64/HalInterruptAPI.asm b/Kernel/HALKit/AMD64/HalInterruptAPI.asm index e88ffc0d..150cfc10 100644 --- a/Kernel/HALKit/AMD64/HalInterruptAPI.asm +++ b/Kernel/HALKit/AMD64/HalInterruptAPI.asm @@ -201,11 +201,15 @@ IntNormal 49 __NEW_INT_50: cli + push rcx + push rdx push rax call hal_system_call_enter pop rax + pop rdx + pop rcx sti iretq @@ -213,47 +217,19 @@ __NEW_INT_50: __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 + push rax call hal_kernel_call_enter - pop fs - pop gs - pop r15 - pop r14 - pop r13 - pop r12 - pop r11 - pop r10 + pop rax pop r9 pop r8 - pop rdi - pop rsi - pop rbp - pop rbx pop rdx pop rcx - pop rax sti iretq @@ -278,13 +254,18 @@ IntNormal 60 ;; testing interrupts. _ke_power_on_self_test: mov rcx, 0x10 - int 0x32 - int 0x32 - int 0x32 + mov rdx, _ke_string_post + int 0x32 ret +section .data +_ke_string_post: + db "POST has been successful.", 0 + +section .text + [global hal_load_gdt] hal_load_gdt: diff --git a/Kernel/HALKit/AMD64/HalKernelMain.cxx b/Kernel/HALKit/AMD64/HalKernelMain.cxx index 708004b3..6f01734e 100644 --- a/Kernel/HALKit/AMD64/HalKernelMain.cxx +++ b/Kernel/HALKit/AMD64/HalKernelMain.cxx @@ -14,6 +14,10 @@ #include #include #include +#include + +/// @brief This symbol is the kernel main symbol. +EXTERN_C void KeMain(); EXTERN_C NewOS::VoidPtr kInterruptVectorTable[]; @@ -72,13 +76,24 @@ EXTERN_C void hal_init_platform( /// START POST + constexpr auto cDummyInterrupt = 0x10; // 16 + + kSyscalls[cDummyInterrupt].Leak().Leak()->fProc = [](NewOS::VoidPtr sf) -> void { + const char* msg = (const char*)sf; + NewOS::kcout << "newoskrnl: " << msg << "\r"; + }; + + kSyscalls[cDummyInterrupt].Leak().Leak()->fHooked = true; + NewOS::HAL::Detail::_ke_power_on_self_test(); + auto cLoaderName = "newoskrnl"; + NewOS::execute_from_image(KeMain, cLoaderName); + NewOS::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_RsdPtr); NewOS::kcout << "newoskrnl: We're done here...\r"; while (true) - { - } + {} } diff --git a/Kernel/HALKit/AMD64/PCI/Iterator.cxx b/Kernel/HALKit/AMD64/PCI/Iterator.cxx index 8675f171..297aa89c 100644 --- a/Kernel/HALKit/AMD64/PCI/Iterator.cxx +++ b/Kernel/HALKit/AMD64/PCI/Iterator.cxx @@ -7,8 +7,8 @@ #include #define PCI_ITERATOR_FIND_AND_UNWRAP(DEV, SZ) \ - if (DEV.Leak()) \ - return DEV.Leak(); + if (DEV.Leak().Leak()) \ + return *DEV.Leak().Leak(); namespace NewOS::PCI { @@ -25,7 +25,7 @@ namespace NewOS::PCI if (dev.Class() == (UChar)type) { - fDevices[bus].Leak().Leak() = dev; + *fDevices[bus].Leak().Leak() = dev; } } } diff --git a/Kernel/KernelKit/ProcessScheduler.hxx b/Kernel/KernelKit/ProcessScheduler.hxx index c6e090e4..8c1971b0 100644 --- a/Kernel/KernelKit/ProcessScheduler.hxx +++ b/Kernel/KernelKit/ProcessScheduler.hxx @@ -17,7 +17,7 @@ #define kSchedMinMicroTime (AffinityKind::kHartStandard) #define kSchedInvalidPID (-1) -#define kSchedProcessLimitPerTeam (100U) +#define kSchedProcessLimitPerTeam (16U) //////////////////////////////////////////////////// @@ -134,7 +134,6 @@ namespace NewOS explicit ProcessHeader(VoidPtr startImage = nullptr) : Image(startImage) { - MUST_PASS(startImage); } ~ProcessHeader() = default; @@ -145,7 +144,7 @@ namespace NewOS void SetEntrypoint(UIntPtr& imageStart) noexcept; public: - Char Name[kProcessLen] = {"NewOS Process"}; + Char Name[kProcessLen] = {"Process"}; ProcessSubsystem SubSystem{ProcessSubsystem::eProcessSubsystemInvalid}; ProcessSelector Selector{ProcessSelector::kRingUser}; HAL::StackFramePtr StackFrame{nullptr}; @@ -240,23 +239,15 @@ namespace NewOS /// The main class which you call to schedule an app. class ProcessScheduler final { - private: - explicit ProcessScheduler() = default; + explicit ProcessScheduler() = default; public: ~ProcessScheduler() = default; NEWOS_COPY_DEFAULT(ProcessScheduler) - operator bool() - { - return mTeam.AsArray().Count() > 0; - } - - bool operator!() - { - return mTeam.AsArray().Count() == 0; - } + operator bool(); + bool operator!(); public: ProcessTeam& CurrentTeam(); diff --git a/Kernel/KernelKit/SMPManager.hpp b/Kernel/KernelKit/SMPManager.hpp index 985050f1..ba706cf6 100644 --- a/Kernel/KernelKit/SMPManager.hpp +++ b/Kernel/KernelKit/SMPManager.hpp @@ -94,11 +94,11 @@ namespace NewOS NEWOS_COPY_DEFAULT(SMPManager); public: - bool Switch(HAL::StackFrame* the); - HAL::StackFramePtr GetStackFrame() noexcept; + bool Switch(HAL::StackFramePtr the); + HAL::StackFramePtr Leak() noexcept; public: - Ref operator[](const SizeT& idx); + Ref operator[](const SizeT& idx); bool operator!() noexcept; operator bool() noexcept; diff --git a/Kernel/NewKit/Array.hpp b/Kernel/NewKit/Array.hpp index 1c89f365..dca5c13f 100644 --- a/Kernel/NewKit/Array.hpp +++ b/Kernel/NewKit/Array.hpp @@ -21,13 +21,13 @@ namespace NewOS Array& operator=(const Array&) = default; Array(const Array&) = default; - ErrorOr operator[](Size At) + ErrorOr operator[](Size At) { if (At > N) return {}; kcout << "Returning element\r"; - return ErrorOr(fArray[At]); + return ErrorOr(&fArray[At]); } Boolean Empty() const diff --git a/Kernel/NewKit/MutableArray.hpp b/Kernel/NewKit/MutableArray.hpp index f9c79301..a3ad4cb1 100644 --- a/Kernel/NewKit/MutableArray.hpp +++ b/Kernel/NewKit/MutableArray.hpp @@ -170,6 +170,13 @@ namespace NewOS Boolean Add(const T val) { auto* iterationNode = fFirstNode; + + if (!iterationNode) + { + fFirstNode = new MutableLinkedList(); + iterationNode = fFirstNode; + } + MUST_PASS(iterationNode); while (iterationNode) diff --git a/Kernel/Sources/HError.cxx b/Kernel/Sources/HError.cxx index 937e983a..1f36d020 100644 --- a/Kernel/Sources/HError.cxx +++ b/Kernel/Sources/HError.cxx @@ -13,6 +13,7 @@ namespace NewOS /// @return if error-free: true, otherwise false. Boolean ke_bug_check(void) noexcept { - return true; + /// TODO: + return false; } } // namespace NewOS diff --git a/Kernel/Sources/KeMain.cxx b/Kernel/Sources/KeMain.cxx index e2f41464..60494ee3 100644 --- a/Kernel/Sources/KeMain.cxx +++ b/Kernel/Sources/KeMain.cxx @@ -220,9 +220,4 @@ EXTERN_C NewOS::Void KeMain(NewOS::Void) auto cLoaderName = "SystemLauncher"; NewOS::execute_from_image(NewOS::Detail::SystemLauncher_Main, cLoaderName); - - while (true) - { - NewOS::ProcessScheduler::The().Leak().Run(); - } } diff --git a/Kernel/Sources/ProcessScheduler.cxx b/Kernel/Sources/ProcessScheduler.cxx index 08a7971e..7008eafe 100644 --- a/Kernel/Sources/ProcessScheduler.cxx +++ b/Kernel/Sources/ProcessScheduler.cxx @@ -18,7 +18,7 @@ ///! BUGS: 0 /***********************************************************************************/ -/* This file handles the process scheduling. +/* This file handles the process scheduling. */ /***********************************************************************************/ namespace NewOS @@ -42,7 +42,8 @@ namespace NewOS void ProcessHeader::Crash() { - kcout << this->Name << ": crashed. (id = " << number(kErrorProcessFault); + kcout << (*this->Name == 0 ? "Unknown" : this->Name) << ": crashed. (id = "; + kcout.Number(kErrorProcessFault); kcout << ")\r"; if (this->Ring != kRingUserKind) @@ -201,9 +202,6 @@ namespace NewOS /// @return SizeT ProcessScheduler::Add(Ref& process) { - if (!process) - return -1; - if (!process.Leak().Image) { if (process.Leak().Kind != ProcessHeader::kShLibKind) @@ -212,7 +210,7 @@ namespace NewOS } } - if (!mTeam.AsArray().Count() > kSchedProcessLimitPerTeam) + if (mTeam.AsArray().Count() > kSchedProcessLimitPerTeam) return -kErrorOutOfTeamSlot; kcout << "ProcessScheduler::Add(Ref& process)\r"; @@ -262,8 +260,8 @@ namespace NewOS { auto process = mTeam.AsArray()[processIndex]; - MUST_PASS(process); //! no need for a MUST_PASS(process.Leak());, it is - //! recursive because of the nature of the class; + if (!process) + continue; //! run any process needed to be scheduled. if (ProcessHelper::CanBeScheduled(process.Leak())) @@ -351,22 +349,11 @@ namespace NewOS bool ProcessHelper::StartScheduling() { - if (ProcessHelper::CanBeScheduled( - ProcessScheduler::The().Leak().GetCurrent())) - { - --ProcessScheduler::The().Leak().GetCurrent().Leak().PTime; - return false; - } - - auto processRef = ProcessScheduler::The().Leak(); - - if (!processRef) - return false; // we have nothing to schedule. simply return. + auto& processRef = ProcessScheduler::The().Leak(); + SizeT ret = processRef.Run(); - SizeT ret = processRef.Run(); - - kcout << StringBuilder::FromInt( - "ProcessHelper::StartScheduling() Iterated over {%} jobs inside team.\r", ret); + kcout << "newoskrnl: Iterated over: " << number(ret); + kcout << " processes.\r"; return true; } @@ -384,30 +371,42 @@ namespace NewOS for (SizeT index = 0UL; index < SMPManager::The().Leak().Count(); ++index) { - if (SMPManager::The().Leak()[index].Leak().Kind() == kInvalidHart) + if (SMPManager::The().Leak()[index].Leak()->Kind() == kInvalidHart) continue; - if (SMPManager::The().Leak()[index].Leak().StackFrame() == the_stack) + if (SMPManager::The().Leak()[index].Leak()->StackFrame() == the_stack) { - SMPManager::The().Leak()[index].Leak().Busy(false); + SMPManager::The().Leak()[index].Leak()->Busy(false); continue; } - if (SMPManager::The().Leak()[index].Leak().IsBusy()) + if (SMPManager::The().Leak()[index].Leak()->IsBusy()) continue; - if (SMPManager::The().Leak()[index].Leak().Kind() != + if (SMPManager::The().Leak()[index].Leak()->Kind() != ThreadKind::kHartBoot && - SMPManager::The().Leak()[index].Leak().Kind() != + SMPManager::The().Leak()[index].Leak()->Kind() != ThreadKind::kHartSystemReserved) { - SMPManager::The().Leak()[index].Leak().Busy(true); + SMPManager::The().Leak()[index].Leak()->Busy(true); ProcessHelper::GetCurrentPID() = new_pid; - return SMPManager::The().Leak()[index].Leak().Switch(the_stack); + return SMPManager::The().Leak()[index].Leak()->Switch(the_stack); } } return false; } + + /// @brief this checks if any process is on the team. + ProcessScheduler::operator bool() + { + return mTeam.AsArray().Count() > 0; + } + + /// @brief this checks if no process is on the team. + bool ProcessScheduler::operator!() + { + return mTeam.AsArray().Count() == 0; + } } // namespace NewOS diff --git a/Kernel/Sources/SMPManager.cxx b/Kernel/Sources/SMPManager.cxx index 99a3b025..683343ff 100644 --- a/Kernel/Sources/SMPManager.cxx +++ b/Kernel/Sources/SMPManager.cxx @@ -117,7 +117,7 @@ namespace NewOS } rt_do_context_switch(fStack); - + return true; } @@ -143,12 +143,12 @@ namespace NewOS } /// @brief Get Stack Frame of Core - HAL::StackFramePtr SMPManager::GetStackFrame() noexcept + HAL::StackFramePtr SMPManager::Leak() noexcept { if (fThreadList[fCurrentThread].Leak() && ProcessHelper::GetCurrentPID() == - fThreadList[fCurrentThread].Leak().Leak().fPID) - return fThreadList[fCurrentThread].Leak().Leak().fStack; + fThreadList[fCurrentThread].Leak().Leak()->fPID) + return fThreadList[fCurrentThread].Leak().Leak()->fStack; return nullptr; } @@ -163,35 +163,35 @@ namespace NewOS { // stack != nullptr -> if core is used, then continue. if (!fThreadList[idx].Leak() || - !fThreadList[idx].Leak().Leak().IsWakeup() || - fThreadList[idx].Leak().Leak().IsBusy()) + !fThreadList[idx].Leak().Leak()->IsWakeup() || + fThreadList[idx].Leak().Leak()->IsBusy()) continue; // to avoid any null deref. - if (!fThreadList[idx].Leak().Leak().fStack) + if (!fThreadList[idx].Leak().Leak()->fStack) continue; - if (fThreadList[idx].Leak().Leak().fStack->Rsp == 0) + if (fThreadList[idx].Leak().Leak()->fStack->Rsp == 0) continue; - if (fThreadList[idx].Leak().Leak().fStack->Rbp == 0) + if (fThreadList[idx].Leak().Leak()->fStack->Rbp == 0) continue; - fThreadList[idx].Leak().Leak().Busy(true); + fThreadList[idx].Leak().Leak()->Busy(true); - fThreadList[idx].Leak().Leak().fID = idx; + fThreadList[idx].Leak().Leak()->fID = idx; /// I figured out this: /// Allocate stack /// Set APIC base to stack /// Do stuff and relocate stack based on this code. /// - Amlel - rt_copy_memory(stack, fThreadList[idx].Leak().Leak().fStack, + rt_copy_memory(stack, fThreadList[idx].Leak().Leak()->fStack, sizeof(HAL::StackFrame)); - fThreadList[idx].Leak().Leak().Switch(fThreadList[idx].Leak().Leak().fStack); + fThreadList[idx].Leak().Leak()->Switch(fThreadList[idx].Leak().Leak()->fStack); - fThreadList[idx].Leak().Leak().fPID = ProcessHelper::GetCurrentPID(); + fThreadList[idx].Leak().Leak()->fPID = ProcessHelper::GetCurrentPID(); - fThreadList[idx].Leak().Leak().Busy(false); + fThreadList[idx].Leak().Leak()->Busy(false); return true; } @@ -204,19 +204,25 @@ namespace NewOS * @param idx the index * @return the reference to the hardware thread. */ - Ref SMPManager::operator[](const SizeT& idx) + Ref SMPManager::operator[](const SizeT& idx) { if (idx == 0) { - if (fThreadList[idx].Leak().Leak().Kind() != kHartSystemReserved) + if (fThreadList[idx].Leak().Leak()->Kind() != kHartSystemReserved) { - fThreadList[idx].Leak().Leak().fKind = kHartBoot; + fThreadList[idx].Leak().Leak()->fKind = kHartBoot; } } else if (idx >= kMaxHarts) { - HardwareThread fakeThread; - fakeThread.fKind = kInvalidHart; + static HardwareThread* fakeThread = new HardwareThread(); + + if (!fakeThread) + { + fakeThread = new HardwareThread(); + } + + fakeThread->fKind = kInvalidHart; return {fakeThread}; } -- cgit v1.2.3 From 12126f9eebfa7fc6b2cd6148f13585ff71cf5425 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 13 Jun 2024 19:55:30 +0200 Subject: MHR-31: Rework scheduler, remove the concept of user driver and rings. Signed-off-by: Amlal El Mahrouss --- Kernel/HALKit/AMD64/HalKernelMain.cxx | 4 +--- Kernel/KernelKit/ProcessScheduler.hxx | 8 -------- Kernel/Sources/CodeManager.cxx | 4 ++-- Kernel/Sources/KeMain.cxx | 7 ++----- Kernel/Sources/ProcessScheduler.cxx | 24 ++---------------------- 5 files changed, 7 insertions(+), 40 deletions(-) (limited to 'Kernel/Sources') diff --git a/Kernel/HALKit/AMD64/HalKernelMain.cxx b/Kernel/HALKit/AMD64/HalKernelMain.cxx index 6f01734e..7064183b 100644 --- a/Kernel/HALKit/AMD64/HalKernelMain.cxx +++ b/Kernel/HALKit/AMD64/HalKernelMain.cxx @@ -87,13 +87,11 @@ EXTERN_C void hal_init_platform( NewOS::HAL::Detail::_ke_power_on_self_test(); - auto cLoaderName = "newoskrnl"; + auto cLoaderName = "LaunchDevil"; NewOS::execute_from_image(KeMain, cLoaderName); NewOS::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_RsdPtr); - NewOS::kcout << "newoskrnl: We're done here...\r"; - while (true) {} } diff --git a/Kernel/KernelKit/ProcessScheduler.hxx b/Kernel/KernelKit/ProcessScheduler.hxx index 8c1971b0..1ac19053 100644 --- a/Kernel/KernelKit/ProcessScheduler.hxx +++ b/Kernel/KernelKit/ProcessScheduler.hxx @@ -164,19 +164,11 @@ namespace NewOS { kAppKind = 1, kShLibKind = 2, - kDriverKind = 3, kKindCount, }; - enum - { - kRingUserKind = 3, - kRingDriverKind = 0, - }; - ProcessTime PTime; PID ProcessId{kSchedInvalidPID}; - Int32 Ring{kRingDriverKind}; Int32 Kind{kAppKind}; public: diff --git a/Kernel/Sources/CodeManager.cxx b/Kernel/Sources/CodeManager.cxx index 33121edf..9f374c18 100644 --- a/Kernel/Sources/CodeManager.cxx +++ b/Kernel/Sources/CodeManager.cxx @@ -20,11 +20,11 @@ namespace NewOS return false; ProcessHeader proc((VoidPtr)main); - proc.Kind = ProcessHeader::kDriverKind; + proc.Kind = ProcessHeader::kAppKind; rt_copy_memory((VoidPtr)processName, proc.Name, rt_string_len(proc.Name)); Ref refProc = proc; return ProcessScheduler::The().Leak().Add(refProc); } -} // namespace NewOS \ No newline at end of file +} // namespace NewOS diff --git a/Kernel/Sources/KeMain.cxx b/Kernel/Sources/KeMain.cxx index 60494ee3..9be8a026 100644 --- a/Kernel/Sources/KeMain.cxx +++ b/Kernel/Sources/KeMain.cxx @@ -204,9 +204,7 @@ namespace NewOS::Detail NewOS::Utils::execute_from_image(stageBoard, NewOS::ProcessHeader::kAppKind); - NewOS::kcout << "SystemLauncher: done, sleeping..."; - - while (true) {} + /// TODO: now jump to user mode using the HAL. } } // namespace NewOS::Detail @@ -218,6 +216,5 @@ EXTERN_C NewOS::Void KeMain(NewOS::Void) /// Now run kernel loop, until no process are running. NewOS::Detail::FilesystemWizard wizard; // automatic. - auto cLoaderName = "SystemLauncher"; - NewOS::execute_from_image(NewOS::Detail::SystemLauncher_Main, cLoaderName); + NewOS::Detail::SystemLauncher_Main(); } diff --git a/Kernel/Sources/ProcessScheduler.cxx b/Kernel/Sources/ProcessScheduler.cxx index 7008eafe..d9d013c6 100644 --- a/Kernel/Sources/ProcessScheduler.cxx +++ b/Kernel/Sources/ProcessScheduler.cxx @@ -46,11 +46,6 @@ namespace NewOS kcout.Number(kErrorProcessFault); kcout << ")\r"; - if (this->Ring != kRingUserKind) - { - MUST_PASS(ke_bug_check()); - } - this->Exit(kErrorProcessFault); } @@ -167,24 +162,8 @@ namespace NewOS ProcessScheduler::The().Leak().GetCurrent().Leak().ProcessId) ke_stop(RUNTIME_CHECK_PROCESS); - if (this->Ring == (Int32)ProcessSelector::kRingKernel && - ProcessScheduler::The().Leak().GetCurrent().Leak().Ring > 0) - ke_stop(RUNTIME_CHECK_PROCESS); - kLastExitCode = exit_code; - if (this->Ring != (Int32)ProcessSelector::kRingDriver) - { - if (this->HeapPtr) - rt_free_heap(this->HeapPtr); - - this->HeapPtr = nullptr; - this->HeapCursor = nullptr; - - this->FreeMemory = 0UL; - this->UsedMemory = 0UL; - } - //! Delete image if not done already. if (this->Image) ke_delete_ke_heap(this->Image); @@ -352,7 +331,8 @@ namespace NewOS auto& processRef = ProcessScheduler::The().Leak(); SizeT ret = processRef.Run(); - kcout << "newoskrnl: Iterated over: " << number(ret); + kcout << "newoskrnl: Iterated over: "; + kcout.Number(ret); kcout << " processes.\r"; return true; -- cgit v1.2.3 From 67a14f5c12510e277911cbcf8ea5ce01f8b8fbb1 Mon Sep 17 00:00:00 2001 From: amlal Date: Thu, 13 Jun 2024 22:02:27 +0200 Subject: MHR-31: Detect all types of cores except the boot one. Signed-off-by: amlal --- Boot/NetBoot/NetBoot.hxx | 7 +++--- Boot/Sources/HEL/AMD64/BootMain.cxx | 10 ++++---- Boot/makefile | 2 +- DDK/KernelCall.c | 5 ++-- DDK/KernelStd.h | 10 ++++---- Kernel/ArchKit/ArchKit.hpp | 4 ++-- Kernel/FirmwareKit/EFI/API.hxx | 4 ++-- Kernel/FirmwareKit/EPM.hxx | 8 +++---- .../HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp | 3 +-- .../HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp | 27 ++++++++++++++-------- Kernel/HALKit/AMD64/HalKernelMain.cxx | 7 +++--- Kernel/HALKit/AMD64/PCI/Iterator.cxx | 2 +- Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp | 2 +- Kernel/KernelKit/DriveManager.hxx | 6 ++--- Kernel/KernelKit/FileManager.hpp | 2 +- Kernel/KernelKit/Framebuffer.hpp | 2 +- Kernel/KernelKit/KernelHeap.hpp | 8 +++---- Kernel/KernelKit/ProcessScheduler.hxx | 8 +++---- Kernel/KernelKit/SMPManager.hpp | 4 ++-- Kernel/KernelKit/XCOFF.hxx | 11 +++++---- Kernel/NetworkKit/IPCEP.hxx | 4 ++-- Kernel/NewKit/Array.hpp | 1 - Kernel/NewKit/MutableArray.hpp | 4 ++-- Kernel/Sources/HError.cxx | 2 +- Kernel/Sources/KeMain.cxx | 6 ++--- Kernel/Sources/KernelHeap.cxx | 4 ++-- Kernel/Sources/SMPManager.cxx | 6 ++--- Kernel/Sources/UserHeap.cxx | 8 +++---- Usr/Sys/CoreSystem/Headers/Defines.h | 19 ++++++++------- Usr/Sys/CoreSystem/Headers/File.h | 2 +- Usr/Sys/CoreSystem/Headers/Intl.h | 6 ++--- Usr/Sys/CoreSystem/Headers/Transport.h | 6 ++--- Usr/Sys/CoreSystem/Sources/CRTStartup.c | 2 +- Usr/Sys/CoreSystem/Sources/File.c | 18 +++++++-------- 34 files changed, 113 insertions(+), 107 deletions(-) (limited to 'Kernel/Sources') diff --git a/Boot/NetBoot/NetBoot.hxx b/Boot/NetBoot/NetBoot.hxx index ccb43290..e3119c5f 100644 --- a/Boot/NetBoot/NetBoot.hxx +++ b/Boot/NetBoot/NetBoot.hxx @@ -19,9 +19,8 @@ typedef struct NetBootInternetHeader CharacterTypeUTF8 NB3; /// magic char 3 'T' CharacterTypeUTF8 NB4; /// magic char 4 'B' - CharacterTypeUTF8 PatchName[255]; /// example: ColdChoco - NewOS::Int32 PatchLength; /// the patch length. + CharacterTypeUTF8 PatchName[255]; /// example: ColdChoco + NewOS::Int32 PatchLength; /// the patch length. CharacterTypeUTF8 PatchTarget[255]; /// the target file. - NewOS::Boolean ImpliesROM; /// does it implies EEPROM patching? + NewOS::Boolean ImpliesROM; /// does it implies EEPROM patching? } NetBootInternetHeader; - diff --git a/Boot/Sources/HEL/AMD64/BootMain.cxx b/Boot/Sources/HEL/AMD64/BootMain.cxx index 5ab7914a..fab212ee 100644 --- a/Boot/Sources/HEL/AMD64/BootMain.cxx +++ b/Boot/Sources/HEL/AMD64/BootMain.cxx @@ -81,8 +81,8 @@ STATIC Bool CheckBootDevice(BootDeviceATA& ataDev) EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, EfiSystemTable* SystemTable) { - InitEFI(SystemTable); ///! Init the EFI library. - InitVideoFB(); ///! Init the GOP. + InitEFI(SystemTable); ///! Init the EFI library. + InitVideoFB(); ///! Init the GOP. BTextWriter writer; @@ -146,13 +146,13 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, GXInit(); GXDraw(RGB(9d, 9d, 9d), handoverHdrPtr->f_GOP.f_Height, - handoverHdrPtr->f_GOP.f_Width, 0, 0); + handoverHdrPtr->f_GOP.f_Width, 0, 0); GXFini(); GXDrawImg(NewBoot, NEWBOOT_HEIGHT, NEWBOOT_WIDTH, - (handoverHdrPtr->f_GOP.f_Width - NEWBOOT_WIDTH) / 2, - (handoverHdrPtr->f_GOP.f_Height - NEWBOOT_HEIGHT) / 2); + (handoverHdrPtr->f_GOP.f_Width - NEWBOOT_WIDTH) / 2, + (handoverHdrPtr->f_GOP.f_Height - NEWBOOT_HEIGHT) / 2); GXFini(); 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 a16a5278..7dc5761c 100644 --- a/DDK/KernelCall.c +++ b/DDK/KernelCall.c @@ -9,13 +9,14 @@ #include #include +/// @brief this is an internal call, do not use it. 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 +/// @param +/// @return DK_EXTERN void* kernelCall(const char* kernelRpcName, int32_t cnt, void* data, size_t sz) { if (!kernelRpcName || cnt == 0) diff --git a/DDK/KernelStd.h b/DDK/KernelStd.h index 63df4c2a..0486479c 100644 --- a/DDK/KernelStd.h +++ b/DDK/KernelStd.h @@ -20,9 +20,9 @@ #include /// @brief Call kernel (interrupt 0x33) -/// @param kernelRpcName -/// @param cnt -/// @param dat -/// @param sz -/// @return +/// @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/Kernel/ArchKit/ArchKit.hpp b/Kernel/ArchKit/ArchKit.hpp index 6407a0d8..c889c93c 100644 --- a/Kernel/ArchKit/ArchKit.hpp +++ b/Kernel/ArchKit/ArchKit.hpp @@ -83,8 +83,8 @@ typedef NewOS::Void (*rt_syscall_proc)(NewOS::VoidPtr); struct RTSyscallInfoHdr final { - NewOS::Int64 fHash; - NewOS::Bool fHooked; + NewOS::Int64 fHash; + NewOS::Bool fHooked; rt_syscall_proc fProc; }; diff --git a/Kernel/FirmwareKit/EFI/API.hxx b/Kernel/FirmwareKit/EFI/API.hxx index c6d02a3e..0f7da5a4 100644 --- a/Kernel/FirmwareKit/EFI/API.hxx +++ b/Kernel/FirmwareKit/EFI/API.hxx @@ -92,8 +92,8 @@ Bascially frees everything we have in the EFI side. GXInit(); GXDrawImg(NewBootFatal, NEWBOOTFATAL_HEIGHT, NEWBOOTFATAL_WIDTH, - (kHandoverHeader->f_GOP.f_Width - NEWBOOTFATAL_WIDTH) / 2, - (kHandoverHeader->f_GOP.f_Height - NEWBOOTFATAL_HEIGHT) / 2); + (kHandoverHeader->f_GOP.f_Width - NEWBOOTFATAL_WIDTH) / 2, + (kHandoverHeader->f_GOP.f_Height - NEWBOOTFATAL_HEIGHT) / 2); GXFini(); diff --git a/Kernel/FirmwareKit/EPM.hxx b/Kernel/FirmwareKit/EPM.hxx index 7c4b37b6..93f4730e 100644 --- a/Kernel/FirmwareKit/EPM.hxx +++ b/Kernel/FirmwareKit/EPM.hxx @@ -117,16 +117,16 @@ typedef struct PartitionBlock PartitionBlockType; ///! @brief partition must start at this address. ///! Anything below is reserved for Data backup by the Main OS. -#define kEPMStartPartitionBlk (sizeof(BootBlock)) +#define kEPMStartPartitionBlk (sizeof(BootBlock)) ///! @brief Current EPM revision (2) -#define kEPMRevision (3) +#define kEPMRevision (3) ///! @brief Current EPM revision (2) -#define kEPMRevisionUEFI (0xF) +#define kEPMRevisionUEFI (0xF) /* @brief Maximum block count. */ -#define kEPMMaxBlks (128) +#define kEPMMaxBlks (128) /// END OF SPECS diff --git a/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp b/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp index 51570b86..e9c0941c 100644 --- a/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp +++ b/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp @@ -82,8 +82,7 @@ EXTERN_C NewOS::Void hal_system_call_enter(NewOS::UIntPtr rcx, NewOS::UIntPtr rd /// @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) +EXTERN_C NewOS::Void hal_kernel_call_enter(NewOS::UIntPtr rcx, NewOS::UIntPtr rdx, NewOS::UIntPtr r8, NewOS::UIntPtr r9) { if (rcx != 0) { diff --git a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp index c15a7b55..37a681ab 100644 --- a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp +++ b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp @@ -113,10 +113,16 @@ namespace NewOS::HAL /////////////////////////////////////////////////////////////////////////////////////// - STATIC MadtType* kApicInfoBlock = nullptr; - STATIC UIntPtr kApicMadtAddresses[255] = {0}; - STATIC SizeT kApicMadtAddressesCount = 0UL; - STATIC UIntPtr cBaseAddressAPIC = 0xFEE00000; + STATIC MadtType* kApicInfoBlock = nullptr; + + STATIC struct + { + UIntPtr fAddress{0}; + UInt32 fKind{0}; + } kApicMadtAddresses[255] = {}; + + STATIC SizeT kApicMadtAddressesCount = 0UL; + STATIC UIntPtr cBaseAddressAPIC = 0xFEE00000; /// @brief this will help us schedule our cores. STATIC Boolean* cProgramInitialized = nullptr; @@ -156,7 +162,6 @@ namespace NewOS::HAL EXTERN_C Void hal_apic_acknowledge_cont(Void) { - ProcessHelper::StartScheduling(); _hal_spin_core(); } @@ -202,21 +207,23 @@ namespace NewOS::HAL if (kApicMadt != nullptr) { - MadtType* madt = (MadtType*)kApicMadt; + MadtType* madt = reinterpret_cast(kApicMadt); constexpr auto cMaxProbableCores = 4; // the amount of cores we want. constexpr auto cStartAt = 0; // start here to avoid boot core. for (SizeT coreAt = cStartAt; coreAt < cMaxProbableCores; ++coreAt) { - if (madt->MadtRecords[coreAt].Flags == kThreadLAPIC) // if local apic. + if (madt->MadtRecords[coreAt].Flags != kThreadBoot) // if local apic. { MadtType::MadtAddress& madtRecord = madt->MadtRecords[coreAt]; // then register as a core for scheduler. - kcout << "newoskrnl: register core as scheduler thread.\r"; + kcout << "newoskrnl: Register Local APIC.\r"; + + kApicMadtAddresses[kApicMadtAddressesCount].fAddress = madtRecord.Address; + kApicMadtAddresses[kApicMadtAddressesCount].fKind = madt->MadtRecords[coreAt].Flags; - kApicMadtAddresses[kApicMadtAddressesCount] = madtRecord.Address; ++kApicMadtAddressesCount; } } @@ -241,7 +248,7 @@ namespace NewOS::HAL cProgramInitialized = new Boolean(true); constexpr auto cWhereToInterrupt = 0x40; - constexpr auto cWhatCore = 1; + constexpr auto cWhatCore = 1; hal_send_start_ipi(cWhatCore, cWhereToInterrupt, cBaseAddressAPIC); } diff --git a/Kernel/HALKit/AMD64/HalKernelMain.cxx b/Kernel/HALKit/AMD64/HalKernelMain.cxx index 7064183b..9b605e1a 100644 --- a/Kernel/HALKit/AMD64/HalKernelMain.cxx +++ b/Kernel/HALKit/AMD64/HalKernelMain.cxx @@ -79,8 +79,8 @@ EXTERN_C void hal_init_platform( constexpr auto cDummyInterrupt = 0x10; // 16 kSyscalls[cDummyInterrupt].Leak().Leak()->fProc = [](NewOS::VoidPtr sf) -> void { - const char* msg = (const char*)sf; - NewOS::kcout << "newoskrnl: " << msg << "\r"; + const char* msg = (const char*)sf; + NewOS::kcout << "newoskrnl: " << msg << "\r"; }; kSyscalls[cDummyInterrupt].Leak().Leak()->fHooked = true; @@ -93,5 +93,6 @@ EXTERN_C void hal_init_platform( NewOS::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_RsdPtr); while (true) - {} + { + } } diff --git a/Kernel/HALKit/AMD64/PCI/Iterator.cxx b/Kernel/HALKit/AMD64/PCI/Iterator.cxx index 297aa89c..d3167b46 100644 --- a/Kernel/HALKit/AMD64/PCI/Iterator.cxx +++ b/Kernel/HALKit/AMD64/PCI/Iterator.cxx @@ -7,7 +7,7 @@ #include #define PCI_ITERATOR_FIND_AND_UNWRAP(DEV, SZ) \ - if (DEV.Leak().Leak()) \ + if (DEV.Leak().Leak()) \ return *DEV.Leak().Leak(); namespace NewOS::PCI diff --git a/Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp b/Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp index 3217a660..f308b0b5 100644 --- a/Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp +++ b/Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp @@ -8,7 +8,7 @@ #include /// @brief Internal call for syscall, to work with C++. -/// @param stack +/// @param stack /// @return nothing. EXTERN_C void rt_syscall_handle(NewOS::HAL::StackFrame* stack) { diff --git a/Kernel/KernelKit/DriveManager.hxx b/Kernel/KernelKit/DriveManager.hxx index e78c350e..df7d5f28 100644 --- a/Kernel/KernelKit/DriveManager.hxx +++ b/Kernel/KernelKit/DriveManager.hxx @@ -14,10 +14,10 @@ #include #include -#define kDriveManagerCount (4U) +#define kDriveManagerCount (4U) -#define kDriveInvalidID (-1) -#define kDriveNameLen (32) +#define kDriveInvalidID (-1) +#define kDriveNameLen (32) namespace NewOS { diff --git a/Kernel/KernelKit/FileManager.hpp b/Kernel/KernelKit/FileManager.hpp index 71f3cfd0..b06b926e 100644 --- a/Kernel/KernelKit/FileManager.hpp +++ b/Kernel/KernelKit/FileManager.hpp @@ -134,7 +134,7 @@ namespace NewOS void SetDataFork(const char* forkName); /// @brief Get internal parser. - /// @return + /// @return NewFSParser* GetParser() noexcept; private: diff --git a/Kernel/KernelKit/Framebuffer.hpp b/Kernel/KernelKit/Framebuffer.hpp index 3437fed1..ebe983c8 100644 --- a/Kernel/KernelKit/Framebuffer.hpp +++ b/Kernel/KernelKit/Framebuffer.hpp @@ -39,7 +39,7 @@ namespace NewOS : fFrameBufferAddr(addr) { } - + ~Framebuffer() { } diff --git a/Kernel/KernelKit/KernelHeap.hpp b/Kernel/KernelKit/KernelHeap.hpp index 7b8cbc7c..6be94a63 100644 --- a/Kernel/KernelKit/KernelHeap.hpp +++ b/Kernel/KernelKit/KernelHeap.hpp @@ -37,8 +37,8 @@ namespace NewOS /// @return if it valid: point has crc now., otherwise fail. Boolean ke_protect_ke_heap(VoidPtr heapPtr); - /// @brief Makes a kernel heap page. - /// @param heapPtr - /// @return - Int32 ke_make_ke_page(VoidPtr heapPtr); + /// @brief Makes a kernel heap page. + /// @param heapPtr + /// @return + Int32 ke_make_ke_page(VoidPtr heapPtr); } // namespace NewOS diff --git a/Kernel/KernelKit/ProcessScheduler.hxx b/Kernel/KernelKit/ProcessScheduler.hxx index 1ac19053..637fc8c4 100644 --- a/Kernel/KernelKit/ProcessScheduler.hxx +++ b/Kernel/KernelKit/ProcessScheduler.hxx @@ -162,8 +162,8 @@ namespace NewOS enum { - kAppKind = 1, - kShLibKind = 2, + kAppKind = 1, + kShLibKind = 2, kKindCount, }; @@ -231,14 +231,14 @@ namespace NewOS /// The main class which you call to schedule an app. class ProcessScheduler final { - explicit ProcessScheduler() = default; + explicit ProcessScheduler() = default; public: ~ProcessScheduler() = default; NEWOS_COPY_DEFAULT(ProcessScheduler) - operator bool(); + operator bool(); bool operator!(); public: diff --git a/Kernel/KernelKit/SMPManager.hpp b/Kernel/KernelKit/SMPManager.hpp index ba706cf6..1840dd20 100644 --- a/Kernel/KernelKit/SMPManager.hpp +++ b/Kernel/KernelKit/SMPManager.hpp @@ -99,8 +99,8 @@ namespace NewOS public: Ref operator[](const SizeT& idx); - bool operator!() noexcept; - operator bool() noexcept; + bool operator!() noexcept; + operator bool() noexcept; public: /// @brief Shared instance of the SMP Manager. diff --git a/Kernel/KernelKit/XCOFF.hxx b/Kernel/KernelKit/XCOFF.hxx index 4574fcf7..0d74b3ef 100644 --- a/Kernel/KernelKit/XCOFF.hxx +++ b/Kernel/KernelKit/XCOFF.hxx @@ -16,7 +16,7 @@ #include -#define cXCOFF64Magic (0x01F7) +#define cXCOFF64Magic (0x01F7) #define cXCOFFRelFlg (0x0001) #define cXCOFFExecutable (0x0002) @@ -41,10 +41,11 @@ typedef struct XCoffFileHeader #define cForkNameLen (255) /// @brief This the executable manifest fork. -typedef struct XCoffForkHeader { - NewOS::Char fPropertiesXMLFork[cForkNameLen]; - NewOS::Char fDynamicLoaderFork[cForkNameLen]; - NewOS::Char fCodeSignFork[cForkNameLen]; +typedef struct XCoffForkHeader +{ + NewOS::Char fPropertiesXMLFork[cForkNameLen]; + NewOS::Char fDynamicLoaderFork[cForkNameLen]; + NewOS::Char fCodeSignFork[cForkNameLen]; } XCoffForkHeader; #endif // ifndef __XCOFF__ diff --git a/Kernel/NetworkKit/IPCEP.hxx b/Kernel/NetworkKit/IPCEP.hxx index a00fa98e..72efae73 100644 --- a/Kernel/NetworkKit/IPCEP.hxx +++ b/Kernel/NetworkKit/IPCEP.hxx @@ -50,8 +50,8 @@ namespace NewOS IPCEPAddressType IpcFrom; IPCEPAddressType IpcTo; UInt32 IpcCRC32; - UInt32 IpcMsg; - UInt32 IpcMsgSz; + UInt32 IpcMsg; + UInt32 IpcMsgSz; } PACKED IPCEPConnectionHeader; } // namespace NewOS diff --git a/Kernel/NewKit/Array.hpp b/Kernel/NewKit/Array.hpp index dca5c13f..b0b94584 100644 --- a/Kernel/NewKit/Array.hpp +++ b/Kernel/NewKit/Array.hpp @@ -26,7 +26,6 @@ namespace NewOS if (At > N) return {}; - kcout << "Returning element\r"; return ErrorOr(&fArray[At]); } diff --git a/Kernel/NewKit/MutableArray.hpp b/Kernel/NewKit/MutableArray.hpp index a3ad4cb1..6be9c15e 100644 --- a/Kernel/NewKit/MutableArray.hpp +++ b/Kernel/NewKit/MutableArray.hpp @@ -173,8 +173,8 @@ namespace NewOS if (!iterationNode) { - fFirstNode = new MutableLinkedList(); - iterationNode = fFirstNode; + fFirstNode = new MutableLinkedList(); + iterationNode = fFirstNode; } MUST_PASS(iterationNode); diff --git a/Kernel/Sources/HError.cxx b/Kernel/Sources/HError.cxx index 1f36d020..5ba02049 100644 --- a/Kernel/Sources/HError.cxx +++ b/Kernel/Sources/HError.cxx @@ -13,7 +13,7 @@ namespace NewOS /// @return if error-free: true, otherwise false. Boolean ke_bug_check(void) noexcept { - /// TODO: + /// TODO: return false; } } // namespace NewOS diff --git a/Kernel/Sources/KeMain.cxx b/Kernel/Sources/KeMain.cxx index 9be8a026..58c76dc4 100644 --- a/Kernel/Sources/KeMain.cxx +++ b/Kernel/Sources/KeMain.cxx @@ -68,7 +68,7 @@ namespace NewOS::Detail } catalogDir = fNewFS->GetParser()->CreateCatalog(cDirStr[dirIndx], 0, - kNewFSCatalogKindDir); + kNewFSCatalogKindDir); NewFork theFork{0}; @@ -157,8 +157,8 @@ namespace NewOS::Detail fNewFS->GetParser()->CreateFork(catalogDisk, theDiskFork); fNewFS->GetParser()->WriteCatalog(catalogDisk, - (NewOS::VoidPtr)diskFolder.CData(), - kNewFSSectorSz, cSrcName); + (NewOS::VoidPtr)diskFolder.CData(), + kNewFSSectorSz, cSrcName); delete catalogDisk; } diff --git a/Kernel/Sources/KernelHeap.cxx b/Kernel/Sources/KernelHeap.cxx index 00dfce8c..c3e8e86b 100644 --- a/Kernel/Sources/KernelHeap.cxx +++ b/Kernel/Sources/KernelHeap.cxx @@ -76,8 +76,8 @@ namespace NewOS } /// @brief Makes a page heap. - /// @param heapPtr - /// @return + /// @param heapPtr + /// @return Int32 ke_make_ke_page(VoidPtr heapPtr) { if (kHeapCount < 1) diff --git a/Kernel/Sources/SMPManager.cxx b/Kernel/Sources/SMPManager.cxx index 683343ff..5002e880 100644 --- a/Kernel/Sources/SMPManager.cxx +++ b/Kernel/Sources/SMPManager.cxx @@ -110,8 +110,8 @@ namespace NewOS fStack->R11 = stack->R11; fStack->R10 = stack->R10; - fStack->R9 = stack->R9; - fStack->R8 = stack->R8; + fStack->R9 = stack->R9; + fStack->R8 = stack->R8; fStack->Rcx = this->fID; } @@ -219,7 +219,7 @@ namespace NewOS if (!fakeThread) { - fakeThread = new HardwareThread(); + fakeThread = new HardwareThread(); } fakeThread->fKind = kInvalidHart; diff --git a/Kernel/Sources/UserHeap.cxx b/Kernel/Sources/UserHeap.cxx index ad3c4aa4..d1de13a6 100644 --- a/Kernel/Sources/UserHeap.cxx +++ b/Kernel/Sources/UserHeap.cxx @@ -37,8 +37,8 @@ namespace NewOS */ class UserHeapManager final { - UserHeapManager() = delete; - + UserHeapManager() = delete; + public: ~UserHeapManager() = default; @@ -47,12 +47,12 @@ namespace NewOS { return s_NumPools; } - + STATIC Ref& Leak() { return s_Pmm; } - + STATIC Boolean& IsEnabled() { return s_PoolsAreEnabled; diff --git a/Usr/Sys/CoreSystem/Headers/Defines.h b/Usr/Sys/CoreSystem/Headers/Defines.h index 2c04c3f1..f659fa76 100644 --- a/Usr/Sys/CoreSystem/Headers/Defines.h +++ b/Usr/Sys/CoreSystem/Headers/Defines.h @@ -11,12 +11,12 @@ #endif #ifdef _DEBUG -#define CS_MUST_PASS(e) \ - { \ - if (!e) \ - { \ +#define CS_MUST_PASS(e) \ + { \ + if (!e) \ + { \ UiAlert("Assertion failed.\nExpression :%s\nFile: %s\nLine: %i", #e, __FILE__, __LINE__) RtAssertTriggerInterrupt() \ - } \ + } \ } #else #define CS_MUST_PASS(e) CS_UNREFERENCED_PARAMETER(e) @@ -124,7 +124,7 @@ typedef CharacterTypeUTF8 BooleanType; #define CS_CONSTEXPR #endif // __cplusplus -enum +enum { kCallAllocPtr = 1, kCallFreePtr, @@ -173,8 +173,7 @@ typedef struct ApplicationInterface { VoidType (*Release)(struct ApplicationInterface* Self, DWordType ExitCode); IntPtrType (*Invoke)(struct ApplicationInterface* Self, DWordType Sel, ...); - VoidType (*Query)(struct ApplicationInterface* Self, PtrVoidType* Dst, - SizeType SzDst, struct GUID* GuidOf); + VoidType (*Query)(struct ApplicationInterface* Self, PtrVoidType* Dst, SizeType SzDst, struct GUID* GuidOf); } ApplicationInterface, *ApplicationInterfaceRef; #ifdef __cplusplus @@ -214,12 +213,12 @@ CS_EXTERN_C ApplicationInterfaceRef RtGetAppPointer(VoidType); /// @brief Get argument count /// @param /// @return -CS_EXTERN_C SizeType RtGetAppArgumentsCount(VoidType); +CS_EXTERN_C SizeType RtGetAppArgumentsCount(VoidType); /// @brief Get argument pointer. /// @param /// @return -CS_EXTERN_C CharacterTypeUTF8** RtGetAppArgumentsPtr(VoidType); +CS_EXTERN_C CharacterTypeUTF8** RtGetAppArgumentsPtr(VoidType); /// @brief Shared application interface. CS_EXTERN_C ApplicationInterfaceRef kSharedApplication; diff --git a/Usr/Sys/CoreSystem/Headers/File.h b/Usr/Sys/CoreSystem/Headers/File.h index 66bc6549..12dfb033 100644 --- a/Usr/Sys/CoreSystem/Headers/File.h +++ b/Usr/Sys/CoreSystem/Headers/File.h @@ -51,7 +51,7 @@ CS_EXTERN_C BooleanType CSIsValidPath(const CharacterTypeUTF8* path); /// @brief Flush file /// @param refCS the file reference. -/// @return +/// @return CS_EXTERN_C VoidType CSFlushFile(FSRef refCS); /// END OF FILE diff --git a/Usr/Sys/CoreSystem/Headers/Intl.h b/Usr/Sys/CoreSystem/Headers/Intl.h index c9eae306..afc7431c 100644 --- a/Usr/Sys/CoreSystem/Headers/Intl.h +++ b/Usr/Sys/CoreSystem/Headers/Intl.h @@ -14,12 +14,12 @@ typedef UInt64Type IntlRef; /// @brief Get app locale. /// @param name locale name. -/// @return -IntlRef IntlGetLocale(const char* name); +/// @return +IntlRef IntlGetLocale(const char* name); /// @brief Set app locale. /// @param intl the locale -/// @return +/// @return BooleanType IntlSetLocale(const IntlRef intl); /// @brief locale helpers. diff --git a/Usr/Sys/CoreSystem/Headers/Transport.h b/Usr/Sys/CoreSystem/Headers/Transport.h index 671621c8..996e69cc 100644 --- a/Usr/Sys/CoreSystem/Headers/Transport.h +++ b/Usr/Sys/CoreSystem/Headers/Transport.h @@ -28,19 +28,19 @@ CS_EXTERN_C CS_CONST TptStreamType CSOpenSocket(UInt32Type afType, UInt32Type so /// @brief Close a STREAMS socket. /// @param streams The streams socket. -/// @return +/// @return CS_EXTERN_C VoidType CSCloseSocket(CS_CONST TptStreamType streams); /// @brief Get OpenTransport version. /// @param void -/// @return +/// @return CS_EXTERN_C CS_CONST Int32Type CSGetVersion(VoidType); enum { TrSocketProtoTCP, /// TCP socket TrSocketProtoUDP, /// UDP socket - TrSocketProtoUN, /// IPC socket + TrSocketProtoUN, /// IPC socket TrSocketProtoRaw, /// Raw socket TrSocketProtoCount, }; diff --git a/Usr/Sys/CoreSystem/Sources/CRTStartup.c b/Usr/Sys/CoreSystem/Sources/CRTStartup.c index faefe9b7..2dc9b1c4 100644 --- a/Usr/Sys/CoreSystem/Sources/CRTStartup.c +++ b/Usr/Sys/CoreSystem/Sources/CRTStartup.c @@ -8,5 +8,5 @@ VoidType __DllMainCRTStartup(VoidType) { - kSharedApplication = RtGetAppPointer(); + kSharedApplication = RtGetAppPointer(); } \ No newline at end of file diff --git a/Usr/Sys/CoreSystem/Sources/File.c b/Usr/Sys/CoreSystem/Sources/File.c index 9f6b3b35..2e34d782 100644 --- a/Usr/Sys/CoreSystem/Sources/File.c +++ b/Usr/Sys/CoreSystem/Sources/File.c @@ -19,7 +19,7 @@ enum FileOp /// @brief Opens a new file. /// @param path where to find it. /// @param rest the restrict (rw, rwe, r+, w+, r, w) -/// @return FSRef the file. +/// @return FSRef file reference. CS_EXTERN_C FSRef CSOpenFile(const CharacterTypeUTF8* path, const CharacterTypeUTF8* rest) { @@ -33,7 +33,7 @@ CS_EXTERN_C FSRef CSOpenFile(const CharacterTypeUTF8* path, /// @brief Closes the file and flushes it to the said file. /// @param refCS the filesystem reference. -/// @return +/// @return void CS_EXTERN_C VoidType CSCloseFile(FSRef refCS) { CS_MUST_PASS(kSharedApplication); @@ -45,7 +45,7 @@ CS_EXTERN_C VoidType CSCloseFile(FSRef refCS) /// @brief Flush file /// @param refCS the file reference. -/// @return +/// @return void CS_EXTERN_C VoidType CSFlushFile(FSRef refCS) { CS_MUST_PASS(kSharedApplication); @@ -54,16 +54,16 @@ CS_EXTERN_C VoidType CSFlushFile(FSRef refCS) } /// @brief Check if filesystem path is valid. -/// @param path -/// @return +/// @param path the filesystem path. +/// @return if the path is valid or not. CS_EXTERN_C BooleanType CSIsValidPath(const CharacterTypeUTF8* path) { CS_MUST_PASS(kSharedApplication); CS_MUST_PASS(path); return kSharedApplication->Invoke(kSharedApplication, kCallFileExists, path) || - kSharedApplication->Invoke(kSharedApplication, kCallDirectoryExists, path) || - kSharedApplication->Invoke(kSharedApplication, kCallSymlinkExists, path) || - kSharedApplication->Invoke(kSharedApplication, kCallDriveExists, path) || - kSharedApplication->Invoke(kSharedApplication, kCallDeviceExists, path); + kSharedApplication->Invoke(kSharedApplication, kCallDirectoryExists, path) || + kSharedApplication->Invoke(kSharedApplication, kCallSymlinkExists, path) || + kSharedApplication->Invoke(kSharedApplication, kCallDriveExists, path) || + kSharedApplication->Invoke(kSharedApplication, kCallDeviceExists, path); } \ No newline at end of file -- cgit v1.2.3 From dd7b72379108c10cd68853d2a8a0332784ebb8cb Mon Sep 17 00:00:00 2001 From: Amlal EL Mahrouss Date: Fri, 14 Jun 2024 09:58:11 +0200 Subject: Kernel: Scheduler: ProcessHeader::New: do not get the pointer before allocating it! Kernel: HAL: AMD64: Two things. - Switching to an ARM HAL for our Zeta platform. - Fix return register when sending acknowledge on APIC, which was using the 32-bit eax instead of rax. Kernel: Boot: Update uname for Windows. Kernel: GDT: move as global (HalKenelMain.cxx) Signed-off-by: Amlal EL Mahrouss --- Boot/makefile | 6 +++-- Kernel/HALKit/AMD64/HalInterruptAPI.asm | 4 +-- Kernel/HALKit/AMD64/HalKernelMain.cxx | 37 +++++++++++++-------------- Kernel/Sources/KeMain.cxx | 11 ++++++-- Kernel/Sources/ProcessScheduler.cxx | 45 ++++++++++++++++++--------------- 5 files changed, 56 insertions(+), 47 deletions(-) (limited to 'Kernel/Sources') diff --git a/Boot/makefile b/Boot/makefile index e54b1aa8..98726bbe 100644 --- a/Boot/makefile +++ b/Boot/makefile @@ -12,10 +12,12 @@ ADD_FILE=touch COPY=cp HTTP_GET=wget -ifneq ($(shell uname), Windows_NT) +# Select this for UNIX distributions +ifneq ($(shell uname), CYGWIN_NT-10.0-19045) EMU=qemu-system-x86_64 else -EMU=qemu-system-x86_64w +# this for NT distributions +EMU=qemu-system-x86_64w.exe endif ifeq ($(NEWS_MODEL), ) diff --git a/Kernel/HALKit/AMD64/HalInterruptAPI.asm b/Kernel/HALKit/AMD64/HalInterruptAPI.asm index 150cfc10..4832ecf3 100644 --- a/Kernel/HALKit/AMD64/HalInterruptAPI.asm +++ b/Kernel/HALKit/AMD64/HalInterruptAPI.asm @@ -157,10 +157,10 @@ __NEW_INT_32: pop rcx pop rax - mov eax, 0 + mov rax, 0 ;; tell there local apic that we're done. - mov dword [0xFEE00000 + 0xB0], eax ; LAPIC_EOI + mov [0xFEE00000 + 0xB0], rax ; LAPIC_EOI iretq diff --git a/Kernel/HALKit/AMD64/HalKernelMain.cxx b/Kernel/HALKit/AMD64/HalKernelMain.cxx index 9b605e1a..cafa6388 100644 --- a/Kernel/HALKit/AMD64/HalKernelMain.cxx +++ b/Kernel/HALKit/AMD64/HalKernelMain.cxx @@ -28,9 +28,21 @@ namespace NewOS::HAL extern void hal_system_get_cores(NewOS::voidPtr rsdPtr); } // namespace NewOS::HAL +/* GDT constant. */ +STATIC NewOS::HAL::Detail::NewOSGDT cGdt = { + {0, 0, 0, 0x00, 0x00, 0}, // null entry + {0, 0, 0, 0x9a, 0xaf, 0}, // kernel code + {0, 0, 0, 0x92, 0xaf, 0}, // kernel data + {0, 0, 0, 0x00, 0x00, 0}, // null entry + {0, 0, 0, 0x9a, 0xaf, 0}, // user code + {0, 0, 0, 0x92, 0xaf, 0}, // user data +}; + EXTERN_C void hal_init_platform( NewOS::HEL::HandoverInformationHeader* HandoverHeader) { + /* Setup globals. */ + kHandoverHeader = HandoverHeader; if (kHandoverHeader->f_Magic != kHandoverMagic && @@ -39,29 +51,17 @@ EXTERN_C void hal_init_platform( return; } - /// Setup kernel globals. kKernelVirtualSize = HandoverHeader->f_VirtualSize; kKernelVirtualStart = reinterpret_cast( reinterpret_cast(HandoverHeader->f_VirtualStart) + kVirtualAddressStartOffset); kKernelPhysicalStart = HandoverHeader->f_PhysicalStart; - STATIC NewOS::HAL::Detail::NewOSGDT GDT = { - {0, 0, 0, 0x00, 0x00, 0}, // null entry - {0, 0, 0, 0x9a, 0xaf, 0}, // kernel code - {0, 0, 0, 0x92, 0xaf, 0}, // kernel data - {0, 0, 0, 0x00, 0x00, 0}, // null entry - {0, 0, 0, 0x9a, 0xaf, 0}, // user code - {0, 0, 0, 0x92, 0xaf, 0}, // user data - }; - NewOS::HAL::RegisterGDT gdtBase; - gdtBase.Base = reinterpret_cast(&GDT); + gdtBase.Base = reinterpret_cast(&cGdt); gdtBase.Limit = sizeof(NewOS::HAL::Detail::NewOSGDT) - 1; - /// Load GDT. - NewOS::HAL::GDTLoader gdt; gdt.Load(gdtBase); @@ -74,7 +74,7 @@ EXTERN_C void hal_init_platform( NewOS::HAL::IDTLoader idt; idt.Load(idtBase); - /// START POST + /* install basic hooks. */ constexpr auto cDummyInterrupt = 0x10; // 16 @@ -87,12 +87,9 @@ EXTERN_C void hal_init_platform( NewOS::HAL::Detail::_ke_power_on_self_test(); - auto cLoaderName = "LaunchDevil"; - NewOS::execute_from_image(KeMain, cLoaderName); + /* Call generic kernel entrypoint. */ - NewOS::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_RsdPtr); + KeMain(); - while (true) - { - } + NewOS::ke_stop(RUNTIME_CHECK_BOOTSTRAP); } diff --git a/Kernel/Sources/KeMain.cxx b/Kernel/Sources/KeMain.cxx index 58c76dc4..23e32c1d 100644 --- a/Kernel/Sources/KeMain.cxx +++ b/Kernel/Sources/KeMain.cxx @@ -203,8 +203,6 @@ namespace NewOS::Detail NewOS::Utils::execute_from_image(stageBoard, NewOS::ProcessHeader::kAppKind); - - /// TODO: now jump to user mode using the HAL. } } // namespace NewOS::Detail @@ -217,4 +215,13 @@ EXTERN_C NewOS::Void KeMain(NewOS::Void) NewOS::Detail::FilesystemWizard wizard; // automatic. NewOS::Detail::SystemLauncher_Main(); + + // fetch system cores. + NewOS::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_RsdPtr); + + while (true) + { + // start scheduling. + NewOS::ProcessHelper::StartScheduling(); + } } diff --git a/Kernel/Sources/ProcessScheduler.cxx b/Kernel/Sources/ProcessScheduler.cxx index d9d013c6..dc273cf6 100644 --- a/Kernel/Sources/ProcessScheduler.cxx +++ b/Kernel/Sources/ProcessScheduler.cxx @@ -59,18 +59,20 @@ namespace NewOS VoidPtr ProcessHeader::New(const SizeT& sz) { - if (this->FreeMemory < 1) + if (this->HeapCursor) { - DbgLastError() = kErrorHeapOutOfMemory; - this->Crash(); /// out of memory. + if (this->FreeMemory < 1) + { + DbgLastError() = kErrorHeapOutOfMemory; + + /* we're going out of memory */ + this->Crash(); - return nullptr; - } + return nullptr; + } - if (this->HeapCursor) - { - VoidPtr ptr = this->HeapCursor; this->HeapCursor = (VoidPtr)((UIntPtr)this->HeapCursor + (sizeof(sz))); + VoidPtr ptr = this->HeapCursor; ++this->UsedMemory; --this->FreeMemory; @@ -206,12 +208,14 @@ namespace NewOS ke_new_ke_heap(sizeof(HAL::StackFrame), true, false)); MUST_PASS(process.Leak().StackFrame); + + process.Leak().Status = ProcessStatus::kRunning; - mTeam.AsArray().Add(process); - - process.Leak().ProcessId = mTeam.AsArray().Count() - 1; + process.Leak().ProcessId = (mTeam.AsArray().Count() - 1); process.Leak().HeapCursor = process.Leak().HeapPtr; + mTeam.AsArray().Add(process); + return mTeam.AsArray().Count() - 1; } @@ -232,17 +236,14 @@ namespace NewOS /// @return SizeT ProcessScheduler::Run() noexcept { - SizeT processIndex = 0; //! we store this guy to tell the scheduler how many + SizeT process_index = 0; //! we store this guy to tell the scheduler how many //! things we have scheduled. - for (; processIndex < mTeam.AsArray().Count(); ++processIndex) + for (; process_index < mTeam.AsArray().Count(); ++process_index) { - auto process = mTeam.AsArray()[processIndex]; - - if (!process) - continue; + auto process = mTeam.AsArray()[process_index]; - //! run any process needed to be scheduled. + //! check if process needs to be scheduled. if (ProcessHelper::CanBeScheduled(process.Leak())) { auto unwrapped_process = *process.Leak(); @@ -255,6 +256,8 @@ namespace NewOS // tell helper to find a core to schedule on. ProcessHelper::Switch(mTeam.AsRef().Leak().StackFrame, mTeam.AsRef().Leak().ProcessId); + + kcout << unwrapped_process.Name << ": process switched.\r"; } else { @@ -263,7 +266,7 @@ namespace NewOS } } - return processIndex; + return process_index; } /// @brief Gets the current scheduled team. @@ -328,8 +331,8 @@ namespace NewOS bool ProcessHelper::StartScheduling() { - auto& processRef = ProcessScheduler::The().Leak(); - SizeT ret = processRef.Run(); + auto& process_ref = ProcessScheduler::The().Leak(); + SizeT ret = process_ref.Run(); kcout << "newoskrnl: Iterated over: "; kcout.Number(ret); -- cgit v1.2.3 From f05b598a1c1a8ca4f1bf0acca078f9c9e3c07991 Mon Sep 17 00:00:00 2001 From: Amlal EL Mahrouss Date: Sat, 15 Jun 2024 13:49:07 +0200 Subject: kernel: include assembly files as well in project. Signed-off-by: Amlal EL Mahrouss --- Kernel/CFKit/Property.hpp | 20 +++++++++----------- Kernel/FSKit/IndexableProperty.hxx | 5 +++-- Kernel/KernelKit/ProcessScheduler.hxx | 2 +- Kernel/Sources/IndexableProperty.cxx | 12 +++++++----- Kernel/Sources/KeMain.cxx | 10 +++++----- Kernel/Sources/ProcessScheduler.cxx | 8 ++------ Kernel/Sources/Property.cxx | 8 ++++++++ newoskrnl.10x | 2 +- 8 files changed, 36 insertions(+), 31 deletions(-) (limited to 'Kernel/Sources') diff --git a/Kernel/CFKit/Property.hpp b/Kernel/CFKit/Property.hpp index 7667194f..5c5aeb8f 100644 --- a/Kernel/CFKit/Property.hpp +++ b/Kernel/CFKit/Property.hpp @@ -4,8 +4,8 @@ ------------------------------------------- */ -#ifndef _INC_PLIST_HPP__ -#define _INC_PLIST_HPP__ +#ifndef __INC_PLIST_HPP__ +#define __INC_PLIST_HPP__ #include #include @@ -14,18 +14,16 @@ namespace NewOS { - using PropertyId = Int; + /// @brief handle to anything (number, ptr, string...) + using PropertyId = UIntPtr; /// @brief Kernel property class. + /// @example \Properties\SmpCores or \Properties\KernelVersion class Property { public: - explicit Property(const StringView& sw) - : fName(sw) - { - } - - virtual ~Property() = default; + explicit Property(const StringView& sw); + virtual ~Property(); public: Property& operator=(const Property&) = default; @@ -39,8 +37,8 @@ namespace NewOS PropertyId fAction; }; - template + template using PropertyArray = Array; } // namespace NewOS -#endif // !_INC_PLIST_HPP__ +#endif // !__INC_PLIST_HPP__ diff --git a/Kernel/FSKit/IndexableProperty.hxx b/Kernel/FSKit/IndexableProperty.hxx index 91b90903..892083a2 100644 --- a/Kernel/FSKit/IndexableProperty.hxx +++ b/Kernel/FSKit/IndexableProperty.hxx @@ -24,11 +24,12 @@ namespace NewOS Char Path[kIndexerNodeNameLength]; }; + class IndexableProperty final : public Property { public: explicit IndexableProperty() - : Property(StringBuilder::Construct("Indexable").Leak().Leak()) + : Property(StringBuilder::Construct("\\Filesystem\\IsIndexable?").Leak().Leak()) { } @@ -37,7 +38,7 @@ namespace NewOS NEWOS_COPY_DEFAULT(IndexableProperty); public: - IndexProperty& LeakProperty() noexcept; + IndexProperty& Leak() noexcept; public: void AddFlag(Int16 flag); diff --git a/Kernel/KernelKit/ProcessScheduler.hxx b/Kernel/KernelKit/ProcessScheduler.hxx index 637fc8c4..f49292f1 100644 --- a/Kernel/KernelKit/ProcessScheduler.hxx +++ b/Kernel/KernelKit/ProcessScheduler.hxx @@ -269,7 +269,7 @@ namespace NewOS static bool Switch(HAL::StackFrame* newStack, const PID& newPid); static bool CanBeScheduled(Ref& process); static PID& GetCurrentPID(); - static bool StartScheduling(); + static SizeT StartScheduling(); }; const Int32& rt_get_exit_code() noexcept; diff --git a/Kernel/Sources/IndexableProperty.cxx b/Kernel/Sources/IndexableProperty.cxx index a687e0ec..457e2c53 100644 --- a/Kernel/Sources/IndexableProperty.cxx +++ b/Kernel/Sources/IndexableProperty.cxx @@ -20,19 +20,21 @@ namespace NewOS { namespace Indexer { - IndexProperty& IndexableProperty::LeakProperty() noexcept + IndexProperty& IndexableProperty::Leak() noexcept { return fIndex; } - void IndexableProperty::AddFlag(Int16 flag) + Void IndexableProperty::AddFlag(Int16 flag) { fFlags |= flag; } - void IndexableProperty::RemoveFlag(Int16 flag) + + Void IndexableProperty::RemoveFlag(Int16 flag) { fFlags &= flag; } + Int16 IndexableProperty::HasFlag(Int16 flag) { return fFlags & flag; @@ -48,9 +50,9 @@ namespace NewOS if (!indexer.HasFlag(kIndexerClaimed)) { indexer.AddFlag(kIndexerClaimed); - rt_copy_memory((VoidPtr)indexer.LeakProperty().Path, (VoidPtr)filename, filenameLen); + rt_copy_memory((VoidPtr)indexer.Leak().Path, (VoidPtr)filename, filenameLen); - kcout << "newoskrnl: FSKit: index new file: " << filename << endl; + kcout << "newoskrnl: filesystem: index new file: " << filename << endl; } } } // namespace Indexer diff --git a/Kernel/Sources/KeMain.cxx b/Kernel/Sources/KeMain.cxx index 23e32c1d..e1b347b8 100644 --- a/Kernel/Sources/KeMain.cxx +++ b/Kernel/Sources/KeMain.cxx @@ -182,9 +182,9 @@ namespace NewOS::Detail /// @brief System loader entrypoint. /// @param void no parameters. /// @return void no return value. - STATIC NewOS::Void SystemLauncher_Main(NewOS::Void) + STATIC NewOS::Void ke_launch_srv(NewOS::Void) { - NewOS::PEFLoader lockScreen("\\System\\LockScreen"); + NewOS::PEFLoader lockScreen("\\System\\securesrv.exe"); if (!lockScreen.IsLoaded()) { @@ -194,7 +194,7 @@ namespace NewOS::Detail NewOS::Utils::execute_from_image(lockScreen, NewOS::ProcessHeader::kAppKind); - NewOS::PEFLoader stageBoard("\\System\\StageBoard"); + NewOS::PEFLoader stageBoard("\\System\\uisrv.exe"); if (!stageBoard.IsLoaded()) { @@ -212,9 +212,9 @@ namespace NewOS::Detail EXTERN_C NewOS::Void KeMain(NewOS::Void) { /// Now run kernel loop, until no process are running. - NewOS::Detail::FilesystemWizard wizard; // automatic. + NewOS::Detail::FilesystemWizard wizard; // automatic filesystem creation. - NewOS::Detail::SystemLauncher_Main(); + NewOS::Detail::ke_launch_srv(); // fetch system cores. NewOS::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_RsdPtr); diff --git a/Kernel/Sources/ProcessScheduler.cxx b/Kernel/Sources/ProcessScheduler.cxx index dc273cf6..d232c72e 100644 --- a/Kernel/Sources/ProcessScheduler.cxx +++ b/Kernel/Sources/ProcessScheduler.cxx @@ -329,16 +329,12 @@ namespace NewOS * @brief Spin scheduler class. */ - bool ProcessHelper::StartScheduling() + SizeT ProcessHelper::StartScheduling() { auto& process_ref = ProcessScheduler::The().Leak(); SizeT ret = process_ref.Run(); - kcout << "newoskrnl: Iterated over: "; - kcout.Number(ret); - kcout << " processes.\r"; - - return true; + return ret; } /** diff --git a/Kernel/Sources/Property.cxx b/Kernel/Sources/Property.cxx index dca34429..b58de469 100644 --- a/Kernel/Sources/Property.cxx +++ b/Kernel/Sources/Property.cxx @@ -8,6 +8,14 @@ namespace NewOS { + Property::Property(const StringView& sw) + : fName(sw) + { + kcout << "Property: created: " << sw.CData() << endl; + } + + Property::~Property() = default; + bool Property::StringEquals(StringView& name) { return fName && this->fName == name; diff --git a/newoskrnl.10x b/newoskrnl.10x index d232f112..4d9241c7 100644 --- a/newoskrnl.10x +++ b/newoskrnl.10x @@ -1,7 +1,7 @@ - *.c,*.cc,*.cpp,*.c++,*.cp,*.cxx,*.h,*.hh,*.hpp,*.h++,*.hp,*.hxx,*.inl,*.cs,*.rs,*.java,*.jav,*.js,*.jsc,*.jsx,*.json,*.cls,*.py,*.rpy,*.php,*.php3,*.phl,*.phtml,*.rhtml,*.tpl,*.phps,*.lua,*.html,*.html5,*.htm,*.xml,*.xaml,*.css,*.ssi,*.haml,*.yaml,*.bat,*.wbf,*.wbt,*.txt,*.cmake,*.make,*.makefile,*.mak,*.mk,*.sh,*.bash,*.csv,*.asp,*.pl,*.mac,*.ws,*.vbs,*.perl,*.src,*.rss,*.inc,*.f,*.go,*.prl,*.plx,*.rb,*.lsp,*.lpx,*.ps1,*.command,*.cbl,*.cob,*.qs,*.wxs,*.ph,*.msc,*.glsl,*.hlsl,*.fx,*.vert,*.tesc,*.tese,*.geom,*.frag,*.comp,*.pssl,*.scons,*.cu,*.jai, + *.s,*.asm,*.S,*.c,*.cc,*.cpp,*.c++,*.cp,*.cxx,*.h,*.hh,*.hpp,*.h++,*.hp,*.hxx,*.inl,*.cs,*.rs,*.java,*.jav,*.js,*.jsc,*.jsx,*.json,*.cls,*.py,*.rpy,*.php,*.php3,*.phl,*.phtml,*.rhtml,*.tpl,*.phps,*.lua,*.html,*.html5,*.htm,*.xml,*.xaml,*.css,*.ssi,*.haml,*.yaml,*.bat,*.wbf,*.wbt,*.txt,*.cmake,*.make,*.makefile,*.mak,*.mk,*.sh,*.bash,*.csv,*.asp,*.pl,*.mac,*.ws,*.vbs,*.perl,*.src,*.rss,*.inc,*.f,*.go,*.prl,*.plx,*.rb,*.lsp,*.lpx,*.ps1,*.command,*.cbl,*.cob,*.qs,*.wxs,*.ph,*.msc,*.glsl,*.hlsl,*.fx,*.vert,*.tesc,*.tese,*.geom,*.frag,*.comp,*.pssl,*.scons,*.cu,*.jai, true true -- cgit v1.2.3 From 84aea90cff9952dbafcf147b7741c1985622a8d2 Mon Sep 17 00:00:00 2001 From: Amlal EL Mahrouss Date: Sun, 16 Jun 2024 00:25:47 +0200 Subject: MHR-31: Add cHartIpi enum, improve ReadMe and fix FilesystemWizard. Signed-off-by: Amlal EL Mahrouss --- Kernel/Builtins/ReadMe.txt | 8 ++++---- Kernel/HALKit/ARM64/Hart.hxx | 10 +++++++++- Kernel/Sources/KeMain.cxx | 42 +++++++++++++++++++++--------------------- 3 files changed, 34 insertions(+), 26 deletions(-) (limited to 'Kernel/Sources') diff --git a/Kernel/Builtins/ReadMe.txt b/Kernel/Builtins/ReadMe.txt index b0a5a327..df63e0be 100644 --- a/Kernel/Builtins/ReadMe.txt +++ b/Kernel/Builtins/ReadMe.txt @@ -6,14 +6,14 @@ NewOS Builtins What are these? =============== -These are NewOS builtins device drivers. +These are like modules for the kernel. =================== Maintainers/Authors =================== -ACPIFactoryInterface: Amlal EL Mahrouss. +ACPI: Amlal EL Mahrouss. AHCI: Amlal EL Mahrouss. GX: Amlal EL Mahrouss. -PS2: Amlal EL Mahrouss -ATA: Amlal EL Mahrouss \ No newline at end of file +PS2: Amlal EL Mahrouss. +ATA: Amlal EL Mahrouss. \ No newline at end of file diff --git a/Kernel/HALKit/ARM64/Hart.hxx b/Kernel/HALKit/ARM64/Hart.hxx index bc35c3f5..1b16a072 100644 --- a/Kernel/HALKit/ARM64/Hart.hxx +++ b/Kernel/HALKit/ARM64/Hart.hxx @@ -17,4 +17,12 @@ typedef NewOS::Int32 Arm64HartType; /// @param hart the hart /// @param epc the pc. /// @return -EXTERN_C NewOS::Void hal_switch_to_hart(Arm64HartType hart, NewOS::VoidPtr epc); \ No newline at end of file +EXTERN_C NewOS::Void hal_switch_to_hart(Arm64HartType hart, NewOS::VoidPtr epc); + +/// @brief Hart IPI enum +enum { + cHartIpiTurnOn, + cHartIpiTurnOff, + cHartIpiStop, + cHartIpiResume, +}; diff --git a/Kernel/Sources/KeMain.cxx b/Kernel/Sources/KeMain.cxx index e1b347b8..83702d77 100644 --- a/Kernel/Sources/KeMain.cxx +++ b/Kernel/Sources/KeMain.cxx @@ -33,6 +33,7 @@ namespace NewOS::Detail NewOS::NewFilesystemManager* fNewFS{nullptr}; public: + /// @brief wizard constructor. explicit FilesystemWizard() { if (NewOS::FilesystemManagerInterface::GetMounted()) @@ -54,7 +55,7 @@ namespace NewOS::Detail constexpr auto cFolderInfo = "META-INF"; const auto cDirCount = 8; const char* cDirStr[cDirCount] = { - "\\Boot\\", "\\System\\", "\\Support\\", "\\Applications\\", + "\\Boot\\", "\\System\\", "\\Support\\", "\\Packages\\", "\\Users\\", "\\Library\\", "\\Mount\\", "\\DCIM\\"}; for (NewOS::SizeT dirIndx = 0UL; dirIndx < cDirCount; ++dirIndx) @@ -92,9 +93,9 @@ namespace NewOS::Detail metadataFolder += "

Kind: folder

\r

Created by: system

\r

Edited by: " - "system

\r

Volume Type: New OS Standard

\r"; + "system

\r

Volume Type: s10 Filesystem

\r"; - metadataFolder += "

File name: "; + metadataFolder += "

Path: "; metadataFolder += cDirStr[dirIndx]; metadataFolder += "

\r"; @@ -113,7 +114,7 @@ namespace NewOS::Detail } NewCatalog* catalogDisk = - this->fNewFS->GetParser()->GetCatalog("\\Mount\\This Disk"); + this->fNewFS->GetParser()->GetCatalog("\\Mount\\C:\\"); const NewOS::Char* cSrcName = "DISK-INF"; @@ -128,16 +129,16 @@ namespace NewOS::Detail else { catalogDisk = - (NewCatalog*)this->Leak()->CreateAlias("\\Mount\\This Disk"); + (NewCatalog*)this->Leak()->CreateAlias("\\Mount\\C:\\"); NewOS::StringView diskFolder(kNewFSSectorSz); diskFolder += - "

Kind: alias to disk

\r

Created by: newoskrnl

\r

Edited " + "

Kind: alias to disk

\r

Created by: system

\r

Edited " "by: " - "N/A

\r

Volume Type: New OS Standard

\r"; + "system

\r

Volume Type: s10 Filesystem

\r"; - diskFolder += "

Original Path: "; + diskFolder += "

Root: "; diskFolder += NewOS::NewFilesystemHelper::Root(); diskFolder += "

\r"; @@ -165,43 +166,41 @@ namespace NewOS::Detail } } - ~FilesystemWizard() - { - delete fNewFS; - } + ~FilesystemWizard() = default; NEWOS_COPY_DEFAULT(FilesystemWizard); - /// Grab the disk's NewFS reference. + /// @brief Grab the disk's NewFS reference. + /// @return NewFilesystemManager the filesystem interface NewOS::NewFilesystemManager* Leak() { return fNewFS; } }; - /// @brief System loader entrypoint. + /// @brief Loads necessary servers for the OS to work. /// @param void no parameters. /// @return void no return value. STATIC NewOS::Void ke_launch_srv(NewOS::Void) { - NewOS::PEFLoader lockScreen("\\System\\securesrv.exe"); + NewOS::PEFLoader secureSrv("\\System\\securesrv.exe"); - if (!lockScreen.IsLoaded()) + if (!secureSrv.IsLoaded()) { NewOS::ke_stop(RUNTIME_CHECK_FAILED); } - NewOS::Utils::execute_from_image(lockScreen, + NewOS::Utils::execute_from_image(secureSrv, NewOS::ProcessHeader::kAppKind); - NewOS::PEFLoader stageBoard("\\System\\uisrv.exe"); + NewOS::PEFLoader uiSrv("\\System\\uisrv.exe"); - if (!stageBoard.IsLoaded()) + if (!uiSrv.IsLoaded()) { NewOS::ke_stop(RUNTIME_CHECK_FAILED); } - NewOS::Utils::execute_from_image(stageBoard, + NewOS::Utils::execute_from_image(uiSrv, NewOS::ProcessHeader::kAppKind); } } // namespace NewOS::Detail @@ -219,7 +218,8 @@ EXTERN_C NewOS::Void KeMain(NewOS::Void) // fetch system cores. NewOS::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_RsdPtr); - while (true) + // spin forever. + while (Yes) { // start scheduling. NewOS::ProcessHelper::StartScheduling(); -- cgit v1.2.3 From 684197d4bcb66e94c1dbf37591ed2a984792e51d Mon Sep 17 00:00:00 2001 From: Amlal EL Mahrouss Date: Sun, 16 Jun 2024 12:32:15 +0200 Subject: MHR-31: Add ARM64 executable type for newoskrnl's PEF implementation. Signed-off-by: Amlal EL Mahrouss --- Boot/makefile | 2 +- Kernel/KernelKit/PEF.hpp | 1 + Kernel/NewKit/Defines.hpp | 6 ------ Kernel/NewKit/String.hpp | 2 +- Kernel/Sources/FileManager.cxx | 4 ++-- Kernel/Sources/String.cxx | 2 +- Kernel/makefile | 2 +- 7 files changed, 7 insertions(+), 12 deletions(-) (limited to 'Kernel/Sources') diff --git a/Boot/makefile b/Boot/makefile index 98726bbe..37ac3704 100644 --- a/Boot/makefile +++ b/Boot/makefile @@ -28,7 +28,7 @@ BIOS=OVMF.fd IMG=epm.img IMG_2=epm-slave.img -EMU_FLAGS=-net none -smp 4 -m 4G -M q35 \ +EMU_FLAGS=-net none -smp 4 -m 4G -M q35 -d int \ -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/Kernel/KernelKit/PEF.hpp b/Kernel/KernelKit/PEF.hpp index 0713e7c5..005c7673 100644 --- a/Kernel/KernelKit/PEF.hpp +++ b/Kernel/KernelKit/PEF.hpp @@ -36,6 +36,7 @@ namespace NewOS kPefArch64x0, /* 64x0. ISA */ kPefArch32x0, /* 32x0. ISA */ kPefArchPowerPC, + kPefArchARM64, kPefArchCount = (kPefArchPowerPC - kPefArchIntel86S) + 1, kPefArchInvalid = 0xFF, }; diff --git a/Kernel/NewKit/Defines.hpp b/Kernel/NewKit/Defines.hpp index 96f13fd9..3210f1ef 100644 --- a/Kernel/NewKit/Defines.hpp +++ b/Kernel/NewKit/Defines.hpp @@ -133,12 +133,6 @@ namespace NewOS }; } // namespace NewOS -/// @note this is for the purpose of having a common namespace alongside zeta's codebase. -namespace ma::zeta::kernel -{ - using namespace NewOS; -} - #define DEDUCE_ENDIAN(address, value) \ (((reinterpret_cast(address)[0]) == (value)) \ ? (NewOS::Endian::kEndianBig) \ diff --git a/Kernel/NewKit/String.hpp b/Kernel/NewKit/String.hpp index 644a1394..14286ca0 100644 --- a/Kernel/NewKit/String.hpp +++ b/Kernel/NewKit/String.hpp @@ -35,7 +35,7 @@ namespace NewOS StringView(const StringView&) = default; Char* Data(); - const Char* CData(); + const Char* CData() const; Size Length() const; bool operator==(const Char* rhs) const; diff --git a/Kernel/Sources/FileManager.cxx b/Kernel/Sources/FileManager.cxx index 6e61a65d..ee285ae1 100644 --- a/Kernel/Sources/FileManager.cxx +++ b/Kernel/Sources/FileManager.cxx @@ -90,7 +90,7 @@ namespace NewOS NEWOS_UNUSED(flags); - auto dataForkName = "FileData"; + auto dataForkName = kNewFSDataFork; if ((reinterpret_cast(node))->Kind == kNewFSCatalogKindFile) fImpl->WriteCatalog(reinterpret_cast(node), data, size, @@ -112,7 +112,7 @@ namespace NewOS NEWOS_UNUSED(flags); - auto dataForkName = "FileData"; + auto dataForkName = kNewFSDataFork; if ((reinterpret_cast(node))->Kind == kNewFSCatalogKindFile) return fImpl->ReadCatalog(reinterpret_cast(node), sz, diff --git a/Kernel/Sources/String.cxx b/Kernel/Sources/String.cxx index 08ca1036..fab12226 100644 --- a/Kernel/Sources/String.cxx +++ b/Kernel/Sources/String.cxx @@ -15,7 +15,7 @@ namespace NewOS return fData; } - const Char* StringView::CData() + const Char* StringView::CData() const { return fData; } diff --git a/Kernel/makefile b/Kernel/makefile index 16a36013..1f749323 100644 --- a/Kernel/makefile +++ b/Kernel/makefile @@ -25,7 +25,7 @@ ifneq ($(AHCI_SUPPORT), ) DISKDRIVER = -D__AHCI__ endif -ifeq ($(RELEASE_SUPPORT), ) +ifneq ($(DEBUG_SUPPORT), ) DEBUG = -D__DEBUG__ endif -- cgit v1.2.3 From 8051ad2bd4af1f226a9751288957ee6af7e787d7 Mon Sep 17 00:00:00 2001 From: Amlal EL Mahrouss Date: Mon, 17 Jun 2024 18:55:38 +0200 Subject: MHR-31: IMP: Add setter for Name. Signed-off-by: Amlal EL Mahrouss --- Drv/GSMDrv/GSMDrv.c | 6 ++++-- Drv/VideoDrv/VideoDrv.c | 4 ++-- Kernel/NetworkKit/NetworkDevice.hpp | 9 +++++++-- Kernel/Sources/Network/NetworkDevice.cxx | 20 +++++++++++++++++++- 4 files changed, 32 insertions(+), 7 deletions(-) (limited to 'Kernel/Sources') diff --git a/Drv/GSMDrv/GSMDrv.c b/Drv/GSMDrv/GSMDrv.c index 791c0678..1b7cfed6 100644 --- a/Drv/GSMDrv/GSMDrv.c +++ b/Drv/GSMDrv/GSMDrv.c @@ -7,7 +7,8 @@ #include #include -int __ImageStart(void) +/// @brief GSM entrypoint. +int __at_enter(void) { kernelPrintStr("GSMDrv: Starting up...\r"); @@ -16,7 +17,8 @@ int __ImageStart(void) return 0; } -int __ImageEnd(void) +/// @brief GSM 'atexit' function. +int __at_exit(void) { kernelPrintStr("GSMDrv: Shutting down...\r"); return 0; diff --git a/Drv/VideoDrv/VideoDrv.c b/Drv/VideoDrv/VideoDrv.c index 3ba104d6..fc79d2a0 100644 --- a/Drv/VideoDrv/VideoDrv.c +++ b/Drv/VideoDrv/VideoDrv.c @@ -9,13 +9,13 @@ #include -int __ImageStart(void) +int __at_enter(void) { kernelPrintStr("VideoDrv: Starting up...\r"); return 0; } -int __ImageEnd(void) +int __at_exit(void) { kernelPrintStr("VideoDrv: Shutting down...\r"); return 0; diff --git a/Kernel/NetworkKit/NetworkDevice.hpp b/Kernel/NetworkKit/NetworkDevice.hpp index 20c2a66a..4ea98e4f 100644 --- a/Kernel/NetworkKit/NetworkDevice.hpp +++ b/Kernel/NetworkKit/NetworkDevice.hpp @@ -35,12 +35,17 @@ namespace NewOS public: const char* Name() const override; + Boolean Name(const char* strView); private: - void (*fCleanup)(void); + constexpr auto cNetworkNameLen = 512; + + Void (*fCleanup)(void); + Char fNetworkName[cNetworkNameLen]; + }; - struct PACKED NetworkDeviceCommand final + struct NetworkDeviceCommand final { UInt32 CommandName; UInt32 CommandType; diff --git a/Kernel/Sources/Network/NetworkDevice.cxx b/Kernel/Sources/Network/NetworkDevice.cxx index 511246c7..e1994baa 100644 --- a/Kernel/Sources/Network/NetworkDevice.cxx +++ b/Kernel/Sources/Network/NetworkDevice.cxx @@ -8,8 +8,26 @@ namespace NewOS { + /// \brief Getter for fNetworkName. const char* NetworkDevice::Name() const { - return "NetworkDevice"; + return this->fNetworkName; + } + + /// \brief Setter for fNetworkName. + Boolean NetworkDevice::Name(const char* strView) + { + if (strView == nullptr) + return false; + + if (*strView == 0) + return false; + + if (rt_string_len(strView) > cNetworkNameLen) + return false; + + rt_copy_memory(strView, this->fNetworkName, rt_string_len(strView)); + + return true; } } // namespace NewOS -- cgit v1.2.3 From 596268586bb4c8248a8ec106b8cdea12b9ab926a Mon Sep 17 00:00:00 2001 From: Amlal EL Mahrouss Date: Tue, 18 Jun 2024 10:39:00 +0200 Subject: IMP: TLS syscall, serial write syscall. FIX: SMP manager writes to stack frame directly, check if we also want to free the stack. Signed-off-by: Amlal EL Mahrouss --- .../HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp | 20 +++++----- .../HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp | 2 +- Kernel/HALKit/AMD64/HalKernelMain.cxx | 14 +++++-- Kernel/KernelKit/ProcessScheduler.hxx | 4 +- Kernel/KernelKit/ThreadLocalStorage.hxx | 6 ++- Kernel/KernelKit/ThreadLocalStorage.inl | 8 ++-- Kernel/NetworkKit/NetworkDevice.hpp | 2 +- Kernel/Sources/KeMain.cxx | 10 ++--- Kernel/Sources/Network/NetworkDevice.cxx | 4 +- Kernel/Sources/PEFSharedObject.cxx | 10 ++--- Kernel/Sources/ProcessScheduler.cxx | 12 +++--- Kernel/Sources/SMPManager.cxx | 44 +++++++++------------- Kernel/Sources/ThreadLocalStorage.cxx | 8 ++-- Kernel/Sources/UserHeap.cxx | 2 +- 14 files changed, 74 insertions(+), 72 deletions(-) (limited to 'Kernel/Sources') diff --git a/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp b/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp index e9c0941c..657ab622 100644 --- a/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp +++ b/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp @@ -14,9 +14,9 @@ EXTERN_C void idt_handle_gpf(NewOS::UIntPtr rsp) { NewOS::kcout << "newoskrnl: General Protection Fault, caused by " - << NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName(); + << NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().GetName(); - NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().Crash(); + NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); } /// @brief Handle page fault. @@ -25,9 +25,9 @@ EXTERN_C void idt_handle_pf(NewOS::UIntPtr rsp) { NewOS::kcout << "newoskrnl: Segmentation Fault, caused by " - << NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName(); + << NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().GetName(); - NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().Crash(); + NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); } /// @brief Handle math fault. @@ -36,9 +36,9 @@ EXTERN_C void idt_handle_math(NewOS::UIntPtr rsp) { NewOS::kcout << "newoskrnl: Math error, caused by " - << NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName(); + << NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().GetName(); - NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().Crash(); + NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); } /// @brief Handle any generic fault. @@ -47,9 +47,9 @@ EXTERN_C void idt_handle_generic(NewOS::UIntPtr rsp) { NewOS::kcout << "newoskrnl: Execution error, caused by " - << NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName(); + << NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().GetName(); - NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().Crash(); + NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); } /// @brief Handle #UD fault. @@ -58,9 +58,9 @@ EXTERN_C void idt_handle_ud(NewOS::UIntPtr rsp) { NewOS::kcout << "newoskrnl: Invalid interrupt, caused by " - << NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName(); + << NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().GetName(); - NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().Crash(); + NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); } /// @brief Enter syscall from assembly. diff --git a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp index 26773640..4e9d2ff6 100644 --- a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp +++ b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp @@ -185,7 +185,7 @@ namespace NewOS::HAL { Semaphore sem; - sem.LockOrWait(&ProcessScheduler::The().Leak().GetCurrent().Leak(), Seconds(5)); + sem.LockOrWait(&ProcessScheduler::The().Leak().TheCurrent().Leak(), Seconds(5)); cFramePtr = stackFrame; diff --git a/Kernel/HALKit/AMD64/HalKernelMain.cxx b/Kernel/HALKit/AMD64/HalKernelMain.cxx index cafa6388..3fac40ca 100644 --- a/Kernel/HALKit/AMD64/HalKernelMain.cxx +++ b/Kernel/HALKit/AMD64/HalKernelMain.cxx @@ -76,14 +76,20 @@ EXTERN_C void hal_init_platform( /* install basic hooks. */ - constexpr auto cDummyInterrupt = 0x10; // 16 + constexpr auto cSerialWriteInterrupt = 0x10; // 16 + constexpr auto cTlsInterrupt = 0x11; // 17 - kSyscalls[cDummyInterrupt].Leak().Leak()->fProc = [](NewOS::VoidPtr sf) -> void { - const char* msg = (const char*)sf; + kSyscalls[cSerialWriteInterrupt].Leak().Leak()->fProc = [](NewOS::VoidPtr rdx) -> void { + const char* msg = (const char*)rdx; NewOS::kcout << "newoskrnl: " << msg << "\r"; }; - kSyscalls[cDummyInterrupt].Leak().Leak()->fHooked = true; + kSyscalls[cTlsInterrupt].Leak().Leak()->fProc = [](NewOS::VoidPtr rdx)->void { + tls_check_syscall_impl(rdx); + }; + + kSyscalls[cSerialWriteInterrupt].Leak().Leak()->fHooked = true; + kSyscalls[cTlsInterrupt].Leak().Leak()->fHooked = true; NewOS::HAL::Detail::_ke_power_on_self_test(); diff --git a/Kernel/KernelKit/ProcessScheduler.hxx b/Kernel/KernelKit/ProcessScheduler.hxx index 7c8f99be..8c470bb4 100644 --- a/Kernel/KernelKit/ProcessScheduler.hxx +++ b/Kernel/KernelKit/ProcessScheduler.hxx @@ -249,7 +249,7 @@ namespace NewOS bool Remove(SizeT headerIndex); public: - Ref& GetCurrent(); + Ref& TheCurrent(); SizeT Run() noexcept; public: @@ -268,7 +268,7 @@ namespace NewOS public: static bool Switch(HAL::StackFrame* newStack, const PID& newPid); static bool CanBeScheduled(Ref& process); - static PID& GetCurrentPID(); + static PID& TheCurrentPID(); static SizeT StartScheduling(); }; diff --git a/Kernel/KernelKit/ThreadLocalStorage.hxx b/Kernel/KernelKit/ThreadLocalStorage.hxx index eaae7991..432cc9ac 100644 --- a/Kernel/KernelKit/ThreadLocalStorage.hxx +++ b/Kernel/KernelKit/ThreadLocalStorage.hxx @@ -37,14 +37,16 @@ struct PACKED ThreadInformationBlock final NewOS::Int32 ThreadID; // Thread execution ID. }; +typedef struct ThreadInformationBlock ProcessInformationBlock; + /// @brief TLS install TIB and PIB. -EXTERN_C void rt_install_tib(ThreadInformationBlock* TIB, NewOS::VoidPtr PIB); +EXTERN_C void rt_install_tib(ThreadInformationBlock* TIB, ThreadInformationBlock* PIB); ///! @brief Cookie Sanity check. NewOS::Boolean tls_check_tib(ThreadInformationBlock* Ptr); /// @brief TLS check system call -EXTERN_C NewOS::Void tls_check_syscall_impl(NewOS::HAL::StackFramePtr StackPtr) noexcept; +EXTERN_C NewOS::Void tls_check_syscall_impl(NewOS::VoidPtr TIB) noexcept; #include diff --git a/Kernel/KernelKit/ThreadLocalStorage.inl b/Kernel/KernelKit/ThreadLocalStorage.inl index 1df825a3..6dbff3a1 100644 --- a/Kernel/KernelKit/ThreadLocalStorage.inl +++ b/Kernel/KernelKit/ThreadLocalStorage.inl @@ -15,9 +15,9 @@ inline T* tls_new_ptr(void) { using namespace NewOS; - MUST_PASS(ProcessScheduler::The().Leak().GetCurrent()); + MUST_PASS(ProcessScheduler::The().Leak().TheCurrent()); - auto ref_process = ProcessScheduler::The().Leak().GetCurrent(); + auto ref_process = ProcessScheduler::The().Leak().TheCurrent(); T* pointer = (T*)ref_process.Leak().New(sizeof(T)); return pointer; @@ -32,9 +32,9 @@ inline bool tls_delete_ptr(T* ptr) using namespace NewOS; - MUST_PASS(ProcessScheduler::The().Leak().GetCurrent()); + MUST_PASS(ProcessScheduler::The().Leak().TheCurrent()); - auto ref_process = ProcessScheduler::The().Leak().GetCurrent(); + auto ref_process = ProcessScheduler::The().Leak().TheCurrent(); return ref_process.Leak().Delete(ptr, sizeof(T)); } diff --git a/Kernel/NetworkKit/NetworkDevice.hpp b/Kernel/NetworkKit/NetworkDevice.hpp index 4ea98e4f..9b251c2e 100644 --- a/Kernel/NetworkKit/NetworkDevice.hpp +++ b/Kernel/NetworkKit/NetworkDevice.hpp @@ -38,7 +38,7 @@ namespace NewOS Boolean Name(const char* strView); private: - constexpr auto cNetworkNameLen = 512; + static constexpr auto cNetworkNameLen = 512; Void (*fCleanup)(void); Char fNetworkName[cNetworkNameLen]; diff --git a/Kernel/Sources/KeMain.cxx b/Kernel/Sources/KeMain.cxx index 83702d77..fb127271 100644 --- a/Kernel/Sources/KeMain.cxx +++ b/Kernel/Sources/KeMain.cxx @@ -28,13 +28,13 @@ namespace NewOS::Detail { /// @brief Filesystem auto mounter, additional checks are also done by the /// class. - class FilesystemWizard final + class FilesystemInstaller final { NewOS::NewFilesystemManager* fNewFS{nullptr}; public: /// @brief wizard constructor. - explicit FilesystemWizard() + explicit FilesystemInstaller() { if (NewOS::FilesystemManagerInterface::GetMounted()) { @@ -166,9 +166,9 @@ namespace NewOS::Detail } } - ~FilesystemWizard() = default; + ~FilesystemInstaller() = default; - NEWOS_COPY_DEFAULT(FilesystemWizard); + NEWOS_COPY_DEFAULT(FilesystemInstaller); /// @brief Grab the disk's NewFS reference. /// @return NewFilesystemManager the filesystem interface @@ -211,7 +211,7 @@ namespace NewOS::Detail EXTERN_C NewOS::Void KeMain(NewOS::Void) { /// Now run kernel loop, until no process are running. - NewOS::Detail::FilesystemWizard wizard; // automatic filesystem creation. + NewOS::Detail::FilesystemInstaller installer; // automatic filesystem creation. NewOS::Detail::ke_launch_srv(); diff --git a/Kernel/Sources/Network/NetworkDevice.cxx b/Kernel/Sources/Network/NetworkDevice.cxx index e1994baa..027613ac 100644 --- a/Kernel/Sources/Network/NetworkDevice.cxx +++ b/Kernel/Sources/Network/NetworkDevice.cxx @@ -5,6 +5,7 @@ ------------------------------------------- */ #include +#include namespace NewOS { @@ -26,7 +27,8 @@ namespace NewOS if (rt_string_len(strView) > cNetworkNameLen) return false; - rt_copy_memory(strView, this->fNetworkName, rt_string_len(strView)); + rt_copy_memory((VoidPtr)strView, + (VoidPtr)this->fNetworkName, rt_string_len(strView)); return true; } diff --git a/Kernel/Sources/PEFSharedObject.cxx b/Kernel/Sources/PEFSharedObject.cxx index 5103e075..0d5949f1 100644 --- a/Kernel/Sources/PEFSharedObject.cxx +++ b/Kernel/Sources/PEFSharedObject.cxx @@ -41,7 +41,7 @@ EXTERN_C SharedObjectPtr rt_library_init(void) if (!library) { - ProcessScheduler::The().Leak().GetCurrent().Leak().Crash(); + ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); return nullptr; } @@ -50,17 +50,17 @@ EXTERN_C SharedObjectPtr rt_library_init(void) if (!library->Get()) { - ProcessScheduler::The().Leak().GetCurrent().Leak().Crash(); + ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); return nullptr; } library->Get()->fImageObject = - ProcessScheduler::The().Leak().GetCurrent().Leak().Image; + ProcessScheduler::The().Leak().TheCurrent().Leak().Image; if (!library->Get()->fImageObject) { - ProcessScheduler::The().Leak().GetCurrent().Leak().Crash(); + ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); return nullptr; } @@ -85,7 +85,7 @@ EXTERN_C Void rt_library_free(SharedObjectPtr lib, bool* successful) if (lib == nullptr) { *successful = false; - ProcessScheduler::The().Leak().GetCurrent().Leak().Crash(); + ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); } delete lib->Get(); diff --git a/Kernel/Sources/ProcessScheduler.cxx b/Kernel/Sources/ProcessScheduler.cxx index d232c72e..aae69386 100644 --- a/Kernel/Sources/ProcessScheduler.cxx +++ b/Kernel/Sources/ProcessScheduler.cxx @@ -161,7 +161,7 @@ namespace NewOS void ProcessHeader::Exit(Int32 exit_code) { if (this->ProcessId != - ProcessScheduler::The().Leak().GetCurrent().Leak().ProcessId) + ProcessScheduler::The().Leak().TheCurrent().Leak().ProcessId) ke_stop(RUNTIME_CHECK_PROCESS); kLastExitCode = exit_code; @@ -286,17 +286,17 @@ namespace NewOS /// @brief Gets current running process. /// @return - Ref& ProcessScheduler::GetCurrent() + Ref& ProcessScheduler::TheCurrent() { return mTeam.AsRef(); } /// @brief Current proccess id getter. /// @return Process ID integer. - PID& ProcessHelper::GetCurrentPID() + PID& ProcessHelper::TheCurrentPID() { - kcout << "ProcessHelper::GetCurrentPID: Leaking ProcessId...\r"; - return ProcessScheduler::The().Leak().GetCurrent().Leak().ProcessId; + kcout << "ProcessHelper::TheCurrentPID: Leaking ProcessId...\r"; + return ProcessScheduler::The().Leak().TheCurrent().Leak().ProcessId; } /// @brief Check if process can be schedulded. @@ -368,7 +368,7 @@ namespace NewOS ThreadKind::kHartSystemReserved) { SMPManager::The().Leak()[index].Leak()->Busy(true); - ProcessHelper::GetCurrentPID() = new_pid; + ProcessHelper::TheCurrentPID() = new_pid; return SMPManager::The().Leak()[index].Leak()->Switch(the_stack); } diff --git a/Kernel/Sources/SMPManager.cxx b/Kernel/Sources/SMPManager.cxx index 5002e880..149b1334 100644 --- a/Kernel/Sources/SMPManager.cxx +++ b/Kernel/Sources/SMPManager.cxx @@ -85,36 +85,26 @@ namespace NewOS bool HardwareThread::Switch(HAL::StackFramePtr stack) { if (!rt_check_stack(stack)) - return false; - - if (!fStack) - { - fStack = stack; - } - else { - /// Keep the arguments, switch the base pointer, stack pointer - /// fs and gs registers. - fStack->Rbp = stack->Rbp; - fStack->Rsp = stack->Rsp; - fStack->Fs = stack->Fs; - fStack->Gs = stack->Gs; - - // save global registers. - - fStack->R15 = stack->R15; - fStack->R14 = stack->R14; + /// provide 'nullptr' to free the stack frame. + if (stack == nullptr) + { + delete fStack; + fStack = nullptr; - fStack->R13 = stack->R13; - fStack->R12 = stack->R12; - fStack->R11 = stack->R11; + return true; + } - fStack->R10 = stack->R10; - fStack->R9 = stack->R9; - fStack->R8 = stack->R8; + return false; + } - fStack->Rcx = this->fID; + if (fStack) + { + delete fStack; + fStack = nullptr; } + + fStack = stack; rt_do_context_switch(fStack); @@ -146,7 +136,7 @@ namespace NewOS HAL::StackFramePtr SMPManager::Leak() noexcept { if (fThreadList[fCurrentThread].Leak() && - ProcessHelper::GetCurrentPID() == + ProcessHelper::TheCurrentPID() == fThreadList[fCurrentThread].Leak().Leak()->fPID) return fThreadList[fCurrentThread].Leak().Leak()->fStack; @@ -189,7 +179,7 @@ namespace NewOS fThreadList[idx].Leak().Leak()->Switch(fThreadList[idx].Leak().Leak()->fStack); - fThreadList[idx].Leak().Leak()->fPID = ProcessHelper::GetCurrentPID(); + fThreadList[idx].Leak().Leak()->fPID = ProcessHelper::TheCurrentPID(); fThreadList[idx].Leak().Leak()->Busy(false); diff --git a/Kernel/Sources/ThreadLocalStorage.cxx b/Kernel/Sources/ThreadLocalStorage.cxx index c292d078..4d6fec14 100644 --- a/Kernel/Sources/ThreadLocalStorage.cxx +++ b/Kernel/Sources/ThreadLocalStorage.cxx @@ -44,14 +44,16 @@ Boolean tls_check_tib(ThreadInformationBlock* tib) * @param stackPtr The call frame. * @return */ -EXTERN_C Void tls_check_syscall_impl(NewOS::HAL::StackFramePtr stackPtr) noexcept +EXTERN_C Void tls_check_syscall_impl(NewOS::VoidPtr TIB) noexcept { - ThreadInformationBlock* tib = (ThreadInformationBlock*)stackPtr->Gs; + if (!TIB) return; + + ThreadInformationBlock* tib = (ThreadInformationBlock*)TIB; if (!tls_check_tib(tib)) { kcout << "newoskrnl: Verification failed, Crashing...\r"; - ProcessScheduler::The().Leak().GetCurrent().Leak().Crash(); + ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); } kcout << "newoskrnl: Verification succeeded! Keeping on...\r"; diff --git a/Kernel/Sources/UserHeap.cxx b/Kernel/Sources/UserHeap.cxx index d1de13a6..f20e30f8 100644 --- a/Kernel/Sources/UserHeap.cxx +++ b/Kernel/Sources/UserHeap.cxx @@ -150,7 +150,7 @@ namespace NewOS { if (!poolHdr->fFree) { - ProcessScheduler::The().Leak().GetCurrent().Leak().Crash(); + ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); return; } -- cgit v1.2.3