summaryrefslogtreecommitdiffhomepage
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
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>
-rw-r--r--Boot/BootKit/BootKit.hxx2
-rw-r--r--Boot/Modules/NetBoot/Module.cxx2
-rw-r--r--Kernel/FSKit/NewFS.hxx30
-rw-r--r--Kernel/HALKit/AMD64/CPUID.hxx124
-rw-r--r--Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx14
-rw-r--r--Kernel/KernelKit/PEFSharedObject.hxx4
-rw-r--r--Kernel/KernelKit/ProcessHeap.hxx10
-rw-r--r--Kernel/KernelKit/ProcessScheduler.hxx10
-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
-rw-r--r--SCIKit/SharedInterface1.hxx12
-rw-r--r--SCIKit/Types.hxx47
-rw-r--r--SCIKit/makefile7
-rw-r--r--SCIKit/rtl.internal.inl32
-rw-r--r--SCIKit/source_deploy.xml1
17 files changed, 213 insertions, 126 deletions
diff --git a/Boot/BootKit/BootKit.hxx b/Boot/BootKit/BootKit.hxx
index 86a4dde4..b5f6bd23 100644
--- a/Boot/BootKit/BootKit.hxx
+++ b/Boot/BootKit/BootKit.hxx
@@ -340,7 +340,7 @@ inline Boolean BDiskFormatFactory<BootDev>::Format(const char* partName,
if (GIB(fDiskDev.GetDiskSize()) < cMinimumDiskSize)
{
- EFI::ThrowError(L"Disk-Too-Tiny", L"Disk can't contain a New Filesystem partition.");
+ EFI::ThrowError(L"Disk-Too-Tiny", L"Can't format a New Filesystem partition here.");
return false;
}
diff --git a/Boot/Modules/NetBoot/Module.cxx b/Boot/Modules/NetBoot/Module.cxx
index 3bc71d0e..b389d435 100644
--- a/Boot/Modules/NetBoot/Module.cxx
+++ b/Boot/Modules/NetBoot/Module.cxx
@@ -12,7 +12,7 @@
EXTERN_C Int32 ModuleMain(Void)
{
- /// - Find a network drive called "/Remote/newoskrnl"
+ /// - Find a network drive called "\\Remote\\newoskrnl" with fork 'From-NetBoot'
/// - Download our image
/// - Boot from it.
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;
diff --git a/SCIKit/SharedInterface1.hxx b/SCIKit/SharedInterface1.hxx
index 5edb5e51..46c6e220 100644
--- a/SCIKit/SharedInterface1.hxx
+++ b/SCIKit/SharedInterface1.hxx
@@ -7,12 +7,18 @@ Purpose: System Call Interface Version 1.
------------------------------------------- */
-#ifndef __SCI_STD_HXX__
-#define __SCI_STD_HXX__
+#ifndef __SHARED_INTERFACE_HXX__
+#define __SHARED_INTERFACE_HXX__
+
+#define cRestrictR 1
+#define cRestrictRB 2
+#define cRestrictW 4
+#define cRestrictRW 6
#include <SCIKit/Types.hxx>
typedef UInt32 PowerID;
+typedef long long int FD;
/**
@brief System call class.
@@ -86,4 +92,4 @@ public:
virtual UInt0* WriteStorage(const UTFChar* cmdNameOrData, SizeT cmdSize, FD descriptorType) = 0;
};
-#endif // ifndef __SCI_STD_HXX__
+#endif // ifndef __SHARED_INTERFACE_HXX__
diff --git a/SCIKit/Types.hxx b/SCIKit/Types.hxx
index c42b7718..2c7e204e 100644
--- a/SCIKit/Types.hxx
+++ b/SCIKit/Types.hxx
@@ -7,20 +7,13 @@ Purpose: System Call types.
------------------------------------------- */
-
#pragma once
#define IMPORT_CXX extern "C++"
#define IMPORT_C extern "C"
-#define cRestrictR 1
-#define cRestrictRB 2
-#define cRestrictW 4
-#define cRestrictRW 6
-
-typedef long long int FD;
-typedef bool Bool;
-typedef void UInt0;
+typedef bool Bool;
+typedef void UInt0;
typedef __UINT64_TYPE__ UInt64;
typedef __UINT32_TYPE__ UInt32;
@@ -40,7 +33,7 @@ typedef char UTFChar;
// So that they aren't too big.
class UnknownInterface; // Refrenced from an IDB entry.
-class UnknownUCLSID; // From IDB, the constructor of the object.
+class UnknownUCLSID; // From the IDB, the constructor of the object, e.g: WordUCLSID.
class __attribute__((uuid("d7c144b6-0792-44b8-b06b-02b227b547df"))) UnknownInterface
{
@@ -51,14 +44,30 @@ public:
UnknownInterface& operator=(const UnknownInterface&) = default;
UnknownInterface(const UnknownInterface&) = default;
- SInt32 Release() { delete this; }
-
- template <typename TCLS>
- SInt32 Release(TCLS* cls) { delete cls; return 0; }
-
- template <typename TCLS, typename UCLSID, typename... Args>
- TCLS* QueryInterface(UCLSID uclsidOfCls, Args... args) { return uclsidOfCls->QueryObject<TCLS>(args...); }
+ SInt32 Release()
+ {
+ delete this;
+ return 0;
+ }
};
-template <typename TCLS, typename UCLSID>
-TCLS* RtlGetClassFromCLSID(UCLSID uclsidOfCls); \ No newline at end of file
+#ifdef __NEWOS_SYMS__
+#include <SCIKit/rtl.internal.inl>
+#else
+
+/// @brief Allocate new SCM class.
+/// @tparam TCLS
+/// @tparam UCLSID
+/// @param uclsidOfCls
+/// @return
+template <typename TCLS, typename UCLSID, typename... Args>
+inline TCLS* RtlGetClassFromCLSID(UCLSID uclsidOfCls, Args... args);
+
+/// @brief Release SCM class.
+/// @tparam TCLS
+/// @param cls
+/// @return
+template <typename TCLS>
+inline SInt32 RtlReleaseClass(TCLS* cls);
+
+#endif \ No newline at end of file
diff --git a/SCIKit/makefile b/SCIKit/makefile
index ae08cce2..9a2b836e 100644
--- a/SCIKit/makefile
+++ b/SCIKit/makefile
@@ -1,7 +1,12 @@
######################
# (C) ZKA
+# SCM/SCI kit makefile.
######################
+CC=g++
+FLAGS=-I../ -shared -fPIC -D__NEWOS_SYMS__
+OUTPUT=libSCI.lib
+
.PHONY: build-sci
build-sci:
- g++ *.cxx -I../ -shared -fPIC -o libSCI.lib \ No newline at end of file
+ $(CC) $(wildcard *.cxx) $(FLAGS) -o $(OUTPUT) \ No newline at end of file
diff --git a/SCIKit/rtl.internal.inl b/SCIKit/rtl.internal.inl
new file mode 100644
index 00000000..b0b011cc
--- /dev/null
+++ b/SCIKit/rtl.internal.inl
@@ -0,0 +1,32 @@
+/* -------------------------------------------
+
+Copyright ZKA Technologies.
+
+File: rt.internal.inl.
+Purpose: Internal file for SCM.
+
+------------------------------------------- */
+
+/// @brief Allocate new SCM class.
+/// @tparam TCLS
+/// @tparam UCLSID
+/// @param uclsidOfCls
+/// @return
+template <typename TCLS, typename UCLSID, typename... Args>
+inline TCLS* RtlGetClassFromCLSID(UCLSID* uclsidOfCls, Args&&... args)
+{
+ return uclsidOfCls->QueryObjectWithArgs(args...);
+}
+
+/// @brief Release SCM class.
+/// @tparam TCLS
+/// @param cls
+/// @return
+template <typename TCLS>
+inline SInt32 RtlReleaseClass(TCLS* cls)
+{
+ cls->DecrementRef();
+ cls->Release();
+
+ return 0;
+}
diff --git a/SCIKit/source_deploy.xml b/SCIKit/source_deploy.xml
index 5f653982..7873c49f 100644
--- a/SCIKit/source_deploy.xml
+++ b/SCIKit/source_deploy.xml
@@ -2,5 +2,6 @@
<HiddenFiles>
<SourceFile>*.cxx</SourceFile>
<SourceFile>*.drawio</SourceFile>
+ <SourceFile>*.internal.inl</SourceFile>
</HiddenFiles>
</SourceDeploy>