summaryrefslogtreecommitdiffhomepage
path: root/Kernel/Sources
diff options
context:
space:
mode:
authorAmlal EL Mahrouss <amlalelmahrouss@icloud.com>2024-07-31 16:40:11 +0200
committerAmlal EL Mahrouss <amlalelmahrouss@icloud.com>2024-07-31 16:42:42 +0200
commit63dc1384bcbf8caf4ca53c715628db2c36b0b096 (patch)
tree2937e78fc2f0e729052660bdd1c74fdacf57d0ec /Kernel/Sources
parent59e0caa55e97f1a998904f404e5fedac3b2b0ec6 (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.cxx20
-rw-r--r--Kernel/Sources/ProcessHeap.cxx4
-rw-r--r--Kernel/Sources/ProcessScheduler.cxx17
-rw-r--r--Kernel/Sources/Timer.cxx3
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;