From 63dc1384bcbf8caf4ca53c715628db2c36b0b096 Mon Sep 17 00:00:00 2001 From: Amlal EL Mahrouss Date: Wed, 31 Jul 2024 16:40:11 +0200 Subject: [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 --- Boot/BootKit/BootKit.hxx | 2 +- Boot/Modules/NetBoot/Module.cxx | 2 +- Kernel/FSKit/NewFS.hxx | 30 ++--- Kernel/HALKit/AMD64/CPUID.hxx | 124 ++++++++++----------- .../HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx | 14 ++- Kernel/KernelKit/PEFSharedObject.hxx | 4 + Kernel/KernelKit/ProcessHeap.hxx | 10 +- Kernel/KernelKit/ProcessScheduler.hxx | 10 +- Kernel/Sources/PEFSharedObject.cxx | 20 ++-- Kernel/Sources/ProcessHeap.cxx | 4 +- Kernel/Sources/ProcessScheduler.cxx | 17 ++- Kernel/Sources/Timer.cxx | 3 + SCIKit/SharedInterface1.hxx | 12 +- SCIKit/Types.hxx | 47 ++++---- SCIKit/makefile | 7 +- SCIKit/rtl.internal.inl | 32 ++++++ SCIKit/source_deploy.xml | 1 + 17 files changed, 213 insertions(+), 126 deletions(-) create mode 100644 SCIKit/rtl.internal.inl 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::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(); 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 +#include #include #include #include @@ -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 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 - SInt32 Release(TCLS* cls) { delete cls; return 0; } - - template - TCLS* QueryInterface(UCLSID uclsidOfCls, Args... args) { return uclsidOfCls->QueryObject(args...); } + SInt32 Release() + { + delete this; + return 0; + } }; -template -TCLS* RtlGetClassFromCLSID(UCLSID uclsidOfCls); \ No newline at end of file +#ifdef __NEWOS_SYMS__ +#include +#else + +/// @brief Allocate new SCM class. +/// @tparam TCLS +/// @tparam UCLSID +/// @param uclsidOfCls +/// @return +template +inline TCLS* RtlGetClassFromCLSID(UCLSID uclsidOfCls, Args... args); + +/// @brief Release SCM class. +/// @tparam TCLS +/// @param cls +/// @return +template +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 +inline TCLS* RtlGetClassFromCLSID(UCLSID* uclsidOfCls, Args&&... args) +{ + return uclsidOfCls->QueryObjectWithArgs(args...); +} + +/// @brief Release SCM class. +/// @tparam TCLS +/// @param cls +/// @return +template +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 @@ *.cxx *.drawio + *.internal.inl -- cgit v1.2.3