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 | |
| 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>
| -rw-r--r-- | Boot/BootKit/BootKit.hxx | 2 | ||||
| -rw-r--r-- | Boot/Modules/NetBoot/Module.cxx | 2 | ||||
| -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 | ||||
| -rw-r--r-- | SCIKit/SharedInterface1.hxx | 12 | ||||
| -rw-r--r-- | SCIKit/Types.hxx | 47 | ||||
| -rw-r--r-- | SCIKit/makefile | 7 | ||||
| -rw-r--r-- | SCIKit/rtl.internal.inl | 32 | ||||
| -rw-r--r-- | SCIKit/source_deploy.xml | 1 |
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>
|
