diff options
Diffstat (limited to 'dev')
| -rw-r--r-- | dev/ZKAKit/HALKit/AMD64/HalDescriptorLoader.cc | 6 | ||||
| -rw-r--r-- | dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm | 2 | ||||
| -rw-r--r-- | dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc | 29 | ||||
| -rw-r--r-- | dev/ZKAKit/HALKit/AMD64/Storage/AHCI.cc | 2 | ||||
| -rw-r--r-- | dev/ZKAKit/HALKit/ARM64/HalKernelMain.cc | 12 | ||||
| -rw-r--r-- | dev/ZKAKit/KernelKit/CodeMgr.h | 2 | ||||
| -rw-r--r-- | dev/ZKAKit/KernelKit/Heap.h | 6 | ||||
| -rw-r--r-- | dev/ZKAKit/KernelKit/PEFCodeMgr.h | 2 | ||||
| -rw-r--r-- | dev/ZKAKit/KernelKit/UserProcessScheduler.h | 4 | ||||
| -rw-r--r-- | dev/ZKAKit/NewKit/CxxAbi.h | 2 | ||||
| -rw-r--r-- | dev/ZKAKit/NewKit/Pair.h | 2 | ||||
| -rw-r--r-- | dev/ZKAKit/src/BitMapMgr.cc | 5 | ||||
| -rw-r--r-- | dev/ZKAKit/src/CodeMgr.cc | 2 | ||||
| -rw-r--r-- | dev/ZKAKit/src/CxxAbi-AMD64.cc | 4 | ||||
| -rw-r--r-- | dev/ZKAKit/src/CxxAbi-ARM64.cc | 4 | ||||
| -rw-r--r-- | dev/ZKAKit/src/HardwareThreadScheduler.cc | 5 | ||||
| -rw-r--r-- | dev/ZKAKit/src/PEFCodeMgr.cc | 58 | ||||
| -rw-r--r-- | dev/ZKAKit/src/UserProcessScheduler.cc | 50 |
18 files changed, 65 insertions, 132 deletions
diff --git a/dev/ZKAKit/HALKit/AMD64/HalDescriptorLoader.cc b/dev/ZKAKit/HALKit/AMD64/HalDescriptorLoader.cc index 5f7bde36..20177eba 100644 --- a/dev/ZKAKit/HALKit/AMD64/HalDescriptorLoader.cc +++ b/dev/ZKAKit/HALKit/AMD64/HalDescriptorLoader.cc @@ -7,6 +7,8 @@ #include <ArchKit/ArchKit.h> #include <HALKit/AMD64/Processor.h> +#define kPITDefaultTicks (1000U) + namespace Kernel::HAL { namespace Detail @@ -20,7 +22,7 @@ namespace Kernel::HAL STATIC Void hal_enable_pit(UInt16 ticks) noexcept { if (ticks == 0) - ticks = 1000; + ticks = kPITDefaultTicks; // Configure PIT to receieve scheduler interrupts. @@ -82,7 +84,7 @@ namespace Kernel::HAL Void IDTLoader::Load(Register64& idt) { - const Int16 kPITTickForScheduler = 100; + const Int16 kPITTickForScheduler = kPITDefaultTicks; volatile ::Kernel::UIntPtr** ptr_ivt = (volatile ::Kernel::UIntPtr**)idt.Base; diff --git a/dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm b/dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm index 06066f41..49eb2bd8 100644 --- a/dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm +++ b/dev/ZKAKit/HALKit/AMD64/HalInterruptAPI.asm @@ -340,6 +340,8 @@ mp_system_call_handler: o64 sysret hal_load_idt: + cli + lidt [rcx] ; Master PIC initialization diff --git a/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc b/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc index 507ce217..a50eab32 100644 --- a/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc +++ b/dev/ZKAKit/HALKit/AMD64/HalKernelMain.cc @@ -13,19 +13,6 @@ #include <CFKit/Property.h> #include <Modules/FB/Text.h> -namespace Kernel::HAL -{ - /// @brief Gets the system cores using the MADT. - /// @param rsp_ptr The 'RSD PTR' data structure. - EXTERN void mp_get_cores(Kernel::voidPtr rsp_ptr) noexcept; -} // namespace Kernel::HAL - -namespace Kernel -{ - EXTERN UserProcessScheduler* kProcessScheduler; - EXTERN HardwareThreadScheduler* kHardwareThreadScheduler; -} // namespace Kernel - EXTERN_C Kernel::VoidPtr kInterruptVectorTable[]; EXTERN_C Kernel::VoidPtr mp_user_switch_proc; EXTERN_C Kernel::Char mp_user_switch_proc_stack_begin[]; @@ -36,9 +23,6 @@ EXTERN_C void hal_init_platform( { kHandoverHeader = HandoverHeader; - Kernel::kProcessScheduler = nullptr; - Kernel::kHardwareThreadScheduler = nullptr; - if (kHandoverHeader->f_Magic != kHandoverMagic && kHandoverHeader->f_Version != kHandoverVersion) { @@ -81,24 +65,11 @@ EXTERN_C void hal_init_platform( Kernel::ke_stop(RUNTIME_CHECK_BOOTSTRAP); } -EXTERN_C Kernel::Void hal_kernel_server(Kernel::Void) noexcept -{ - while (Yes) - ; -} - EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept { /* Initialize filesystem. */ Kernel::NeFileSystemMgr::Mount(new Kernel::NeFileSystemMgr()); - /* Initialize scheduler. */ - Kernel::UserProcessHelper::InitializeScheduler(); - - const Kernel::Char kKernelServerName[255] = "KernelServer"; - - Kernel::rtl_create_process(&hal_kernel_server, kKernelServerName); - /* Start any cores. */ if (kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled) Kernel::HAL::mp_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr); diff --git a/dev/ZKAKit/HALKit/AMD64/Storage/AHCI.cc b/dev/ZKAKit/HALKit/AMD64/Storage/AHCI.cc index caf7cd7e..b329b705 100644 --- a/dev/ZKAKit/HALKit/AMD64/Storage/AHCI.cc +++ b/dev/ZKAKit/HALKit/AMD64/Storage/AHCI.cc @@ -20,7 +20,7 @@ #include <NewKit/Utils.h> #include <KernelKit/LockDelegate.h> -#define kMaxAhciPoll 100000 +#define kMaxAhciPoll (100000U) #ifdef __AHCI__ enum diff --git a/dev/ZKAKit/HALKit/ARM64/HalKernelMain.cc b/dev/ZKAKit/HALKit/ARM64/HalKernelMain.cc index 95b3a9b0..913853d2 100644 --- a/dev/ZKAKit/HALKit/ARM64/HalKernelMain.cc +++ b/dev/ZKAKit/HALKit/ARM64/HalKernelMain.cc @@ -40,7 +40,13 @@ EXTERN_C void hal_init_platform( /* INITIALIZE BIT MAP. */ /************************************** */ - while (Yes) - { - } + kKernelBitMpSize = kHandoverHeader->f_BitMapSize; + kKernelBitMpStart = reinterpret_cast<Kernel::VoidPtr>( + reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_BitMapStart)); + + Kernel::NeFileSystemMgr::Mount(new Kernel::NeFileSystemMgr()); + + + + while (Yes); } diff --git a/dev/ZKAKit/KernelKit/CodeMgr.h b/dev/ZKAKit/KernelKit/CodeMgr.h index b8fa4c37..4faa1235 100644 --- a/dev/ZKAKit/KernelKit/CodeMgr.h +++ b/dev/ZKAKit/KernelKit/CodeMgr.h @@ -27,5 +27,5 @@ namespace Kernel /// @note This sets up a new stack, anything on the main function that calls the Kernel will not be accessible. /// @param main the start of the process. /// @return The team's process id. - SizeT rtl_create_process(MainKind main, const Char* process_name) noexcept; + ProcessID rtl_create_process(MainKind main, const Char* process_name) noexcept; } // namespace Kernel diff --git a/dev/ZKAKit/KernelKit/Heap.h b/dev/ZKAKit/KernelKit/Heap.h index 3b098397..4746eb47 100644 --- a/dev/ZKAKit/KernelKit/Heap.h +++ b/dev/ZKAKit/KernelKit/Heap.h @@ -53,12 +53,6 @@ namespace Kernel inline T* mm_new_class(Args&&... args) { T* cls = new T(move(args)...); - - if (cls == nullptr) - { - ke_stop(RUNTIME_CHECK_POINTER); - } - return cls; } diff --git a/dev/ZKAKit/KernelKit/PEFCodeMgr.h b/dev/ZKAKit/KernelKit/PEFCodeMgr.h index 00afa2d8..ed9b6d1f 100644 --- a/dev/ZKAKit/KernelKit/PEFCodeMgr.h +++ b/dev/ZKAKit/KernelKit/PEFCodeMgr.h @@ -60,7 +60,7 @@ namespace Kernel namespace Utils { - SizeT execute_from_image(PEFLoader& exec, const Int32& procKind) noexcept; + ProcessID execute_from_image(PEFLoader& exec, const Int32& procKind) noexcept; } // namespace Utils } // namespace Kernel diff --git a/dev/ZKAKit/KernelKit/UserProcessScheduler.h b/dev/ZKAKit/KernelKit/UserProcessScheduler.h index c093bfb1..df366e07 100644 --- a/dev/ZKAKit/KernelKit/UserProcessScheduler.h +++ b/dev/ZKAKit/KernelKit/UserProcessScheduler.h @@ -14,7 +14,7 @@ #define kSchedMinMicroTime (AffinityKind::kStandard) #define kSchedInvalidPID (-1) -#define kSchedProcessLimitPerTeam (16U) +#define kSchedProcessLimitPerTeam (32U) #define kSchedMaxMemoryLimit gib_cast(128) #define kSchedMaxStackSz mib_cast(8) @@ -278,7 +278,6 @@ namespace Kernel const SizeT Run() noexcept; public: - STATIC ErrorOr<UserProcessScheduler> TheSafe(); STATIC UserProcessScheduler& The(); private: @@ -296,7 +295,6 @@ namespace Kernel STATIC bool CanBeScheduled(const UserProcess& process); STATIC PID& TheCurrentPID(); STATIC SizeT StartScheduling(); - STATIC Bool InitializeScheduler(); }; const UInt32& sched_get_exit_code(void) noexcept; diff --git a/dev/ZKAKit/NewKit/CxxAbi.h b/dev/ZKAKit/NewKit/CxxAbi.h index c6408af1..56c127e1 100644 --- a/dev/ZKAKit/NewKit/CxxAbi.h +++ b/dev/ZKAKit/NewKit/CxxAbi.h @@ -9,7 +9,7 @@ #ifndef __TOOLCHAINKIT__ -#define kDSOMaxObjects (128) +#define kAtExitMacDestructors (128) struct atexit_func_entry_t { diff --git a/dev/ZKAKit/NewKit/Pair.h b/dev/ZKAKit/NewKit/Pair.h index aabc66ff..98e3a806 100644 --- a/dev/ZKAKit/NewKit/Pair.h +++ b/dev/ZKAKit/NewKit/Pair.h @@ -10,5 +10,5 @@ namespace Kernel { - + class Pair; } // namespace Kernel diff --git a/dev/ZKAKit/src/BitMapMgr.cc b/dev/ZKAKit/src/BitMapMgr.cc index 27158a12..1477dea0 100644 --- a/dev/ZKAKit/src/BitMapMgr.cc +++ b/dev/ZKAKit/src/BitMapMgr.cc @@ -162,11 +162,6 @@ namespace Kernel ptr_new = traits.FindBitMap(kKernelBitMpStart, size, wr, user); - if (!ptr_new) - { - return nullptr; - } - return (UIntPtr*)ptr_new; } diff --git a/dev/ZKAKit/src/CodeMgr.cc b/dev/ZKAKit/src/CodeMgr.cc index c855347b..429858d6 100644 --- a/dev/ZKAKit/src/CodeMgr.cc +++ b/dev/ZKAKit/src/CodeMgr.cc @@ -14,7 +14,7 @@ namespace Kernel /// @note This sets up a new stack, anything on the main function that calls the Kernel will not be accessible. /// @param main the start of the process. /// @return if the process was started or not. - SizeT rtl_create_process(MainKind main, const Char* process_name) noexcept + ProcessID rtl_create_process(MainKind main, const Char* process_name) noexcept { if (!main) return No; diff --git a/dev/ZKAKit/src/CxxAbi-AMD64.cc b/dev/ZKAKit/src/CxxAbi-AMD64.cc index 1aac28e6..0ebebee9 100644 --- a/dev/ZKAKit/src/CxxAbi-AMD64.cc +++ b/dev/ZKAKit/src/CxxAbi-AMD64.cc @@ -10,7 +10,7 @@ #include <NewKit/CxxAbi.h> #include <KernelKit/LPC.h> -atexit_func_entry_t __atexit_funcs[kDSOMaxObjects]; +atexit_func_entry_t __atexit_funcs[kAtExitMacDestructors]; uarch_t __atexit_func_count; @@ -29,7 +29,7 @@ EXTERN_C void ___chkstk_ms(void) EXTERN_C int atexit(void (*f)(void*), void* arg, void* dso) { - if (__atexit_func_count >= kDSOMaxObjects) + if (__atexit_func_count >= kAtExitMacDestructors) return -1; __atexit_funcs[__atexit_func_count].destructor_func = f; diff --git a/dev/ZKAKit/src/CxxAbi-ARM64.cc b/dev/ZKAKit/src/CxxAbi-ARM64.cc index 6b5c1a0e..a222e4bb 100644 --- a/dev/ZKAKit/src/CxxAbi-ARM64.cc +++ b/dev/ZKAKit/src/CxxAbi-ARM64.cc @@ -10,7 +10,7 @@ #include <NewKit/CxxAbi.h> #include <KernelKit/LPC.h> -atexit_func_entry_t __atexit_funcs[kDSOMaxObjects]; +atexit_func_entry_t __atexit_funcs[kAtExitMacDestructors]; uarch_t __atexit_func_count; @@ -23,7 +23,7 @@ EXTERN_C void __chkstk(void) EXTERN_C int atexit(void (*f)(void*), void* arg, void* dso) { - if (__atexit_func_count >= kDSOMaxObjects) + if (__atexit_func_count >= kAtExitMacDestructors) return -1; __atexit_funcs[__atexit_func_count].destructor_func = f; diff --git a/dev/ZKAKit/src/HardwareThreadScheduler.cc b/dev/ZKAKit/src/HardwareThreadScheduler.cc index ddfd0ee7..f0605ff6 100644 --- a/dev/ZKAKit/src/HardwareThreadScheduler.cc +++ b/dev/ZKAKit/src/HardwareThreadScheduler.cc @@ -17,7 +17,7 @@ namespace Kernel { - HardwareThreadScheduler* kHardwareThreadScheduler = nullptr; + HardwareThreadScheduler kHardwareThreadScheduler; ///! A HardwareThread class takes care of it's owned hardware thread. ///! It has a stack for it's core. @@ -136,8 +136,7 @@ namespace Kernel /// @brief Shared singleton function HardwareThreadScheduler& HardwareThreadScheduler::The() { - MUST_PASS(kHardwareThreadScheduler); - return *kHardwareThreadScheduler; + return kHardwareThreadScheduler; } /// @brief Get Stack Frame of Core diff --git a/dev/ZKAKit/src/PEFCodeMgr.cc b/dev/ZKAKit/src/PEFCodeMgr.cc index 45a5e46c..8c18dfe3 100644 --- a/dev/ZKAKit/src/PEFCodeMgr.cc +++ b/dev/ZKAKit/src/PEFCodeMgr.cc @@ -199,16 +199,43 @@ namespace Kernel return !fBad && fCachedBlob; } + const Char* PEFLoader::Path() + { + return fPath.Leak().CData(); + } + + const Char* PEFLoader::AsString() + { +#ifdef __32x0__ + return "32x0 PEF executable."; +#elif defined(__64x0__) + return "64x0 PEF executable."; +#elif defined(__x86_64__) + return "x86_64 PEF executable."; +#elif defined(__aarch64__) + return "aarch64 PEF executable."; +#elif defined(__powerpc64__) + return "POWER64 PEF executable."; +#else + return "???? PEF executable."; +#endif // __32x0__ || __64x0__ || __x86_64__ || __powerpc64__ + } + + const Char* PEFLoader::MIME() + { + return kPefApplicationMime; + } + namespace Utils { - SizeT execute_from_image(PEFLoader& exec, const Int32& procKind) noexcept + ProcessID execute_from_image(PEFLoader& exec, const Int32& procKind) noexcept { auto errOrStart = exec.FindStart(); if (errOrStart.Error() != kErrorSuccess) return No; - UserProcess proc; + UserProcess proc{}; proc.Image = errOrStart.Leak().Leak(); proc.Kind = procKind; @@ -229,31 +256,4 @@ namespace Kernel return UserProcessScheduler::The().Add(proc); } } // namespace Utils - - const Char* PEFLoader::Path() - { - return fPath.Leak().CData(); - } - - const Char* PEFLoader::AsString() - { -#ifdef __32x0__ - return "32x0 PEF executable."; -#elif defined(__64x0__) - return "64x0 PEF executable."; -#elif defined(__x86_64__) - return "x86_64 PEF executable."; -#elif defined(__aarch64__) - return "aarch64 PEF executable."; -#elif defined(__powerpc64__) - return "POWER64 PEF executable."; -#else - return "???? PEF executable."; -#endif // __32x0__ || __64x0__ || __x86_64__ || __powerpc64__ - } - - const Char* PEFLoader::MIME() - { - return kPefApplicationMime; - } } // namespace Kernel diff --git a/dev/ZKAKit/src/UserProcessScheduler.cc b/dev/ZKAKit/src/UserProcessScheduler.cc index 249033a2..280a006b 100644 --- a/dev/ZKAKit/src/UserProcessScheduler.cc +++ b/dev/ZKAKit/src/UserProcessScheduler.cc @@ -12,10 +12,10 @@ /// @brief User process scheduler. /***********************************************************************************/ -#include <ArchKit/ArchKit.h> #include <KernelKit/UserProcessScheduler.h> -#include <KernelKit/IPEFDLLObject.h> #include <KernelKit/HardwareThreadScheduler.h> +#include <KernelKit/IPEFDLLObject.h> +#include <ArchKit/ArchKit.h> #include <KernelKit/Heap.h> #include <NewKit/KString.h> #include <KernelKit/LPC.h> @@ -38,8 +38,7 @@ namespace Kernel /// @brief User Process scheduler global and external reference of thread scheduler. /***********************************************************************************/ - UserProcessScheduler* kProcessScheduler = nullptr; - EXTERN HardwareThreadScheduler* kHardwareThreadScheduler; + UserProcessScheduler kProcessScheduler; UserProcess::UserProcess(VoidPtr start_image) : Image(start_image) {} @@ -373,16 +372,7 @@ namespace Kernel UserProcessScheduler& UserProcessScheduler::The() { - MUST_PASS(kProcessScheduler); - return *kProcessScheduler; - } - - ErrorOr<UserProcessScheduler> UserProcessScheduler::TheSafe() - { - if (!kProcessScheduler) - return ErrorOr<UserProcessScheduler>(nullptr); - - return ErrorOr<UserProcessScheduler>(kProcessScheduler); + return kProcessScheduler; } /***********************************************************************************/ @@ -397,7 +387,7 @@ namespace Kernel const Bool UserProcessScheduler::Remove(ProcessID process_id) { // check if process is within range. - if (process_id > mTeam.AsArray().Count()) + if (process_id > mTeam.mProcessAmount) return No; mTeam.AsArray()[process_id].Status = ProcessStatusKind::kDead; @@ -458,7 +448,7 @@ namespace Kernel this->GetCurrentProcess() = process; // tell helper to find a core to schedule on. - if (!UserProcessHelper::Switch(process.Image, &process.StackReserve[process.StackSize], process.StackFrame, + if (!UserProcessHelper::Switch(process.Image, &process.StackReserve[process.StackSize - 1], process.StackFrame, process.ProcessId)) { process.Crash(); @@ -497,7 +487,7 @@ namespace Kernel PID& UserProcessHelper::TheCurrentPID() { kcout << "UserProcessHelper::TheCurrentPID: Leaking ProcessId...\r"; - return kProcessScheduler->GetCurrentProcess().Leak().ProcessId; + return kProcessScheduler.GetCurrentProcess().Leak().ProcessId; } /// @brief Check if process can be schedulded. @@ -523,36 +513,12 @@ namespace Kernel /***********************************************************************************/ /** - * @brief Allocate a scheduler. - */ - /***********************************************************************************/ - - Bool UserProcessHelper::InitializeScheduler() - { - if (!kProcessScheduler) - { - kProcessScheduler = new UserProcessScheduler(); - } - - if (!kHardwareThreadScheduler) - { - kHardwareThreadScheduler = new HardwareThreadScheduler(); - } - - return Yes; - } - - /***********************************************************************************/ - /** * @brief Start scheduling current AP/Hart/Core. */ /***********************************************************************************/ SizeT UserProcessHelper::StartScheduling() { - if (!kProcessScheduler) - return 0; - - return kProcessScheduler->Run(); + return kProcessScheduler.Run(); } /***********************************************************************************/ |
