From bc7870aea4c437e1a80b779eb7a968d55733d24c Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sat, 13 Jul 2024 00:20:21 +0200 Subject: [IMP] Kernel properties (such as \KernelVersion) [REFACTOR] Rename KernelHeap to just Heap. [FIX] Scheduler's way of checking boundaries was not correct. Signed-off-by: Amlal El Mahrouss --- Kernel/CFKit/Property.hpp | 19 +- Kernel/FSKit/IndexableProperty.hxx | 6 +- Kernel/HALKit/AMD64/HalACPIFactoryInterface.cxx | 2 +- Kernel/HALKit/AMD64/HalInterruptAPI.asm | 8 - Kernel/HALKit/AMD64/HalKernelMain.cxx | 15 +- Kernel/HALKit/ARM64/HalKernelMain.cxx | 2 +- Kernel/KernelKit/Heap.hxx | 51 ++++++ Kernel/KernelKit/KernelHeap.hpp | 48 ------ Kernel/NewKit/ErrorOr.hpp | 2 +- Kernel/NewKit/Json.hxx | 10 +- Kernel/NewKit/New.hpp | 2 +- Kernel/NewKit/Ref.hpp | 5 + Kernel/NewKit/String.hpp | 13 +- Kernel/Sources/Heap.cxx | 219 ++++++++++++++++++++++++ Kernel/Sources/KeMain.cxx | 202 ---------------------- Kernel/Sources/KernelHeap.cxx | 219 ------------------------ Kernel/Sources/Main.cxx | 199 +++++++++++++++++++++ Kernel/Sources/New+Delete.cxx | 2 +- Kernel/Sources/NewFS+FileManager.cxx | 2 +- Kernel/Sources/PEFCodeManager.cxx | 2 +- Kernel/Sources/ProcessScheduler.cxx | 43 +++-- Kernel/Sources/Property.cxx | 16 +- Kernel/Sources/String.cxx | 29 ++-- Kernel/Sources/ThreadLocalStorage.cxx | 30 +++- Kernel/Sources/Utils.cxx | 7 +- 25 files changed, 600 insertions(+), 553 deletions(-) create mode 100644 Kernel/KernelKit/Heap.hxx delete mode 100644 Kernel/KernelKit/KernelHeap.hpp create mode 100644 Kernel/Sources/Heap.cxx delete mode 100644 Kernel/Sources/KeMain.cxx delete mode 100644 Kernel/Sources/KernelHeap.cxx create mode 100644 Kernel/Sources/Main.cxx (limited to 'Kernel') diff --git a/Kernel/CFKit/Property.hpp b/Kernel/CFKit/Property.hpp index bf6ce770..519f486e 100644 --- a/Kernel/CFKit/Property.hpp +++ b/Kernel/CFKit/Property.hpp @@ -4,14 +4,16 @@ ------------------------------------------- */ -#ifndef __INC_PLIST_HPP__ -#define __INC_PLIST_HPP__ +#ifndef __INC_PROPS_HPP__ +#define __INC_PROPS_HPP__ #include #include #include #include +#define cMaxPropLen 4096 + namespace Kernel { /// @brief handle to anything (number, ptr, string...) @@ -22,23 +24,24 @@ namespace Kernel class Property { public: - explicit Property(const StringView& sw); + Property() = default; virtual ~Property(); public: Property& operator=(const Property&) = default; Property(const Property&) = default; - bool StringEquals(StringView& name); - const PropertyId& GetPropertyById(); + bool StringEquals(StringView& name); + PropertyId& GetValue(); + StringView& GetKey(); private: - Ref fName; - PropertyId fAction; + StringView fName{cMaxPropLen}; + PropertyId fAction{No}; }; template using PropertyArray = Array; } // namespace Kernel -#endif // !__INC_PLIST_HPP__ +#endif // !__INC_PROPS_HPP__ diff --git a/Kernel/FSKit/IndexableProperty.hxx b/Kernel/FSKit/IndexableProperty.hxx index 49c3d1b3..ecc6a436 100644 --- a/Kernel/FSKit/IndexableProperty.hxx +++ b/Kernel/FSKit/IndexableProperty.hxx @@ -28,8 +28,12 @@ namespace Kernel { public: explicit IndexableProperty() - : Property(StringBuilder::Construct("\\Filesystem\\IsIndexable?").Leak().Leak()) + : Property() { + Kernel::StringView strProp(cMaxPropLen); + strProp += "\\Properties\\Indexable"; + + this->GetKey() = strProp; } ~IndexableProperty() override = default; diff --git a/Kernel/HALKit/AMD64/HalACPIFactoryInterface.cxx b/Kernel/HALKit/AMD64/HalACPIFactoryInterface.cxx index d9bb4baa..d9918570 100644 --- a/Kernel/HALKit/AMD64/HalACPIFactoryInterface.cxx +++ b/Kernel/HALKit/AMD64/HalACPIFactoryInterface.cxx @@ -8,7 +8,7 @@ #include #include #include -#include +#include namespace Kernel { diff --git a/Kernel/HALKit/AMD64/HalInterruptAPI.asm b/Kernel/HALKit/AMD64/HalInterruptAPI.asm index 5eaf60b4..c09d5a06 100644 --- a/Kernel/HALKit/AMD64/HalInterruptAPI.asm +++ b/Kernel/HALKit/AMD64/HalInterruptAPI.asm @@ -121,19 +121,11 @@ IntNormal 31 [extern hal_apic_acknowledge] -%define cAPICAddress 0xFEE00000 - __NEW_INT_34: -;; make this active, SMP works again. push rax call hal_apic_acknowledge pop rax - mov rax, 0 - - ;; tell there local apic that we're done. - mov qword [cAPICAddress + 0xB0], rax ; send end of interrupt. - iretq IntNormal 32 diff --git a/Kernel/HALKit/AMD64/HalKernelMain.cxx b/Kernel/HALKit/AMD64/HalKernelMain.cxx index 869e4ae4..fcd12247 100644 --- a/Kernel/HALKit/AMD64/HalKernelMain.cxx +++ b/Kernel/HALKit/AMD64/HalKernelMain.cxx @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include #include #include @@ -18,11 +18,16 @@ #include #include #include +#include #define mInitKernel(X) \ X; \ Kernel::ke_stop(RUNTIME_CHECK_BOOTSTRAP); + + +Kernel::Property cKernelVersion; + /// @brief This symbol is the kernel main symbol. EXTERN_C void KeMain(); @@ -210,6 +215,14 @@ EXTERN_C void hal_init_platform( kSyscalls[cRebootInterrupt].Leak().Leak()->fHooked = true; kSyscalls[cLPCSanitizeMsg].Leak().Leak()->fHooked = true; + // newoskrnl version 1.00 + // + Kernel::StringView strVer(cMaxPropLen); + strVer += "\\Properties\\KernelVersion"; + + cKernelVersion.GetKey() = strVer; + cKernelVersion.GetValue() = 1100; + Kernel::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_RsdPtr); mInitKernel(KeMain()); diff --git a/Kernel/HALKit/ARM64/HalKernelMain.cxx b/Kernel/HALKit/ARM64/HalKernelMain.cxx index 54a75365..5e66a3d8 100644 --- a/Kernel/HALKit/ARM64/HalKernelMain.cxx +++ b/Kernel/HALKit/ARM64/HalKernelMain.cxx @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/Kernel/KernelKit/Heap.hxx b/Kernel/KernelKit/Heap.hxx new file mode 100644 index 00000000..0f673ffb --- /dev/null +++ b/Kernel/KernelKit/Heap.hxx @@ -0,0 +1,51 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies + +------------------------------------------- */ + +#ifndef _INC_KERNEL_HEAP_HXX_ +#define _INC_KERNEL_HEAP_HXX_ + +// last-rev 30/01/24 +// file: KernelHeap.hxx +// description: heap allocation for the kernel. + +#include + +namespace Kernel +{ + /// @brief Declare pointer as free. + /// @param allocatedPtr the pointer. + /// @return + Int32 ke_delete_ke_heap(voidPtr allocatedPtr); + + /// @brief Declare a new size for allocatedPtr. + /// @param allocatedPtr the pointer. + /// @return + voidPtr ke_realloc_ke_heap(voidPtr allocatedPtr, SizeT newSz); + + /// @brief Check if pointer is a valid kernel pointer. + /// @param allocatedPtr the pointer + /// @return if it exists. + Boolean ke_is_valid_heap(VoidPtr allocatedPtr); + + /// @brief allocate chunk of memory. + /// @param sz size of pointer + /// @param rw read write (true to enable it) + /// @param user is it accesible by user processes? + /// @return the pointer + voidPtr ke_new_ke_heap(const SizeT sz, const Bool rw, const Bool user); + + /// @brief Protect the heap with a CRC value. + /// @param allocatedPtr pointer. + /// @return if it valid: point has crc now., otherwise fail. + Boolean ke_protect_ke_heap(VoidPtr allocatedPtr); + + /// @brief Makes a kernel heap page. + /// @param allocatedPtr the page pointer. + /// @return + Int32 ke_make_ke_page(VoidPtr allocatedPtr); +} // namespace Kernel + +#endif // !_INC_KERNEL_HEAP_HXX_ diff --git a/Kernel/KernelKit/KernelHeap.hpp b/Kernel/KernelKit/KernelHeap.hpp deleted file mode 100644 index 95412761..00000000 --- a/Kernel/KernelKit/KernelHeap.hpp +++ /dev/null @@ -1,48 +0,0 @@ -/* ------------------------------------------- - - Copyright ZKA Technologies - -------------------------------------------- */ - -#pragma once - -// last-rev 30/01/24 -// file: KernelHeap.hpp -// description: heap allocation for the kernel. - -#include - -namespace Kernel -{ - /// @brief Declare pointer as free. - /// @param allocatedPtr the pointer. - /// @return - Int32 ke_delete_ke_heap(voidPtr allocatedPtr); - - /// @brief Declare a new size for allocatedPtr. - /// @param allocatedPtr the pointer. - /// @return - voidPtr ke_realloc_ke_heap(voidPtr allocatedPtr, SizeT newSz); - - /// @brief Check if pointer is a valid kernel pointer. - /// @param allocatedPtr the pointer - /// @return if it exists. - Boolean ke_is_valid_heap(VoidPtr allocatedPtr); - - /// @brief allocate chunk of memory. - /// @param sz size of pointer - /// @param rw read write (true to enable it) - /// @param user is it accesible by user processes? - /// @return the pointer - voidPtr ke_new_ke_heap(const SizeT sz, const Bool rw, const Bool user); - - /// @brief Protect the heap with a CRC value. - /// @param allocatedPtr pointer. - /// @return if it valid: point has crc now., otherwise fail. - Boolean ke_protect_ke_heap(VoidPtr allocatedPtr); - - /// @brief Makes a kernel heap page. - /// @param allocatedPtr the page pointer. - /// @return - Int32 ke_make_ke_page(VoidPtr allocatedPtr); -} // namespace Kernel diff --git a/Kernel/NewKit/ErrorOr.hpp b/Kernel/NewKit/ErrorOr.hpp index 482b85e0..a528de57 100644 --- a/Kernel/NewKit/ErrorOr.hpp +++ b/Kernel/NewKit/ErrorOr.hpp @@ -34,7 +34,7 @@ namespace Kernel } explicit ErrorOr(T Class) - : mRef(Class) + : mRef(Class, true) { } diff --git a/Kernel/NewKit/Json.hxx b/Kernel/NewKit/Json.hxx index 8d4f3a8d..4b994606 100644 --- a/Kernel/NewKit/Json.hxx +++ b/Kernel/NewKit/Json.hxx @@ -15,7 +15,8 @@ #include #include -#define cMaxJsonPath 4096 +#define cMaxJsonPath 4096 +#define cUndefinedLen 32 namespace Kernel { @@ -24,8 +25,10 @@ namespace Kernel { public: explicit JsonType() - : Kernel::JsonType(1, 1) + : Kernel::JsonType(cUndefinedLen, cUndefinedLen) { + this->AsKey() += "undefined"; + this->AsValue() += "undefined"; } explicit JsonType(SizeT lhsLen, SizeT rhsLen) @@ -37,7 +40,10 @@ namespace Kernel NEWOS_COPY_DEFAULT(JsonType); + Bool IsUndefined() { return fUndefined; } + private: + Bool fUndefined; // is this instance undefined? StringView fKey; StringView fValue; diff --git a/Kernel/NewKit/New.hpp b/Kernel/NewKit/New.hpp index fae35f3b..eade355d 100644 --- a/Kernel/NewKit/New.hpp +++ b/Kernel/NewKit/New.hpp @@ -6,7 +6,7 @@ ------------------------------------------- */ #pragma once -#include +#include typedef __SIZE_TYPE__ size_t; // gcc will complain about that diff --git a/Kernel/NewKit/Ref.hpp b/Kernel/NewKit/Ref.hpp index da5d6206..0b0f89cc 100644 --- a/Kernel/NewKit/Ref.hpp +++ b/Kernel/NewKit/Ref.hpp @@ -43,6 +43,11 @@ namespace Kernel return fClass; } + T& Fetch() const noexcept + { + return fClass; + } + T operator*() { return fClass; diff --git a/Kernel/NewKit/String.hpp b/Kernel/NewKit/String.hpp index cfff3e3c..7440900c 100644 --- a/Kernel/NewKit/String.hpp +++ b/Kernel/NewKit/String.hpp @@ -8,6 +8,7 @@ #include #include +#include #include namespace Kernel @@ -15,7 +16,15 @@ namespace Kernel class StringView final { public: - explicit StringView() = default; + explicit StringView() + { + fSz = 4096; + + fData = new Char[fSz]; + MUST_PASS(fData); + + rt_set_memory(fData, 0, fSz); + } explicit StringView(Size Sz) : fSz(Sz) @@ -23,6 +32,8 @@ namespace Kernel MUST_PASS(Sz > 1); fData = new Char[Sz]; MUST_PASS(fData); + + rt_set_memory(fData, 0, Sz); } ~StringView() diff --git a/Kernel/Sources/Heap.cxx b/Kernel/Sources/Heap.cxx new file mode 100644 index 00000000..6ac91448 --- /dev/null +++ b/Kernel/Sources/Heap.cxx @@ -0,0 +1,219 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies + +------------------------------------------- */ + +#include +#include +#include +#include +#include + +//! @file KernelHeap.cxx +//! @brief Kernel heap allocator. + +#define kKernelHeapMagic (0xD4D7D5) +#define kKernelHeapHeaderPaddingSz (16U) + +namespace Kernel +{ + STATIC SizeT kHeapCount = 0UL; + STATIC PageManager kHeapPageManager; + + namespace Detail + { + /// @brief Kernel heap information block. + /// Located before the address bytes. + /// | HIB | ADDRESS | + struct PACKED HeapInformationBlock final + { + ///! @brief 32-bit value which contains the magic number of the executable. + UInt32 fMagic; + ///! @brief Boolean value which tells if the pointer is allocated. + Boolean fPresent; + ///! @brief 32-bit CRC checksum + UInt32 fCRC32; + /// @brief 64-bit pointer size. + SizeT fTargetPtrSize; + /// @brief 64-bit target pointer. + UIntPtr fTargetPtr; + /// @brief Is this a page pointer? + Boolean fPagePtr; + /// @brief Padding bytes for header. + UInt8 fPadding[kKernelHeapHeaderPaddingSz]; + }; + + typedef HeapInformationBlock* HeapInformationBlockPtr; + } // namespace Detail + + /// @brief Declare a new size for allocatedPtr. + /// @param allocatedPtr the pointer. + /// @return + voidPtr ke_realloc_ke_heap(voidPtr allocatedPtr, SizeT newSz) + { + if (!allocatedPtr || newSz < 1) + return nullptr; + + Detail::HeapInformationBlockPtr heapInfoBlk = + reinterpret_cast( + (UIntPtr)allocatedPtr - sizeof(Detail::HeapInformationBlock)); + + heapInfoBlk->fTargetPtrSize = newSz; + + if (heapInfoBlk->fCRC32 > 0) + { + MUST_PASS(ke_protect_ke_heap(allocatedPtr)); + } + + return allocatedPtr; + } + + /// @brief allocate chunk of memory. + /// @param sz size of pointer + /// @param rw read write (true to enable it) + /// @param user is it accesible by user processes? + /// @return the pointer + VoidPtr ke_new_ke_heap(const SizeT sz, const bool rw, const bool user) + { + auto szFix = sz; + + if (szFix == 0) + ++szFix; + + auto wrapper = kHeapPageManager.Request(rw, user, false, szFix); + + Detail::HeapInformationBlockPtr heapInfo = + reinterpret_cast( + wrapper.VirtualAddress()); + + heapInfo->fTargetPtrSize = szFix; + heapInfo->fMagic = kKernelHeapMagic; + heapInfo->fCRC32 = 0; // dont fill it for now. + heapInfo->fTargetPtr = wrapper.VirtualAddress(); + heapInfo->fPagePtr = 0; + + ++kHeapCount; + + return reinterpret_cast(wrapper.VirtualAddress() + + sizeof(Detail::HeapInformationBlock)); + } + + /// @brief Makes a page heap. + /// @param heapPtr + /// @return + Int32 ke_make_ke_page(VoidPtr heapPtr) + { + if (kHeapCount < 1) + return -kErrorInternal; + if (((IntPtr)heapPtr - sizeof(Detail::HeapInformationBlock)) <= 0) + return -kErrorInternal; + if (((IntPtr)heapPtr - kBadPtr) < 0) + return -kErrorInternal; + + Detail::HeapInformationBlockPtr heapInfoBlk = + reinterpret_cast( + (UIntPtr)heapPtr - sizeof(Detail::HeapInformationBlock)); + + heapInfoBlk->fPagePtr = 1; + + return 0; + } + + /// @brief Declare pointer as free. + /// @param heapPtr the pointer. + /// @return + Int32 ke_delete_ke_heap(VoidPtr heapPtr) + { + if (kHeapCount < 1) + return -kErrorInternal; + if (((IntPtr)heapPtr - sizeof(Detail::HeapInformationBlock)) <= 0) + return -kErrorInternal; + if (((IntPtr)heapPtr - kBadPtr) < 0) + return -kErrorInternal; + + Detail::HeapInformationBlockPtr heapInfoBlk = + reinterpret_cast( + (UIntPtr)heapPtr - sizeof(Detail::HeapInformationBlock)); + + if (heapInfoBlk && heapInfoBlk->fMagic == kKernelHeapMagic) + { + if (!heapInfoBlk->fPresent) + { + return -kErrorHeapNotPresent; + } + + if (heapInfoBlk->fCRC32 != 0) + { + if (heapInfoBlk->fCRC32 != + ke_calculate_crc32((Char*)heapInfoBlk->fTargetPtr, + heapInfoBlk->fTargetPtrSize)) + { + ke_stop(RUNTIME_CHECK_POINTER); + } + } + + heapInfoBlk->fTargetPtrSize = 0UL; + heapInfoBlk->fPresent = false; + heapInfoBlk->fTargetPtr = 0; + heapInfoBlk->fCRC32 = 0; + heapInfoBlk->fMagic = 0; + + PTEWrapper pageWrapper(false, false, false, reinterpret_cast(heapInfoBlk)); + Ref pteAddress{&pageWrapper}; + + kHeapPageManager.Free(pteAddress); + + --kHeapCount; + return 0; + } + + return -kErrorInternal; + } + + /// @brief Check if pointer is a valid kernel pointer. + /// @param heapPtr the pointer + /// @return if it exists. + Boolean ke_is_valid_heap(VoidPtr heapPtr) + { + if (kHeapCount < 1) + return false; + + if (heapPtr) + { + Detail::HeapInformationBlockPtr virtualAddress = + reinterpret_cast( + (UIntPtr)heapPtr - sizeof(Detail::HeapInformationBlock)); + + if (virtualAddress->fPresent && virtualAddress->fMagic == kKernelHeapMagic) + { + return true; + } + } + + return false; + } + + /// @brief Protect the heap with a CRC value. + /// @param heapPtr HIB pointer. + /// @return if it valid: point has crc now., otherwise fail. + Boolean ke_protect_ke_heap(VoidPtr heapPtr) + { + if (heapPtr) + { + Detail::HeapInformationBlockPtr heapInfoBlk = + reinterpret_cast( + (UIntPtr)heapPtr - sizeof(Detail::HeapInformationBlock)); + + if (heapInfoBlk->fPresent && kKernelHeapMagic == heapInfoBlk->fMagic) + { + heapInfoBlk->fCRC32 = + ke_calculate_crc32((Char*)heapInfoBlk->fTargetPtr, heapInfoBlk->fTargetPtrSize); + + return true; + } + } + + return false; + } +} // namespace Kernel diff --git a/Kernel/Sources/KeMain.cxx b/Kernel/Sources/KeMain.cxx deleted file mode 100644 index c06325ba..00000000 --- a/Kernel/Sources/KeMain.cxx +++ /dev/null @@ -1,202 +0,0 @@ -/* ------------------------------------------- - - Copyright ZKA Technologies - - File: KeMain.cxx - Purpose: Kernel main loop. - -------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace Kernel::Detail -{ - /// @brief Filesystem auto installer, additional checks are also done by the class. - class FilesystemInstaller final - { - Kernel::NewFilesystemManager* fNewFS{nullptr}; - - public: - /// @brief wizard constructor. - explicit FilesystemInstaller() - { - if (Kernel::FilesystemManagerInterface::GetMounted()) - { - /// Mounted partition, cool! - Kernel::kcout - << "newoskrnl: No need to create for a NewFS partition here...\r"; - } - else - { - /// Not mounted partition, auto-mount. - ///! Mounts a NewFS block. - fNewFS = new Kernel::NewFilesystemManager(); - - Kernel::FilesystemManagerInterface::Mount(fNewFS); - - if (fNewFS->GetParser()) - { - constexpr auto cFolderInfo = "META-INF"; - const auto cDirCount = 9; - const char* cDirStr[cDirCount] = { - "C:\\Boot\\", "C:\\System\\", "C:\\Support\\", "C:\\Applications\\", - "C:\\Users\\", "C:\\Library\\", "C:\\Mount\\", "C:\\DCIM\\", "C:\\Storage\\"}; - - for (Kernel::SizeT dirIndx = 0UL; dirIndx < cDirCount; ++dirIndx) - { - auto catalogDir = fNewFS->GetParser()->GetCatalog(cDirStr[dirIndx]); - - if (catalogDir) - { - Kernel::kcout << "newoskrnl: already here.\r"; - - delete catalogDir; - continue; - } - - catalogDir = fNewFS->GetParser()->CreateCatalog(cDirStr[dirIndx], 0, - kNewFSCatalogKindDir); - - NewFork theFork{0}; - - const Kernel::Char* cSrcName = cFolderInfo; - - Kernel::rt_copy_memory((Kernel::VoidPtr)(cSrcName), theFork.ForkName, - Kernel::rt_string_len(cSrcName)); - - Kernel::rt_copy_memory((Kernel::VoidPtr)(catalogDir->Name), - theFork.CatalogName, - Kernel::rt_string_len(catalogDir->Name)); - - delete catalogDir; - - theFork.DataSize = kNewFSForkSize; - theFork.ResourceId = 0; - theFork.ResourceKind = Kernel::kNewFSRsrcForkKind; - theFork.Kind = Kernel::kNewFSDataForkKind; - - Kernel::StringView metadataFolder(kNewFSSectorSz); - - metadataFolder += - "

Kind: folder

\r

Created by: system

\r

Edited by: " - "system

\r

Volume Type: Zeta

\r"; - - metadataFolder += "

Path: "; - metadataFolder += cDirStr[dirIndx]; - metadataFolder += "

\r"; - - const Kernel::SizeT metadataSz = kNewFSSectorSz; - - auto catalogSystem = fNewFS->GetParser()->GetCatalog(cDirStr[dirIndx]); - - fNewFS->GetParser()->CreateFork(catalogSystem, theFork); - - fNewFS->GetParser()->WriteCatalog( - catalogSystem, (Kernel::VoidPtr)(metadataFolder.CData()), - metadataSz, cFolderInfo); - - delete catalogSystem; - } - } - - NewCatalog* catalogDisk = - this->fNewFS->GetParser()->GetCatalog("C:\\Mount\\SIM:"); - - const Kernel::Char* cSrcName = "DISK-INF"; - - if (catalogDisk) - { - auto bufferInfoDisk = (Kernel::Char*)this->fNewFS->GetParser()->ReadCatalog(catalogDisk, kNewFSSectorSz, cSrcName); - Kernel::kcout << bufferInfoDisk; - Kernel::end_line(); - - delete bufferInfoDisk; - delete catalogDisk; - } - else - { - catalogDisk = - (NewCatalog*)this->Leak()->CreateAlias("C:\\Mount\\SIM:"); - - Kernel::StringView diskFolder(kNewFSSectorSz); - - diskFolder += - "

Kind: alias to SIM Card

\r

Created by: system

\r

Edited " - "by: " - "system

\r

Volume Type: SIM Card

\r"; - - diskFolder += "

Root: "; - diskFolder += Kernel::NewFilesystemHelper::Root(); - diskFolder += "

\r"; - - NewFork theDiskFork{0}; - - Kernel::rt_copy_memory((Kernel::VoidPtr)(cSrcName), theDiskFork.ForkName, - Kernel::rt_string_len(cSrcName)); - - Kernel::rt_copy_memory((Kernel::VoidPtr)(catalogDisk->Name), - theDiskFork.CatalogName, - Kernel::rt_string_len(catalogDisk->Name)); - - theDiskFork.DataSize = kNewFSForkSize; - theDiskFork.ResourceId = 0; - theDiskFork.ResourceKind = Kernel::kNewFSRsrcForkKind; - theDiskFork.Kind = Kernel::kNewFSDataForkKind; - - fNewFS->GetParser()->CreateFork(catalogDisk, theDiskFork); - fNewFS->GetParser()->WriteCatalog(catalogDisk, - (Kernel::VoidPtr)diskFolder.CData(), - kNewFSSectorSz, cSrcName); - - Kernel::kcout << diskFolder.CData(); - Kernel::end_line(); - - delete catalogDisk; - } - } - } - - ~FilesystemInstaller() = default; - - NEWOS_COPY_DEFAULT(FilesystemInstaller); - - /// @brief Grab the disk's NewFS reference. - /// @return NewFilesystemManager the filesystem interface - Kernel::NewFilesystemManager* Leak() - { - return fNewFS; - } - }; - - /// @brief Loads necessary servers for the kernel -> user mode switch. - /// @param void no args. - /// @return void no return value. - STATIC Kernel::Void ke_user_switch(Kernel::Void) - { - } -} // namespace Kernel::Detail - -/// @brief Application entrypoint. -/// @param Void -/// @return Void -EXTERN_C Kernel::Void KeMain(Kernel::Void) -{ - /// Now run kernel loop, until no process are running. - Kernel::Detail::FilesystemInstaller(); // automatic filesystem creation. - Kernel::Detail::ke_user_switch(); -} diff --git a/Kernel/Sources/KernelHeap.cxx b/Kernel/Sources/KernelHeap.cxx deleted file mode 100644 index 510584dd..00000000 --- a/Kernel/Sources/KernelHeap.cxx +++ /dev/null @@ -1,219 +0,0 @@ -/* ------------------------------------------- - - Copyright ZKA Technologies - -------------------------------------------- */ - -#include -#include -#include -#include -#include - -//! @file KernelHeap.cxx -//! @brief Kernel heap allocator. - -#define kKernelHeapMagic (0xD4D7D5) -#define kKernelHeapHeaderPaddingSz (16U) - -namespace Kernel -{ - STATIC SizeT kHeapCount = 0UL; - STATIC PageManager kHeapPageManager; - - namespace Detail - { - /// @brief Kernel heap information block. - /// Located before the address bytes. - /// | HIB | ADDRESS | - struct PACKED HeapInformationBlock final - { - ///! @brief 32-bit value which contains the magic number of the executable. - UInt32 fMagic; - ///! @brief Boolean value which tells if the pointer is allocated. - Boolean fPresent; - ///! @brief 32-bit CRC checksum - UInt32 fCRC32; - /// @brief 64-bit pointer size. - SizeT fTargetPtrSize; - /// @brief 64-bit target pointer. - UIntPtr fTargetPtr; - /// @brief Is this a page pointer? - Boolean fPagePtr; - /// @brief Padding bytes for header. - UInt8 fPadding[kKernelHeapHeaderPaddingSz]; - }; - - typedef HeapInformationBlock* HeapInformationBlockPtr; - } // namespace Detail - - /// @brief Declare a new size for allocatedPtr. - /// @param allocatedPtr the pointer. - /// @return - voidPtr ke_realloc_ke_heap(voidPtr allocatedPtr, SizeT newSz) - { - if (!allocatedPtr || newSz < 1) - return nullptr; - - Detail::HeapInformationBlockPtr heapInfoBlk = - reinterpret_cast( - (UIntPtr)allocatedPtr - sizeof(Detail::HeapInformationBlock)); - - heapInfoBlk->fTargetPtrSize = newSz; - - if (heapInfoBlk->fCRC32 > 0) - { - MUST_PASS(ke_protect_ke_heap(allocatedPtr)); - } - - return allocatedPtr; - } - - /// @brief allocate chunk of memory. - /// @param sz size of pointer - /// @param rw read write (true to enable it) - /// @param user is it accesible by user processes? - /// @return the pointer - VoidPtr ke_new_ke_heap(const SizeT sz, const bool rw, const bool user) - { - auto szFix = sz; - - if (szFix == 0) - ++szFix; - - auto wrapper = kHeapPageManager.Request(rw, user, false, szFix); - - Detail::HeapInformationBlockPtr heapInfo = - reinterpret_cast( - wrapper.VirtualAddress()); - - heapInfo->fTargetPtrSize = szFix; - heapInfo->fMagic = kKernelHeapMagic; - heapInfo->fCRC32 = 0; // dont fill it for now. - heapInfo->fTargetPtr = wrapper.VirtualAddress(); - heapInfo->fPagePtr = 0; - - ++kHeapCount; - - return reinterpret_cast(wrapper.VirtualAddress() + - sizeof(Detail::HeapInformationBlock)); - } - - /// @brief Makes a page heap. - /// @param heapPtr - /// @return - Int32 ke_make_ke_page(VoidPtr heapPtr) - { - if (kHeapCount < 1) - return -kErrorInternal; - if (((IntPtr)heapPtr - sizeof(Detail::HeapInformationBlock)) <= 0) - return -kErrorInternal; - if (((IntPtr)heapPtr - kBadPtr) < 0) - return -kErrorInternal; - - Detail::HeapInformationBlockPtr heapInfoBlk = - reinterpret_cast( - (UIntPtr)heapPtr - sizeof(Detail::HeapInformationBlock)); - - heapInfoBlk->fPagePtr = 1; - - return 0; - } - - /// @brief Declare pointer as free. - /// @param heapPtr the pointer. - /// @return - Int32 ke_delete_ke_heap(VoidPtr heapPtr) - { - if (kHeapCount < 1) - return -kErrorInternal; - if (((IntPtr)heapPtr - sizeof(Detail::HeapInformationBlock)) <= 0) - return -kErrorInternal; - if (((IntPtr)heapPtr - kBadPtr) < 0) - return -kErrorInternal; - - Detail::HeapInformationBlockPtr heapInfoBlk = - reinterpret_cast( - (UIntPtr)heapPtr - sizeof(Detail::HeapInformationBlock)); - - if (heapInfoBlk && heapInfoBlk->fMagic == kKernelHeapMagic) - { - if (!heapInfoBlk->fPresent) - { - return -kErrorHeapNotPresent; - } - - if (heapInfoBlk->fCRC32 != 0) - { - if (heapInfoBlk->fCRC32 != - ke_calculate_crc32((Char*)heapInfoBlk->fTargetPtr, - heapInfoBlk->fTargetPtrSize)) - { - ke_stop(RUNTIME_CHECK_POINTER); - } - } - - heapInfoBlk->fTargetPtrSize = 0UL; - heapInfoBlk->fPresent = false; - heapInfoBlk->fTargetPtr = 0; - heapInfoBlk->fCRC32 = 0; - heapInfoBlk->fMagic = 0; - - PTEWrapper pageWrapper(false, false, false, reinterpret_cast(heapInfoBlk)); - Ref pteAddress{&pageWrapper}; - - kHeapPageManager.Free(pteAddress); - - --kHeapCount; - return 0; - } - - return -kErrorInternal; - } - - /// @brief Check if pointer is a valid kernel pointer. - /// @param heapPtr the pointer - /// @return if it exists. - Boolean ke_is_valid_heap(VoidPtr heapPtr) - { - if (kHeapCount < 1) - return false; - - if (heapPtr) - { - Detail::HeapInformationBlockPtr virtualAddress = - reinterpret_cast( - (UIntPtr)heapPtr - sizeof(Detail::HeapInformationBlock)); - - if (virtualAddress->fPresent && virtualAddress->fMagic == kKernelHeapMagic) - { - return true; - } - } - - return false; - } - - /// @brief Protect the heap with a CRC value. - /// @param heapPtr HIB pointer. - /// @return if it valid: point has crc now., otherwise fail. - Boolean ke_protect_ke_heap(VoidPtr heapPtr) - { - if (heapPtr) - { - Detail::HeapInformationBlockPtr heapInfoBlk = - reinterpret_cast( - (UIntPtr)heapPtr - sizeof(Detail::HeapInformationBlock)); - - if (heapInfoBlk->fPresent && kKernelHeapMagic == heapInfoBlk->fMagic) - { - heapInfoBlk->fCRC32 = - ke_calculate_crc32((Char*)heapInfoBlk->fTargetPtr, heapInfoBlk->fTargetPtrSize); - - return true; - } - } - - return false; - } -} // namespace Kernel diff --git a/Kernel/Sources/Main.cxx b/Kernel/Sources/Main.cxx new file mode 100644 index 00000000..8c80d70c --- /dev/null +++ b/Kernel/Sources/Main.cxx @@ -0,0 +1,199 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies + + File: Main.cxx + Purpose: Main entrypoint of kernel. + +------------------------------------------- */ + +#include "KernelKit/DebugOutput.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +EXTERN Kernel::Property cKernelVersion; + +namespace Kernel::Detail +{ + /// @brief Filesystem auto installer, additional checks are also done by the class. + class FilesystemInstaller final + { + Kernel::NewFilesystemManager* fNewFS{nullptr}; + + public: + /// @brief wizard constructor. + explicit FilesystemInstaller() + { + if (Kernel::FilesystemManagerInterface::GetMounted()) + { + /// Mounted partition, cool! + Kernel::kcout + << "newoskrnl: No need to create for a NewFS+EPM partition here...\r"; + } + else + { + /// Not mounted partition, auto-mount. + ///! Mounts a NewFS block. + fNewFS = new Kernel::NewFilesystemManager(); + + Kernel::FilesystemManagerInterface::Mount(fNewFS); + + if (fNewFS->GetParser()) + { + constexpr auto cFolderInfo = "META-INF"; + const auto cDirCount = 9; + const char* cDirStr[cDirCount] = { + "C:\\Boot\\", "C:\\System\\", "C:\\Support\\", "C:\\Applications\\", + "C:\\Users\\", "C:\\Library\\", "C:\\Mount\\", "C:\\DCIM\\", "C:\\Storage\\"}; + + for (Kernel::SizeT dirIndx = 0UL; dirIndx < cDirCount; ++dirIndx) + { + auto catalogDir = fNewFS->GetParser()->GetCatalog(cDirStr[dirIndx]); + + if (catalogDir) + { + Kernel::kcout << "newoskrnl: already exists.\r"; + + delete catalogDir; + continue; + } + + catalogDir = fNewFS->GetParser()->CreateCatalog(cDirStr[dirIndx], 0, + kNewFSCatalogKindDir); + + NewFork theFork{0}; + + const Kernel::Char* cSrcName = cFolderInfo; + + Kernel::rt_copy_memory((Kernel::VoidPtr)(cSrcName), theFork.ForkName, + Kernel::rt_string_len(cSrcName)); + + Kernel::rt_copy_memory((Kernel::VoidPtr)(catalogDir->Name), + theFork.CatalogName, + Kernel::rt_string_len(catalogDir->Name)); + + delete catalogDir; + + theFork.DataSize = kNewFSForkSize; + theFork.ResourceId = 0; + theFork.ResourceKind = Kernel::kNewFSRsrcForkKind; + theFork.Kind = Kernel::kNewFSDataForkKind; + + Kernel::StringView metadataFolder(kNewFSSectorSz); + + metadataFolder += + "

Kind: folder

\r

Created by: system

\r

Edited by: " + "system

\r

Volume Type: Zeta

\r"; + + metadataFolder += "

Path: "; + metadataFolder += cDirStr[dirIndx]; + metadataFolder += "

\r"; + + const Kernel::SizeT metadataSz = kNewFSSectorSz; + + auto catalogSystem = fNewFS->GetParser()->GetCatalog(cDirStr[dirIndx]); + + fNewFS->GetParser()->CreateFork(catalogSystem, theFork); + + fNewFS->GetParser()->WriteCatalog( + catalogSystem, (Kernel::VoidPtr)(metadataFolder.CData()), + metadataSz, cFolderInfo); + + delete catalogSystem; + } + } + + NewCatalog* catalogDisk = + this->fNewFS->GetParser()->GetCatalog("C:\\Mount\\SIM:"); + + const Kernel::Char* cSrcName = "DISK-INF"; + + if (catalogDisk) + { + delete catalogDisk; + } + else + { + catalogDisk = + (NewCatalog*)this->Leak()->CreateAlias("C:\\Mount\\SIM:"); + + Kernel::StringView diskFolder(kNewFSSectorSz); + + diskFolder += + "

Kind: alias to SIM Card

\r

Created by: system

\r

Edited " + "by: " + "system

\r

Volume Type: SIM Card

\r"; + + diskFolder += "

Root: "; + diskFolder += Kernel::NewFilesystemHelper::Root(); + diskFolder += "

\r"; + + NewFork theDiskFork{0}; + + Kernel::rt_copy_memory((Kernel::VoidPtr)(cSrcName), theDiskFork.ForkName, + Kernel::rt_string_len(cSrcName)); + + Kernel::rt_copy_memory((Kernel::VoidPtr)(catalogDisk->Name), + theDiskFork.CatalogName, + Kernel::rt_string_len(catalogDisk->Name)); + + theDiskFork.DataSize = kNewFSForkSize; + theDiskFork.ResourceId = 0; + theDiskFork.ResourceKind = Kernel::kNewFSRsrcForkKind; + theDiskFork.Kind = Kernel::kNewFSDataForkKind; + + fNewFS->GetParser()->CreateFork(catalogDisk, theDiskFork); + fNewFS->GetParser()->WriteCatalog(catalogDisk, + (Kernel::VoidPtr)diskFolder.CData(), + kNewFSSectorSz, cSrcName); + + delete catalogDisk; + } + } + } + + ~FilesystemInstaller() = default; + + NEWOS_COPY_DEFAULT(FilesystemInstaller); + + /// @brief Grab the disk's NewFS reference. + /// @return NewFilesystemManager the filesystem interface + Kernel::NewFilesystemManager* Leak() + { + return fNewFS; + } + }; + + /// @brief Loads necessary servers for the kernel -> user mode switch. + /// @param void no args. + /// @return void no return value. + STATIC Kernel::Void ke_user_switch(Kernel::Void) + { + Kernel::kcout << "newoskrnl: " << cKernelVersion.GetKey().CData() << ": " << Kernel::number(cKernelVersion.GetValue()) << Kernel::endl; + } +} // namespace Kernel::Detail + +/// @brief Application entrypoint. +/// @param Void +/// @return Void +EXTERN_C Kernel::Void KeMain(Kernel::Void) +{ + /// Now run kernel loop, until no process are running. + Kernel::Detail::FilesystemInstaller(); // automatic filesystem creation. + Kernel::Detail::ke_user_switch(); +} diff --git a/Kernel/Sources/New+Delete.cxx b/Kernel/Sources/New+Delete.cxx index 32a76769..2921e079 100644 --- a/Kernel/Sources/New+Delete.cxx +++ b/Kernel/Sources/New+Delete.cxx @@ -4,7 +4,7 @@ ------------------------------------------- */ -#include +#include #include void* operator new[](size_t sz) diff --git a/Kernel/Sources/NewFS+FileManager.cxx b/Kernel/Sources/NewFS+FileManager.cxx index 3ff675bc..146f721d 100644 --- a/Kernel/Sources/NewFS+FileManager.cxx +++ b/Kernel/Sources/NewFS+FileManager.cxx @@ -5,7 +5,7 @@ ------------------------------------------- */ #include -#include +#include #ifdef __FSKIT_USE_NEWFS__ diff --git a/Kernel/Sources/PEFCodeManager.cxx b/Kernel/Sources/PEFCodeManager.cxx index a39dc158..8b1918ef 100644 --- a/Kernel/Sources/PEFCodeManager.cxx +++ b/Kernel/Sources/PEFCodeManager.cxx @@ -5,7 +5,7 @@ ------------------------------------------- */ #include -#include +#include #include #include #include diff --git a/Kernel/Sources/ProcessScheduler.cxx b/Kernel/Sources/ProcessScheduler.cxx index 42e7285a..a536bf52 100644 --- a/Kernel/Sources/ProcessScheduler.cxx +++ b/Kernel/Sources/ProcessScheduler.cxx @@ -11,7 +11,7 @@ #include #include -#include +#include #include #include @@ -29,14 +29,9 @@ namespace Kernel STATIC Int32 cLastExitCode = 0U; - /// @brief Gets the latest exit code. + /// @brief Gets the last exit code. /// @note Not thread-safe. /// @return Int32 the last exit code. - const Int32& ProcessHeader::GetExitCode() noexcept - { - return fLastExitCode; - } - const Int32& rt_get_exit_code() noexcept { return cLastExitCode; @@ -55,6 +50,14 @@ namespace Kernel this->Exit(kErrorProcessFault); } + /// @brief Gets the local last exit code. + /// @note Not thread-safe. + /// @return Int32 the last exit code. + const Int32& ProcessHeader::GetExitCode() noexcept + { + return this->fLastExitCode; + } + Int32& ProcessHeader::GetLocalCode() noexcept { return fLocalCode; @@ -76,13 +79,13 @@ namespace Kernel { ErrLocal() = kErrorHeapOutOfMemory; - /* we're going out of memory */ + /* We're going out of memory! crash... */ this->Crash(); return nullptr; } - this->HeapCursor = (VoidPtr)((UIntPtr)this->HeapCursor + (sizeof(sz))); + this->HeapCursor = reinterpret_cast((UIntPtr)this->HeapCursor + (sizeof(sz))); VoidPtr ptr = this->HeapCursor; ++this->UsedMemory; @@ -97,21 +100,17 @@ namespace Kernel /***********************************************************************************/ /* @brief checks if runtime pointer is in region. */ - bool rt_is_in_pool(VoidPtr pool_ptr, VoidPtr pool, const SizeT& sz) + bool rt_is_in_pool(VoidPtr pool_ptr, VoidPtr pool, const SizeT& pool_ptr_cur_sz, const SizeT& pool_ptr_used_sz) { - UIntPtr* _pool_ptr = (UIntPtr*)pool_ptr; - UIntPtr* _pool = (UIntPtr*)pool; - - for (SizeT index = sz; _pool[sz] != kUserHeapMag; --index) - { - if (&_pool[index] > &_pool_ptr[sz]) - continue; + if (pool == nullptr || + pool_ptr == nullptr) + return false; - if (_pool[index] == _pool_ptr[index]) - return true; - } + UIntPtr* uint_pool_ptr = (UIntPtr*)pool_ptr; + UIntPtr* uint_pool = (UIntPtr*)pool; - return false; + return (UIntPtr)&uint_pool > (UIntPtr)&uint_pool_ptr && + pool_ptr_cur_sz > pool_ptr_used_sz; } /* @brief free pointer from usage. */ @@ -124,7 +123,7 @@ namespace Kernel if (this->UsedMemory < 1) return false; - if (rt_is_in_pool(ptr, this->HeapCursor, this->UsedMemory)) + if (rt_is_in_pool(ptr, this->HeapCursor, this->UsedMemory, this->FreeMemory)) { this->HeapCursor = (VoidPtr)((UIntPtr)this->HeapCursor - (sizeof(sz))); rt_zero_memory(ptr, sz); diff --git a/Kernel/Sources/Property.cxx b/Kernel/Sources/Property.cxx index 47969bd5..60bd03da 100644 --- a/Kernel/Sources/Property.cxx +++ b/Kernel/Sources/Property.cxx @@ -8,21 +8,19 @@ namespace Kernel { - Property::Property(const StringView& sw) - : fName(sw) - { - kcout << "newoskrnl: Property created: " << sw.CData(); - endl; - } - Property::~Property() = default; bool Property::StringEquals(StringView& name) { - return fName && this->fName == name; + return this->fName && this->fName == name; + } + + StringView& Property::GetKey() + { + return this->fName; } - const PropertyId& Property::GetPropertyById() + PropertyId& Property::GetValue() { return fAction; } diff --git a/Kernel/Sources/String.cxx b/Kernel/Sources/String.cxx index 2b58d551..2ed52029 100644 --- a/Kernel/Sources/String.cxx +++ b/Kernel/Sources/String.cxx @@ -22,7 +22,7 @@ namespace Kernel Size StringView::Length() const { - return rt_string_len(fData); + return fSz; } bool StringView::operator==(const StringView& rhs) const @@ -214,22 +214,25 @@ namespace Kernel return ret; } - static void string_append(char* lhs, char* rhs, int cur) + STATIC void rt_string_append(Char* lhs, Char* rhs, Int cur) { - if (lhs && rhs) - { - SizeT sz_rhs = rt_string_len(rhs); - - if (sz_rhs == 0) - return; + SizeT sz_rhs = rt_string_len(rhs); + SizeT rhs_i = 0; - rt_copy_memory(rhs, lhs + cur, sz_rhs); + for (; rhs_i < sz_rhs; ++rhs_i) + { + lhs[rhs_i + cur] = rhs[rhs_i]; } + + lhs[rhs_i + cur] = 0; } StringView& StringView::operator+=(const Char* rhs) { - string_append(this->fData, const_cast(rhs), this->fCur); + if (rt_string_len(rhs) > this->Length()) + return *this; + + rt_string_append(this->fData, const_cast(rhs), this->fCur); this->fCur += rt_string_len(rhs); return *this; @@ -237,11 +240,11 @@ namespace Kernel StringView& StringView::operator+=(const StringView& rhs) { - if (rt_string_len(rhs.fData) > rt_string_len(this->fData)) + if (rt_string_len(rhs.fData) > this->Length()) return *this; - string_append(this->fData, const_cast(rhs.fData), this->fCur); - this->fCur += rt_string_len(const_cast(rhs.fData)); + rt_string_append(this->fData, const_cast(rhs.fData), this->fCur); + this->fCur += rt_string_len(const_cast(rhs.fData)); return *this; } diff --git a/Kernel/Sources/ThreadLocalStorage.cxx b/Kernel/Sources/ThreadLocalStorage.cxx index f5fc2d3e..245ffa1c 100644 --- a/Kernel/Sources/ThreadLocalStorage.cxx +++ b/Kernel/Sources/ThreadLocalStorage.cxx @@ -7,6 +7,8 @@ * ======================================================== */ +#include +#include #include #include @@ -14,11 +16,13 @@ /***********************************************************************************/ /// @file ThreadLocalStorage.cxx -/// @brief TLS implementation in kernel. +/// @brief TLS inside the kernel. /***********************************************************************************/ using namespace Kernel; +Kernel::Property cTLSEnforceCheck; + /** * @brief Check for cookie inside TIB. * @param tib the TIB to check. @@ -33,7 +37,7 @@ Boolean tls_check_tib(ThreadInformationBlock* tib) Encoder encoder; const char* tibAsBytes = encoder.AsBytes(tib); - kcout << "newoskrnl: Checking for a valid cookie...\r"; + kcout << "newoskrnl: checking for a valid cookie...\r"; return tibAsBytes[0] == kCookieMag0 && tibAsBytes[1] == kCookieMag1 && tibAsBytes[2] == kCookieMag2; @@ -44,18 +48,28 @@ Boolean tls_check_tib(ThreadInformationBlock* tib) * @param stackPtr The call frame. * @return */ -EXTERN_C Void tls_check_syscall_impl(Kernel::VoidPtr TIB) noexcept +EXTERN_C Void tls_check_syscall_impl(Kernel::VoidPtr tib_ptr) noexcept { - if (!TIB) - return; + if (!tib_ptr) + { + if (cTLSEnforceCheck.GetValue() == No) + { + return; + } + else + { + kcout << "newoskrnl: crashing because of an invalid TIB...\r"; + ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); + } + } - ThreadInformationBlock* tib = (ThreadInformationBlock*)TIB; + ThreadInformationBlock* tib_struct = (ThreadInformationBlock*)tib_ptr; - if (!tls_check_tib(tib)) + if (!tls_check_tib(tib_struct)) { kcout << "newoskrnl: crashing because of an invalid TIB...\r"; ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); } - kcout << "newoskrnl: Verification succeeded! Keeping on...\r"; + kcout << "newoskrnl: Verification succeeded! staying alive...\r"; } diff --git a/Kernel/Sources/Utils.cxx b/Kernel/Sources/Utils.cxx index b152888b..12e2e2a8 100644 --- a/Kernel/Sources/Utils.cxx +++ b/Kernel/Sources/Utils.cxx @@ -48,15 +48,14 @@ namespace Kernel Size rt_string_len(const Char* ptr) { - if (!ptr) + if (*ptr == 0) return 0; SizeT cnt = 0; - while (*ptr != (Char)0) + while (ptr[cnt] != (Char)0) { - ++ptr; - ++cnt; + cnt++; } return cnt; -- cgit v1.2.3