diff options
| author | Amlal EL Mahrouss <amlalelmahrouss@icloud.com> | 2024-07-31 16:40:11 +0200 |
|---|---|---|
| committer | Amlal EL Mahrouss <amlalelmahrouss@icloud.com> | 2024-07-31 16:42:42 +0200 |
| commit | 63dc1384bcbf8caf4ca53c715628db2c36b0b096 (patch) | |
| tree | 2937e78fc2f0e729052660bdd1c74fdacf57d0ec /Kernel | |
| parent | 59e0caa55e97f1a998904f404e5fedac3b2b0ec6 (diff) | |
[IMP] SEE BELOW.
- Support for shared libraries inside a process.
- SMP improvements, add the PROCESS_CONTROL_BLOCK, to handle task
switching.
- Add MUST_PASS in HardwareTimer class.
- Add rtl.internal.inl for SCM internal implementation.
Signed-off-by: Amlal EL Mahrouss <amlalelmahrouss@icloud.com>
Diffstat (limited to 'Kernel')
| -rw-r--r-- | Kernel/FSKit/NewFS.hxx | 30 | ||||
| -rw-r--r-- | Kernel/HALKit/AMD64/CPUID.hxx | 124 | ||||
| -rw-r--r-- | Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx | 14 | ||||
| -rw-r--r-- | Kernel/KernelKit/PEFSharedObject.hxx | 4 | ||||
| -rw-r--r-- | Kernel/KernelKit/ProcessHeap.hxx | 10 | ||||
| -rw-r--r-- | Kernel/KernelKit/ProcessScheduler.hxx | 10 | ||||
| -rw-r--r-- | Kernel/Sources/PEFSharedObject.cxx | 20 | ||||
| -rw-r--r-- | Kernel/Sources/ProcessHeap.cxx | 4 | ||||
| -rw-r--r-- | Kernel/Sources/ProcessScheduler.cxx | 17 | ||||
| -rw-r--r-- | Kernel/Sources/Timer.cxx | 3 |
10 files changed, 135 insertions, 101 deletions
diff --git a/Kernel/FSKit/NewFS.hxx b/Kernel/FSKit/NewFS.hxx index 5f8341f1..24e77225 100644 --- a/Kernel/FSKit/NewFS.hxx +++ b/Kernel/FSKit/NewFS.hxx @@ -67,15 +67,15 @@ default. #define kNewFSCatalogKindDevice (9) #define kNewFSCatalogKindLock (10) -#define kNewFSCatalogKindRLE (11) +#define kNewFSCatalogKindRLE (11) #define kNewFSCatalogKindMetaFile (12) -#define kNewFSSeparator '\\' +#define kNewFSSeparator '\\' #define kNewFSSeparatorAlt '/' -#define kNewFSUpDir ".." -#define kNewFSRoot "\\" +#define kNewFSUpDir ".." +#define kNewFSRoot "\\" #define kNewFSRootAlt "/" #define kNewFSLF '\r' @@ -147,7 +147,7 @@ struct PACKED NFS_CATALOG_STRUCT final /// whereas the data fork is reserved for file data. struct PACKED NFS_FORK_STRUCT final { - Kernel::Char ForkName[kNewFSForkNameLen]; + Kernel::Char ForkName[kNewFSForkNameLen]; Kernel::Char CatalogName[kNewFSNodeNameLen]; Kernel::Int32 Flags; @@ -228,15 +228,15 @@ namespace Kernel /// @param theFork the fork itself. /// @return the fork _Output NFS_FORK_STRUCT* CreateFork(_Input NFS_CATALOG_STRUCT* catalog, - _Input NFS_FORK_STRUCT& theFork); + _Input NFS_FORK_STRUCT& theFork); /// @brief Find fork inside New filesystem. /// @param catalog the catalog. /// @param name the fork name. /// @return the fork. _Output NFS_FORK_STRUCT* FindFork(_Input NFS_CATALOG_STRUCT* catalog, - _Input const Char* name, - Boolean dataOrRsrc); + _Input const Char* name, + Boolean dataOrRsrc); _Output Void RemoveFork(_Input NFS_FORK_STRUCT* fork); @@ -247,19 +247,19 @@ namespace Kernel _Output NFS_CATALOG_STRUCT* GetCatalog(_Input const char* name); _Output NFS_CATALOG_STRUCT* CreateCatalog(_Input const char* name, - _Input const Int32& flags, - _Input const Int32& kind); + _Input const Int32& flags, + _Input const Int32& kind); _Output NFS_CATALOG_STRUCT* CreateCatalog(_Input const char* name); bool WriteCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, - voidPtr data, - SizeT sizeOfData, - _Input const char* forkName); + voidPtr data, + SizeT sizeOfData, + _Input const char* forkName); VoidPtr ReadCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, - SizeT dataSz, - _Input const char* forkName); + SizeT dataSz, + _Input const char* forkName); bool Seek(_Input _Output NFS_CATALOG_STRUCT* catalog, SizeT off); diff --git a/Kernel/HALKit/AMD64/CPUID.hxx b/Kernel/HALKit/AMD64/CPUID.hxx index 5c05277e..4f88921e 100644 --- a/Kernel/HALKit/AMD64/CPUID.hxx +++ b/Kernel/HALKit/AMD64/CPUID.hxx @@ -15,67 +15,67 @@ enum { - CPU_FEATURE_ECX_SSE3 = 1 << 0, - CPU_FEATURE_ECX_PCLMUL = 1 << 1, - CPU_FEATURE_ECX_DTES64 = 1 << 2, - CPU_FEATURE_ECX_MONITOR = 1 << 3, - CPU_FEATURE_ECX_DS_CPL = 1 << 4, - CPU_FEATURE_ECX_VMX = 1 << 5, - CPU_FEATURE_ECX_SMX = 1 << 6, - CPU_FEATURE_ECX_EST = 1 << 7, - CPU_FEATURE_ECX_TM2 = 1 << 8, - CPU_FEATURE_ECX_SSSE3 = 1 << 9, - CPU_FEATURE_ECX_CID = 1 << 10, - CPU_FEATURE_ECX_SDBG = 1 << 11, - CPU_FEATURE_ECX_FMA = 1 << 12, - CPU_FEATURE_ECX_CX16 = 1 << 13, - CPU_FEATURE_ECX_XTPR = 1 << 14, - CPU_FEATURE_ECX_PDCM = 1 << 15, - CPU_FEATURE_ECX_PCID = 1 << 17, - CPU_FEATURE_ECX_DCA = 1 << 18, - CPU_FEATURE_ECX_SSE4_1 = 1 << 19, - CPU_FEATURE_ECX_SSE4_2 = 1 << 20, - CPU_FEATURE_ECX_X2APIC = 1 << 21, - CPU_FEATURE_ECX_MOVBE = 1 << 22, - CPU_FEATURE_ECX_POP3C = 1 << 23, - CPU_FEATURE_ECX_TSC = 1 << 24, - CPU_FEATURE_ECX_AES = 1 << 25, - CPU_FEATURE_ECX_XSAVE = 1 << 26, - CPU_FEATURE_ECX_OSXSAVE = 1 << 27, - CPU_FEATURE_ECX_AVX = 1 << 28, - CPU_FEATURE_ECX_F16C = 1 << 29, - CPU_FEATURE_ECX_RDRAND = 1 << 30, - CPU_FEATURE_ECX_HYPERVISOR = 1 << 31, - CPU_FEATURE_EDX_FPU = 1 << 0, - CPU_FEATURE_EDX_VME = 1 << 1, - CPU_FEATURE_EDX_DE = 1 << 2, - CPU_FEATURE_EDX_PSE = 1 << 3, - CPU_FEATURE_EDX_TSC = 1 << 4, - CPU_FEATURE_EDX_MSR = 1 << 5, - CPU_FEATURE_EDX_PAE = 1 << 6, - CPU_FEATURE_EDX_MCE = 1 << 7, - CPU_FEATURE_EDX_CX8 = 1 << 8, - CPU_FEATURE_EDX_APIC = 1 << 9, - CPU_FEATURE_EDX_SEP = 1 << 11, - CPU_FEATURE_EDX_MTRR = 1 << 12, - CPU_FEATURE_EDX_PGE = 1 << 13, - CPU_FEATURE_EDX_MCA = 1 << 14, - CPU_FEATURE_EDX_CMOV = 1 << 15, - CPU_FEATURE_EDX_PAT = 1 << 16, - CPU_FEATURE_EDX_PSE36 = 1 << 17, - CPU_FEATURE_EDX_PSN = 1 << 18, - CPU_FEATURE_EDX_CLFLUSH = 1 << 19, - CPU_FEATURE_EDX_DS = 1 << 21, - CPU_FEATURE_EDX_ACPI = 1 << 22, - CPU_FEATURE_EDX_MMX = 1 << 23, - CPU_FEATURE_EDX_FXSR = 1 << 24, - CPU_FEATURE_EDX_SSE = 1 << 25, - CPU_FEATURE_EDX_SSE2 = 1 << 26, - CPU_FEATURE_EDX_SS = 1 << 27, - CPU_FEATURE_EDX_HTT = 1 << 28, - CPU_FEATURE_EDX_TM = 1 << 29, - CPU_FEATURE_EDX_IA64 = 1 << 30, - CPU_FEATURE_EDX_PBE = 1 << 31 + eCPU_FEATURE_ECX_SSE3 = 1 << 0, + eCPU_FEATURE_ECX_PCLMUL = 1 << 1, + eCPU_FEATURE_ECX_DTES64 = 1 << 2, + eCPU_FEATURE_ECX_MONITOR = 1 << 3, + eCPU_FEATURE_ECX_DS_CPL = 1 << 4, + eCPU_FEATURE_ECX_VMX = 1 << 5, + eCPU_FEATURE_ECX_SMX = 1 << 6, + eCPU_FEATURE_ECX_EST = 1 << 7, + eCPU_FEATURE_ECX_TM2 = 1 << 8, + eCPU_FEATURE_ECX_SSSE3 = 1 << 9, + eCPU_FEATURE_ECX_CID = 1 << 10, + eCPU_FEATURE_ECX_SDBG = 1 << 11, + eCPU_FEATURE_ECX_FMA = 1 << 12, + eCPU_FEATURE_ECX_CX16 = 1 << 13, + eCPU_FEATURE_ECX_XTPR = 1 << 14, + eCPU_FEATURE_ECX_PDCM = 1 << 15, + eCPU_FEATURE_ECX_PCID = 1 << 17, + eCPU_FEATURE_ECX_DCA = 1 << 18, + eCPU_FEATURE_ECX_SSE4_1 = 1 << 19, + eCPU_FEATURE_ECX_SSE4_2 = 1 << 20, + eCPU_FEATURE_ECX_X2APIC = 1 << 21, + eCPU_FEATURE_ECX_MOVBE = 1 << 22, + eCPU_FEATURE_ECX_POP3C = 1 << 23, + eCPU_FEATURE_ECX_TSC = 1 << 24, + eCPU_FEATURE_ECX_AES = 1 << 25, + eCPU_FEATURE_ECX_XSAVE = 1 << 26, + eCPU_FEATURE_ECX_OSXSAVE = 1 << 27, + eCPU_FEATURE_ECX_AVX = 1 << 28, + eCPU_FEATURE_ECX_F16C = 1 << 29, + eCPU_FEATURE_ECX_RDRAND = 1 << 30, + eCPU_FEATURE_ECX_HYPERVISOR = 1 << 31, + eCPU_FEATURE_EDX_FPU = 1 << 0, + eCPU_FEATURE_EDX_VME = 1 << 1, + eCPU_FEATURE_EDX_DE = 1 << 2, + eCPU_FEATURE_EDX_PSE = 1 << 3, + eCPU_FEATURE_EDX_TSC = 1 << 4, + eCPU_FEATURE_EDX_MSR = 1 << 5, + eCPU_FEATURE_EDX_PAE = 1 << 6, + eCPU_FEATURE_EDX_MCE = 1 << 7, + eCPU_FEATURE_EDX_CX8 = 1 << 8, + eCPU_FEATURE_EDX_APIC = 1 << 9, + eCPU_FEATURE_EDX_SEP = 1 << 11, + eCPU_FEATURE_EDX_MTRR = 1 << 12, + eCPU_FEATURE_EDX_PGE = 1 << 13, + eCPU_FEATURE_EDX_MCA = 1 << 14, + eCPU_FEATURE_EDX_CMOV = 1 << 15, + eCPU_FEATURE_EDX_PAT = 1 << 16, + eCPU_FEATURE_EDX_PSE36 = 1 << 17, + eCPU_FEATURE_EDX_PSN = 1 << 18, + eCPU_FEATURE_EDX_CLFLUSH = 1 << 19, + eCPU_FEATURE_EDX_DS = 1 << 21, + eCPU_FEATURE_EDX_ACPI = 1 << 22, + eCPU_FEATURE_EDX_MMX = 1 << 23, + eCPU_FEATURE_EDX_FXSR = 1 << 24, + eCPU_FEATURE_EDX_SSE = 1 << 25, + eCPU_FEATURE_EDX_SSE2 = 1 << 26, + eCPU_FEATURE_EDX_SS = 1 << 27, + eCPU_FEATURE_EDX_HTT = 1 << 28, + eCPU_FEATURE_EDX_TM = 1 << 29, + eCPU_FEATURE_EDX_IA64 = 1 << 30, + eCPU_FEATURE_EDX_PBE = 1 << 31 }; -typedef int CPU_FEATURE;
\ No newline at end of file +typedef long long int hal_cpu_feature_type;
\ No newline at end of file diff --git a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx index 2f82da6b..a79d1881 100644 --- a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx +++ b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx @@ -166,7 +166,6 @@ namespace Kernel::HAL { while (Yes) { - } } @@ -176,9 +175,17 @@ namespace Kernel::HAL hal_switch_context(stackFrame); } + constexpr auto cMaxPCBBlocks = 64; + + struct PROCESS_CONTROL_BLOCK final + { + ProcessHeader* f_Header; + HAL::StackFramePtr f_StackFrame; + } fBlocks[cMaxPCBBlocks] = {0}; + STATIC Void hal_switch_context(HAL::StackFramePtr stackFrame) { - Semaphore sem; + STATIC Semaphore sem; constexpr auto cSeconds = 1U; @@ -187,6 +194,9 @@ namespace Kernel::HAL cFramePtr = stackFrame; + fBlocks[ProcessScheduler::The().Leak().TheCurrent().Leak().ProcessId % cMaxPCBBlocks].f_Header = &ProcessScheduler::The().Leak().TheCurrent().Leak(); + fBlocks[ProcessScheduler::The().Leak().TheCurrent().Leak().ProcessId % cMaxPCBBlocks].f_StackFrame = stackFrame; + sem.Unlock(); } diff --git a/Kernel/KernelKit/PEFSharedObject.hxx b/Kernel/KernelKit/PEFSharedObject.hxx index f8119971..d490c567 100644 --- a/Kernel/KernelKit/PEFSharedObject.hxx +++ b/Kernel/KernelKit/PEFSharedObject.hxx @@ -107,6 +107,10 @@ namespace Kernel }; typedef SharedObject* SharedObjectPtr; + + EXTERN_C SharedObjectPtr rtl_init_shared_object(ProcessHeader* header); + EXTERN_C Void rtl_fini_shared_object(ProcessHeader* header, SharedObjectPtr lib, Bool* successful); } // namespace Kernel #endif /* ifndef __KERNELKIT_SHARED_OBJECT_HXX__ */ + diff --git a/Kernel/KernelKit/ProcessHeap.hxx b/Kernel/KernelKit/ProcessHeap.hxx index 7772398e..377e6009 100644 --- a/Kernel/KernelKit/ProcessHeap.hxx +++ b/Kernel/KernelKit/ProcessHeap.hxx @@ -15,7 +15,7 @@ /// @version 5/11/23 /// @file ProcessHeap.hxx -/// @brief Heap for user processes. +/// @brief Process heap allocator. #define kUserHeapMaxSz (4096) #define kUserHeapMag (0xFAF0FEF0) @@ -33,12 +33,12 @@ namespace Kernel } kUserHeapFlags; /// @brief Allocate a process heap, no zero out is done here. - /// @param flags + /// @param flags the allocation flags. /// @return The process's heap. - VoidPtr rt_new_heap(Int32 flags); + VoidPtr sched_new_heap(Int32 flags); /// @brief Frees the process heap. /// @param pointer The process heap pointer. - /// @return - Int32 rt_free_heap(voidPtr pointer); + /// @return status code of the freeing. + Int32 sched_free_heap(voidPtr pointer); } // namespace Kernel diff --git a/Kernel/KernelKit/ProcessScheduler.hxx b/Kernel/KernelKit/ProcessScheduler.hxx index 5c27af79..b174858a 100644 --- a/Kernel/KernelKit/ProcessScheduler.hxx +++ b/Kernel/KernelKit/ProcessScheduler.hxx @@ -36,10 +36,11 @@ namespace Kernel //! @brief Process name length. inline constexpr SizeT kProcessLen = 256U; - //! @brief Forward declaration. + //! @brief Forward declarations. class ProcessHeader; class ProcessScheduler; class ProcessHelper; + class SharedObject; //! @brief Process status enum. enum class ProcessStatus : Int32 @@ -144,7 +145,7 @@ namespace Kernel const Int32& GetExitCode() noexcept; public: - Char Name[kProcessLen] = {"Process"}; + Char Name[kProcessLen] = {"Unknown Process"}; ProcessSubsystem SubSystem{ProcessSubsystem::eProcessSubsystemInvalid}; ProcessSelector Selector{ProcessSelector::kRingUser}; HAL::StackFramePtr StackFrame{nullptr}; @@ -156,7 +157,10 @@ namespace Kernel ImagePtr Image{nullptr}; HeapPtrKind HeapPtr{nullptr}; - // memory usage + // shared library handle, reserved for .lib only. + SharedObject* SharedLibObjectPtr{nullptr}; + + // Memory usage. SizeT UsedMemory{0}; SizeT FreeMemory{0}; diff --git a/Kernel/Sources/PEFSharedObject.cxx b/Kernel/Sources/PEFSharedObject.cxx index dccb9d12..7d02ac19 100644 --- a/Kernel/Sources/PEFSharedObject.cxx +++ b/Kernel/Sources/PEFSharedObject.cxx @@ -18,11 +18,11 @@ Revision History: - 01/02/24: Rework shared sharedObj ABI, except a rt_library_init and - rt_library_fini (amlel) 15/02/24: Breaking changes, changed the name of the + 01/02/24: Rework shared sharedObj ABI, except a rtl_init_shared_object and + rtl_fini_shared_object (amlel) 15/02/24: Breaking changes, changed the name of the routines. (amlel) - 07/28/24: Replace rt_library_free with rt_library_fini + 07/28/24: Replace rt_library_free with rtl_fini_shared_object ------------------------------------------- */ @@ -37,13 +37,13 @@ using namespace Kernel; /** @brief Library initializer. */ /***********************************************************************************/ -EXTERN_C SharedObjectPtr rt_library_init(void) +EXTERN_C SharedObjectPtr rtl_init_shared_object(ProcessHeader* header) { SharedObjectPtr sharedObj = tls_new_class<SharedObject>(); if (!sharedObj) { - ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); + header->Crash(); return nullptr; } @@ -52,17 +52,17 @@ EXTERN_C SharedObjectPtr rt_library_init(void) if (!sharedObj->Get()) { - ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); + header->Crash(); return nullptr; } sharedObj->Get()->fImageObject = - ProcessScheduler::The().Leak().TheCurrent().Leak().Image; + header->Image; if (!sharedObj->Get()->fImageObject) { - ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); + header->Crash(); return nullptr; } @@ -80,7 +80,7 @@ EXTERN_C SharedObjectPtr rt_library_init(void) /** @param successful Reports if successful or not. */ /***********************************************************************************/ -EXTERN_C Void rt_library_fini(SharedObjectPtr lib, bool* successful) +EXTERN_C Void rtl_fini_shared_object(ProcessHeader* header, SharedObjectPtr lib, Bool* successful) { MUST_PASS(successful); @@ -88,7 +88,7 @@ EXTERN_C Void rt_library_fini(SharedObjectPtr lib, bool* successful) if (lib == nullptr) { *successful = false; - ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); + header->Crash(); } delete lib->Get(); diff --git a/Kernel/Sources/ProcessHeap.cxx b/Kernel/Sources/ProcessHeap.cxx index 86ac1554..414cd934 100644 --- a/Kernel/Sources/ProcessHeap.cxx +++ b/Kernel/Sources/ProcessHeap.cxx @@ -199,7 +199,7 @@ namespace Kernel /// @brief Creates a new pool pointer. /// @param flags the flags attached to it. /// @return a pool pointer with selected permissions. - VoidPtr rt_new_heap(Int32 flags) + VoidPtr sched_new_heap(Int32 flags) { if (!ProcessHeapHelper::IsEnabled()) return nullptr; @@ -233,7 +233,7 @@ namespace Kernel /// @brief free a pool pointer. /// @param ptr The pool pointer to free. /// @return status code - Int32 rt_free_heap(VoidPtr ptr) + Int32 sched_free_heap(VoidPtr ptr) { if (!ProcessHeapHelper::IsEnabled()) return -1; diff --git a/Kernel/Sources/ProcessScheduler.cxx b/Kernel/Sources/ProcessScheduler.cxx index 3301588a..94ae5fad 100644 --- a/Kernel/Sources/ProcessScheduler.cxx +++ b/Kernel/Sources/ProcessScheduler.cxx @@ -10,6 +10,7 @@ /***********************************************************************************/ #include <KernelKit/ProcessScheduler.hxx> +#include <KernelKit/PEFSharedObject.hxx> #include <KernelKit/MPManager.hpp> #include <KernelKit/Heap.hxx> #include <NewKit/String.hpp> @@ -193,6 +194,17 @@ namespace Kernel this->Image = nullptr; this->StackFrame = nullptr; + if (this->Kind == kShLibKind) + { + bool success = false; + rtl_fini_shared_object(this, this->SharedLibObjectPtr, &success); + + if (success) + { + this->SharedLibObjectPtr = nullptr; + } + } + ProcessScheduler::The().Leak().Remove(this->ProcessId); } @@ -217,11 +229,12 @@ namespace Kernel /// Create heap according to type of process. if (process.Leak().Kind == ProcessHeader::kAppKind) { - process.Leak().HeapPtr = rt_new_heap(kUserHeapUser | kUserHeapRw); + process.Leak().HeapPtr = sched_new_heap(kUserHeapUser | kUserHeapRw); } else if (process.Leak().Kind == ProcessHeader::kShLibKind) { - process.Leak().HeapPtr = rt_new_heap(kUserHeapUser | kUserHeapRw | kUserHeapShared); + process.Leak().SharedLibObjectPtr = rtl_init_shared_object(&process.Leak()); + process.Leak().HeapPtr = sched_new_heap(kUserHeapUser | kUserHeapRw | kUserHeapShared); } else { diff --git a/Kernel/Sources/Timer.cxx b/Kernel/Sources/Timer.cxx index ad43310d..0d56dcae 100644 --- a/Kernel/Sources/Timer.cxx +++ b/Kernel/Sources/Timer.cxx @@ -22,7 +22,9 @@ Int32 HardwareTimerInterface::Wait() noexcept HardwareTimer::HardwareTimer(Int64 seconds) : fWaitFor(seconds) { + MUST_PASS(fWaitFor > 0); } + HardwareTimer::~HardwareTimer() { fWaitFor = 0; @@ -35,6 +37,7 @@ Int32 HardwareTimer::Wait() noexcept while (*fDigitalTimer < (*fDigitalTimer + fWaitFor)) { + ; } return 0; |
