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/Sources | |
| 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/Sources')
| -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 |
4 files changed, 30 insertions, 14 deletions
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; |
