diff options
Diffstat (limited to 'dev')
37 files changed, 315 insertions, 259 deletions
diff --git a/dev/CRT/__ndk_runtime.cxx b/dev/CRT/Sources/__ndk_runtime.cxx index fc63b12d..f9a4abc6 100644 --- a/dev/CRT/__ndk_runtime.cxx +++ b/dev/CRT/Sources/__ndk_runtime.cxx @@ -7,6 +7,6 @@ #include <CRT/__ndk_alloca.hxx>
#include <CRT/__ndk_defines.hxx>
#include <CRT/__ndk_exception.hxx>
-#include <CRTKIt/__ndk_new_delete.hxx>
+#include <CRT/__ndk_new_delete.hxx>
/// @note No sources needed for now.
diff --git a/dev/CRT/__ndk_new_delete.hxx b/dev/CRT/__ndk_new_delete.hxx index 464ea334..79b5c805 100644 --- a/dev/CRT/__ndk_new_delete.hxx +++ b/dev/CRT/__ndk_new_delete.hxx @@ -7,7 +7,6 @@ #pragma once #include <CRT/__ndk_defines.hxx> -#include <SCIKit/SCIBase.hxx> namespace stdx { @@ -27,35 +26,3 @@ namespace stdx delete ptr; } } // namespace stdx - -void* operator new(size_type len) -{ - if (!len) - ++len; - - return RtlCreateHeap(len, 0); -} - -void operator delete(void* ptr) -{ - if (!ptr) - return; - - RtlDestroyHeap(ptr); -} - -void* operator new[](size_type len) -{ - if (!len) - ++len; - - return RtlCreateHeap(len, 0); -} - -void operator delete[](void* ptr) -{ - if (!ptr) - return; - - RtlDestroyHeap(ptr); -} diff --git a/dev/CRT/build.json b/dev/CRT/build.json index 2d4c0c1e..d91b6131 100644 --- a/dev/CRT/build.json +++ b/dev/CRT/build.json @@ -1,10 +1,20 @@ -{
- "compiler_path": "x86_64-w64-mingw32-g++",
- "compiler_std": "c++20",
- "headers_path": ["../", "./"],
- "sources_path": ["*.cxx"],
- "output_name": "ndkcrt.dll",
- "compiler_flags": ["-ffreestanding", "-shared", "-fno-rtti", "-fno-exceptions", " -Wl,--subsystem=17"],
- "cpp_macros": ["__CRT_AMD64__", "cCRTVersion=0x0100", "cEFSVersionHighest=0x0100", "cEFSVersionLowest=0x0100"]
- }
-
\ No newline at end of file +{ + "compiler_path": "x86_64-w64-mingw32-g++", + "compiler_std": "c++20", + "headers_path": ["../", "./"], + "sources_path": ["Sources/*.cxx"], + "output_name": "ndkcrt.dll", + "compiler_flags": [ + "-ffreestanding", + "-shared", + "-fno-rtti", + "-fno-exceptions", + " -Wl,--subsystem=17" + ], + "cpp_macros": [ + "__CRT_AMD64__", + "cCRTVersion=0x0100", + "cEFSVersionHighest=0x0100", + "cEFSVersionLowest=0x0100" + ] +} diff --git a/dev/DDK/KernelAlloc.c b/dev/DDK/KernelAlloc.c index 76d26ee8..56dfd6a4 100644 --- a/dev/DDK/KernelAlloc.c +++ b/dev/DDK/KernelAlloc.c @@ -6,7 +6,7 @@ ------------------------------------------- */ -#include <DDKit/KernelStd.h> +#include <DDK/KernelStd.h> /** \brief Allocates a new heap on the kernel's side. diff --git a/dev/DDK/KernelCall.c b/dev/DDK/KernelCall.c index 17e6640d..c0a6ed15 100644 --- a/dev/DDK/KernelCall.c +++ b/dev/DDK/KernelCall.c @@ -6,7 +6,7 @@ ------------------------------------------- */ -#include <DDKit/KernelStd.h> +#include <DDK/KernelStd.h> #include <stdarg.h> /// @brief this is an internal call, do not use it. diff --git a/dev/DDK/KernelCxxRt.cxx b/dev/DDK/KernelCxxRt.cxx index 82ea8e85..5122ba40 100644 --- a/dev/DDK/KernelCxxRt.cxx +++ b/dev/DDK/KernelCxxRt.cxx @@ -6,7 +6,7 @@ ------------------------------------------- */ -#include <DDKit/KernelStd.h> +#include <DDK/KernelStd.h> void* operator new(size_t sz) { diff --git a/dev/DDK/KernelDev.c b/dev/DDK/KernelDev.c index 5ed482b9..df61e35d 100644 --- a/dev/DDK/KernelDev.c +++ b/dev/DDK/KernelDev.c @@ -6,8 +6,8 @@ ------------------------------------------- */ -#include <DDKit/KernelDev.h> -#include <DDKit/KernelString.h> +#include <DDK/KernelDev.h> +#include <DDK/KernelString.h> /// @brief Open a new binary device from path. DK_EXTERN kernelDeviceRef kernelOpenDevice(const char* devicePath) diff --git a/dev/DDK/KernelDev.h b/dev/DDK/KernelDev.h index e99cb0a7..c2328d40 100644 --- a/dev/DDK/KernelDev.h +++ b/dev/DDK/KernelDev.h @@ -8,7 +8,7 @@ #pragma once -#include <DDKit/KernelStd.h> +#include <DDK/KernelStd.h> struct _kernelDevice; diff --git a/dev/DDK/KernelPrint.c b/dev/DDK/KernelPrint.c index 148803b7..a885ddd4 100644 --- a/dev/DDK/KernelPrint.c +++ b/dev/DDK/KernelPrint.c @@ -6,7 +6,7 @@ ------------------------------------------- */ -#include <DDKit/KernelPrint.h> +#include <DDK/KernelPrint.h> DK_EXTERN void kernelPrintChar(const char ch) { diff --git a/dev/DDK/KernelPrint.h b/dev/DDK/KernelPrint.h index 49021377..d3c2c523 100644 --- a/dev/DDK/KernelPrint.h +++ b/dev/DDK/KernelPrint.h @@ -8,7 +8,7 @@ #pragma once -#include <DDKit/KernelString.h> +#include <DDK/KernelString.h> /// @brief print character into UART. DK_EXTERN void kernelPrintChar(const char ch); diff --git a/dev/DDK/KernelString.c b/dev/DDK/KernelString.c index 410ce826..63157ec2 100644 --- a/dev/DDK/KernelString.c +++ b/dev/DDK/KernelString.c @@ -6,7 +6,7 @@ ------------------------------------------- */ -#include <DDKit/KernelString.h> +#include <DDK/KernelString.h> DK_EXTERN size_t kernelStringLength(const char* in) { diff --git a/dev/DDK/KernelString.h b/dev/DDK/KernelString.h index a0b811dc..02d2c067 100644 --- a/dev/DDK/KernelString.h +++ b/dev/DDK/KernelString.h @@ -8,7 +8,7 @@ #pragma once -#include <DDKit/KernelStd.h> +#include <DDK/KernelStd.h> /// @brief DDK equivalent of POSIX's string.h /// @file kernelString.h diff --git a/dev/SCI/SCIBase.hxx b/dev/SCI/SCIBase.hxx index b902b5fa..fca89a1a 100644 --- a/dev/SCI/SCIBase.hxx +++ b/dev/SCI/SCIBase.hxx @@ -12,7 +12,7 @@ Purpose: SCI/M core header file (C++) #ifdef __cplusplus
-#include <SCIKit/Hint.hxx>
+#include <SCI/Hint.hxx>
#define IMPORT_CXX extern "C++"
#define IMPORT_C extern "C"
@@ -39,7 +39,7 @@ typedef __UINTPTR_TYPE__ UIntPtr; typedef char Char;
#ifdef __SCI_IMPL__
-#include <SCIKit/scm.internal.inl>
+#include <SCI/scm.internal.inl>
#else
class UnknownInterface; // Refrenced from an IDB entry.
class UnknownUCLSID; // From the IDB, the constructor of the object, e.g: WordUCLSID.
@@ -113,14 +113,14 @@ typedef NEW_OBJECT COMP_OBJECT; IMPORT_C VoidPtr RtlGetDLLProc(_Input const Char* symbol, _Input NEW_OBJECT dll_handle);
/// @brief Open DLL handle.
-/// @param path
-/// @param drv
-/// @return
+/// @param path
+/// @param drv
+/// @return
IMPORT_C NEW_OBJECT RtlOpenDLL(_Input const Char* path, _Input const Char* drive_letter);
/// @brief Close DLL handle
-/// @param dll_handle
-/// @return
+/// @param dll_handle
+/// @return
IMPORT_C UInt0 RtlCloseDLL(_Input NEW_OBJECT dll_handle);
/// @note Part of NK file API.
@@ -133,7 +133,7 @@ IMPORT_C NEW_OBJECT RtlOpenFile(const Char* fs_path, const Char* drive_letter); /// @brief Closes a file and flushes its content.
/// @param file_desc the file descriptor.
-/// @return
+/// @return
IMPORT_C UInt0 RtlCloseFile(_Input NEW_OBJECT file_desc);
/// @brief Installs the TIB and GIB inside the current process.
@@ -178,8 +178,8 @@ UInt0 RtlDestroyHeap(_Input VoidPtr heap); #else
-#include <SCIKit/SCIBase.h>
+#include <SCI/SCIBase.h>
#endif // ifdef __cplusplus
-#endif // ifndef __SCI_BASE_HXX__
\ No newline at end of file +#endif // ifndef __SCI_BASE_HXX__
diff --git a/dev/SCI/SCIErr.hxx b/dev/SCI/SCIErr.hxx index aa3e72e4..af5d54fd 100644 --- a/dev/SCI/SCIErr.hxx +++ b/dev/SCI/SCIErr.hxx @@ -6,7 +6,7 @@ #pragma once -#include <SCIKit/SCIBase.hxx> +#include <SCI/SCIBase.hxx> #define ErrLocalIsOk() (kLastError == kErrorSuccess) #define ErrLocalFailed() (kLastError != kErrorSuccess) diff --git a/dev/SCI/SCIBase.cxx b/dev/SCI/Sources/SCIBase.cxx index 628bfd67..b103886c 100644 --- a/dev/SCI/SCIBase.cxx +++ b/dev/SCI/Sources/SCIBase.cxx @@ -4,4 +4,4 @@ ------------------------------------------- */
-#include <SCIKit/SCIBase.hxx>
\ No newline at end of file +#include <SCI/SCIBase.hxx>
diff --git a/dev/SCI/SCIErr.cxx b/dev/SCI/Sources/SCIErr.cxx index b0766944..509ccd6d 100644 --- a/dev/SCI/SCIErr.cxx +++ b/dev/SCI/Sources/SCIErr.cxx @@ -4,6 +4,6 @@ ------------------------------------------- */
-#include <SCIKit/SCIErr.hxx>
+#include <SCI/SCIErr.hxx>
-NEW_ERROR_TYPE kLastError = 0;
\ No newline at end of file +NEW_ERROR_TYPE kLastError = 0;
diff --git a/dev/SCI/build.json b/dev/SCI/build.json index 9bc72bfa..0c367bd6 100644 --- a/dev/SCI/build.json +++ b/dev/SCI/build.json @@ -1,10 +1,21 @@ -{
- "compiler_path": "x86_64-w64-mingw32-g++.exe",
- "compiler_std": "c++20",
- "headers_path": ["../"],
- "sources_path": ["*.cxx"],
- "output_name": "sci.dll",
- "compiler_flags": ["-fPIC", "-ffreestanding", "-shared", "-fno-rtti", "-fno-exceptions", "-Wl,--subsystem=17"],
- "cpp_macros": ["__SCI_IMPL__", "cSCIVersion=0x0100", "cSCIVersionHighest=0x0100", "cSCIVersionLowest=0x0100"]
- }
-
\ No newline at end of file +{ + "compiler_path": "x86_64-w64-mingw32-g++", + "compiler_std": "c++20", + "headers_path": ["../"], + "sources_path": ["Sources/*.cxx"], + "output_name": "sci.dll", + "compiler_flags": [ + "-fPIC", + "-ffreestanding", + "-shared", + "-fno-rtti", + "-fno-exceptions", + "-Wl,--subsystem=17" + ], + "cpp_macros": [ + "__SCI_IMPL__", + "cSCIVersion=0x0100", + "cSCIVersionHighest=0x0100", + "cSCIVersionLowest=0x0100" + ] +} diff --git a/dev/ZBA/BootKit/BootKit.hxx b/dev/ZBA/BootKit/BootKit.hxx index c0539133..c4d415f4 100644 --- a/dev/ZBA/BootKit/BootKit.hxx +++ b/dev/ZBA/BootKit/BootKit.hxx @@ -36,7 +36,7 @@ class BTextWriter; class BFileReader; -class BFileRunner; +class BThread; class BVersionString; typedef Char* PEFImagePtr; @@ -145,7 +145,7 @@ typedef UInt8* BlobType; class BVersionString final { public: - static const CharacterTypeUTF16* The() + static const CharacterTypeUTF8* The() { return BOOTLOADER_VERSION; } @@ -284,7 +284,8 @@ private: --partBlock.FreeCatalog; --partBlock.FreeSectors; - writer.Write(L"newosldr: root directory: ").Write(blob->fFileName).Write(L"\r"); + writer.Write(L"newosldr: Wrote directory: ").Write(blob->fFileName).Write(L"\r"); + writer.Write(L"newosldr: disk formatted.\r"); CopyMem(catalogKind->Name, blob->fFileName, StrLen(blob->fFileName)); @@ -373,9 +374,6 @@ inline Boolean BDiskFormatFactory<BootDev>::Format(const char* partName, CopyMem(epmBoot->Name, reinterpret_cast<VoidPtr>(const_cast<Char*>(cBlockName)), StrLen(cBlockName)); CopyMem(epmBoot->Magic, reinterpret_cast<VoidPtr>(const_cast<Char*>(kEPMMagic)), StrLen(kEPMMagic)); - BTextWriter writer; - writer.Write(L"newosldr: wrote partition with success.\r"); - fDiskDev.Leak().mBase = kEpmBase; fDiskDev.Leak().mSize = sectorSz; diff --git a/dev/ZBA/BootKit/Thread.hxx b/dev/ZBA/BootKit/Thread.hxx index 58b9683d..3946f6eb 100644 --- a/dev/ZBA/BootKit/Thread.hxx +++ b/dev/ZBA/BootKit/Thread.hxx @@ -14,20 +14,20 @@ namespace Boot { using namespace Kernel; - class Thread; + class BThread; /// @brief Program loader class /// @package nl.zeta.boot.api - class Thread final + class BThread final { public: - explicit Thread() = delete; - ~Thread() = default; + explicit BThread() = delete; + ~BThread() = default; - explicit Thread(Kernel::VoidPtr blob); + explicit BThread(Kernel::VoidPtr blob); - Thread& operator=(const Thread&) = default; - Thread(const Thread&) = default; + BThread& operator=(const BThread&) = default; + BThread(const BThread&) = default; void Start(HEL::HandoverInformationHeader* handover); const char* GetName(); @@ -35,7 +35,7 @@ namespace Boot bool IsValid(); private: - Char fBlobName[255] = { "Boot Thread" }; + Char fBlobName[255] = { "BootThread" }; VoidPtr fStartAddress{nullptr}; VoidPtr fBlob{nullptr}; }; diff --git a/dev/ZBA/Sources/HEL/AMD64/BootJump.S b/dev/ZBA/Sources/HEL/AMD64/BootJump.S index 7c2fcbc4..2eb745d0 100644 --- a/dev/ZBA/Sources/HEL/AMD64/BootJump.S +++ b/dev/ZBA/Sources/HEL/AMD64/BootJump.S @@ -1,4 +1,5 @@ .global rt_jump_to_address +.global rt_reset_hardware .text .text @@ -19,3 +20,30 @@ rt_jump_to_address: pop rax ret + +.code16 + +rt_reset_hardware: + /* dont raise any interrupts. (except ofc NMIs.) */ + cli +wait_gate1: + /* wait for gate 1 to be ready? */ + in al,0x64 + and al,2 + jnz wait_gate1 + mov al,0x0D1 + out 0x64,al +wait_gate2: + /* wait for gate 2 to be ready? */ + in al,0x64 + and al,2 + jnz wait_gate2 + mov al,0x0FE + out 0x60,al + + /* trigger triple fault */ + + xor eax,eax + mov cr3,eax +reset_wait: + jmp reset_wait diff --git a/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx b/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx index a1d5ab07..1ecc7b4a 100644 --- a/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx +++ b/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx @@ -38,7 +38,7 @@ STATIC EfiGraphicsOutputProtocol* kGop = nullptr; STATIC UInt16 kStride = 0U; STATIC EfiGUID kGopGuid; -EXTERN_C Void hal_init_platform(HEL::HandoverInformationHeader* HIH); +EXTERN_C Void rt_reset_hardware(); /** @brief Finds and stores the GOP. @@ -89,14 +89,6 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, InitEFI(SystemTable); ///! Init the EFI library. InitVideoFB(); ///! Init the GOP. - BTextWriter writer; - - /// Splash screen stuff - - writer.Write(L"ZKA Technologies (R) newosldr: ") - .Write(BVersionString::The()) - .Write("\r"); - UInt32 MapKey = 0; UInt32 SizePtr = sizeof(EfiMemoryDescriptor); EfiMemoryDescriptor* Descriptor = nullptr; @@ -118,13 +110,32 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, vendorTable[4] == 'P' && vendorTable[5] == 'T' && vendorTable[6] == 'R' && vendorTable[7] == ' ') { - writer.Write(L"newosldr: Filling RSD PTR...\r"); handoverHdrPtr->f_HardwareTables.f_VendorPtr = (VoidPtr)vendorTable; - break; } } + // ------------------------------------------ // + // draw background color. + // ------------------------------------------ // + + handoverHdrPtr->f_GOP.f_The = kGop->Mode->FrameBufferBase; + handoverHdrPtr->f_GOP.f_Width = kGop->Mode->Info->VerticalResolution; + handoverHdrPtr->f_GOP.f_Height = kGop->Mode->Info->HorizontalResolution; + handoverHdrPtr->f_GOP.f_PixelPerLine = kGop->Mode->Info->PixelsPerScanLine; + handoverHdrPtr->f_GOP.f_PixelFormat = kGop->Mode->Info->PixelFormat; + handoverHdrPtr->f_GOP.f_Size = kGop->Mode->FrameBufferSize; + + kHandoverHeader = handoverHdrPtr; + + CGInit(); + CGDrawInRegion(CGColor(0xff, 0x3a, 0x3a), handoverHdrPtr->f_GOP.f_Height, handoverHdrPtr->f_GOP.f_Width, 0, 0); + CGFini(); + + cg_write_text("NEWOSLDR (C) ZKA TECHNOLOGIES.", 10, 10, RGB(0xFF, 0xFF, 0xFF)); + cg_write_text(BVersionString::The(), 20, 10, RGB(0xFF, 0xFF, 0xFF)); + cg_write_text("WARNING: YOU MUST HAVE AT LEAST 2 CORES OR COHERENT PROCESSORS INSLATTED IN YOUR SYSTEM.", 30, 10, RGB(0xFF, 0xFF, 0xFF)); + // Fill handover header now. BS->GetMemoryMap(&SizePtr, Descriptor, &MapKey, &SzDesc, &RevDesc); @@ -164,6 +175,10 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, handoverHdrPtr->f_VirtualStart = (VoidPtr)Descriptor[cDefaultMemoryMap].VirtualStart; + handoverHdrPtr->f_HeapStart = nullptr; + + BS->AllocatePool(EfiLoaderCode, kHandoverHeapSz, &handoverHdrPtr->f_HeapStart); + handoverHdrPtr->f_VirtualSize = Descriptor[cDefaultMemoryMap].NumberOfPages; /* # of pages */ @@ -177,39 +192,23 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, BCopyMem(handoverHdrPtr->f_FirmwareVendorName, SystemTable->FirmwareVendor, handoverHdrPtr->f_FirmwareVendorLen); - handoverHdrPtr->f_GOP.f_The = kGop->Mode->FrameBufferBase; - handoverHdrPtr->f_GOP.f_Width = kGop->Mode->Info->VerticalResolution; - handoverHdrPtr->f_GOP.f_Height = kGop->Mode->Info->HorizontalResolution; - handoverHdrPtr->f_GOP.f_PixelPerLine = kGop->Mode->Info->PixelsPerScanLine; - handoverHdrPtr->f_GOP.f_PixelFormat = kGop->Mode->Info->PixelFormat; - handoverHdrPtr->f_GOP.f_Size = kGop->Mode->FrameBufferSize; - // Assign to global 'kHandoverHeader'. - kHandoverHeader = handoverHdrPtr; - - // ------------------------------------------ // - // draw background color. - // ------------------------------------------ // - - CGInit(); - CGDrawInRegion(CGColor(0xFF, 0xFF, 0xFF), handoverHdrPtr->f_GOP.f_Height, handoverHdrPtr->f_GOP.f_Width, 0, 0); - CGFini(); - BDiskFormatFactory<BootDeviceATA> checkPart; - + if (!checkPart.IsPartitionValid()) { - writer.Write("newosldr: Warning, partition isn't valid! repaired it.\rPlease restart the computer now.\r"); - BDiskFormatFactory<BootDeviceATA>::BFileDescriptor root; root.fFileName[0] = kNewFSRoot[0]; root.fFileName[1] = 0; root.fKind = kNewFSCatalogKindDir; - checkPart.Format("ZKA (C:)", &root, 1); + checkPart.Format("ZKA (A:)", &root, 1); + + cg_write_text("INSATLLED PARTITION WITH SUCCESS.", 40, 10, RGB(0xFF, 0xFF, 0xFF)); + rt_reset_hardware(); EFI::Stop(); } @@ -223,7 +222,7 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, readerKernel.ReadAll(0); - Boot::Thread* loader = nullptr; + Boot::BThread* loader = nullptr; // ------------------------------------------ // // If we succeed in reading the blob, then execute it. @@ -231,26 +230,18 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, if (readerKernel.Blob()) { - loader = new Boot::Thread(readerKernel.Blob()); - loader->SetName("64-bit Kernel SMP DLL."); + loader = new Boot::BThread(readerKernel.Blob()); + loader->SetName("64-bit Kernel DLL."); } - writer.Write("newosldr: Running: ").Write(loader->GetName()).Write("\r"); - - /// TODO: Parse command line from ZKA\cmd.json - // CopyMem(handoverHdrPtr->f_CommandLine[0], "/SMP", StrLen("/SMP")); - handoverHdrPtr->f_FirmwareVendorLen = BStrLen(SystemTable->FirmwareVendor); EFI::ExitBootServices(MapKey, ImageHandle); // ---------------------------------------------------- // - // Call kernel. + // finally load kernel. // ---------------------------------------------------- // - cg_write_text("NEWOSLDR (C) ZKA TECHNOLOGIES.", 10, 10, RGB(0x00, 0x00, 0x00)); - cg_write_text("LOADING NEWOSKRNL...", 20, 10, RGB(0x00, 0x00, 0x00)); - loader->Start(handoverHdrPtr); EFI::Stop(); diff --git a/dev/ZBA/Sources/Thread.cxx b/dev/ZBA/Sources/Thread.cxx index 5bd18b19..c13d25b9 100644 --- a/dev/ZBA/Sources/Thread.cxx +++ b/dev/ZBA/Sources/Thread.cxx @@ -26,7 +26,7 @@ EXTERN EfiBootServices* BS; namespace Boot { - Thread::Thread(VoidPtr blob) + BThread::BThread(VoidPtr blob) : fBlob(blob), fStartAddress(nullptr) { // detect the format. @@ -138,7 +138,7 @@ namespace Boot } /// @note handover header has to be valid! - Void Thread::Start(HEL::HandoverInformationHeader* handover) + Void BThread::Start(HEL::HandoverInformationHeader* handover) { BTextWriter writer; @@ -162,17 +162,17 @@ namespace Boot err_fn(handover); } - const Char* Thread::GetName() + const Char* BThread::GetName() { return fBlobName; } - Void Thread::SetName(const Char* name) + Void BThread::SetName(const Char* name) { CopyMem(fBlobName, name, StrLen(name)); } - bool Thread::IsValid() + bool BThread::IsValid() { return fStartAddress != nullptr; } diff --git a/dev/ZKA/CompilerKit/Version.hxx b/dev/ZKA/CompilerKit/Version.hxx index c0d42603..edff10c5 100644 --- a/dev/ZKA/CompilerKit/Version.hxx +++ b/dev/ZKA/CompilerKit/Version.hxx @@ -1,4 +1,4 @@ #pragma once -#define BOOTLOADER_VERSION L"v1.14.2" -#define KERNEL_VERSION "v1.14.2" +#define BOOTLOADER_VERSION "VERSION: v1.14.2" +#define KERNEL_VERSION "VERSION: v1.14.2" diff --git a/dev/ZKA/Docs/SPECIFICATION.md b/dev/ZKA/Docs/SPECIFICATION.md index e58d63ee..ded0aa12 100644 --- a/dev/ZKA/Docs/SPECIFICATION.md +++ b/dev/ZKA/Docs/SPECIFICATION.md @@ -10,7 +10,7 @@ =================================== -# 1: The NewKernel +# 1: The Kernel =================================== @@ -20,8 +20,8 @@ - Networking. - Hardware Abstraction Layer. - Native Filesystem support (NewFS, FAT32 and ffs2). -- Program Loaders. -- Thread Local Storage. +- Program Loaders interfaces. +- TLS (Thread Local Storage) support. - Semaphore, Locks, Timers. - Canary mechanisms. - Dynamic Sys. diff --git a/dev/ZKA/FSKit/NewFS.hxx b/dev/ZKA/FSKit/NewFS.hxx index 54b11e38..830d8b0e 100644 --- a/dev/ZKA/FSKit/NewFS.hxx +++ b/dev/ZKA/FSKit/NewFS.hxx @@ -248,24 +248,25 @@ namespace Kernel _Output Void CloseFork(_Input NFS_FORK_STRUCT* fork); - _Output NFS_CATALOG_STRUCT* FindCatalog(_Input const char* catalogName, Lba& outLba); + _Output NFS_CATALOG_STRUCT* FindCatalog(_Input const Char* catalogName, Lba& outLba); - _Output NFS_CATALOG_STRUCT* GetCatalog(_Input const char* name); + _Output NFS_CATALOG_STRUCT* GetCatalog(_Input const Char* name); - _Output NFS_CATALOG_STRUCT* CreateCatalog(_Input const char* name, + _Output NFS_CATALOG_STRUCT* CreateCatalog(_Input const Char* name, _Input const Int32& flags, _Input const Int32& kind); - _Output NFS_CATALOG_STRUCT* CreateCatalog(_Input const char* name); + _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); + _Input Bool isRsrcFork, + _Input VoidPtr data, + _Input SizeT sizeOfData, + _Input const Char* forkName); VoidPtr ReadCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, SizeT dataSz, - _Input const char* forkName); + _Input const Char* forkName); bool Seek(_Input _Output NFS_CATALOG_STRUCT* catalog, SizeT off); @@ -292,10 +293,10 @@ namespace Kernel class NewFilesystemHelper final { public: - STATIC const char* Root(); - STATIC const char* UpDir(); - STATIC const char Separator(); - STATIC const char MetaFile(); + STATIC const Char* Root(); + STATIC const Char* UpDir(); + STATIC const Char Separator(); + STATIC const Char MetaFile(); }; namespace Detail diff --git a/dev/ZKA/FirmwareKit/Handover.hxx b/dev/ZKA/FirmwareKit/Handover.hxx index a93ace39..96daa1dc 100644 --- a/dev/ZKA/FirmwareKit/Handover.hxx +++ b/dev/ZKA/FirmwareKit/Handover.hxx @@ -26,6 +26,8 @@ #define kHandoverMaxCmdLine 8 +#define kHandoverHeapSz gib_cast(2) + #define kHandoverStructSz sizeof(HEL::HandoverHeader) namespace Kernel::HEL @@ -56,9 +58,11 @@ namespace Kernel::HEL UInt64 f_Magic; UInt64 f_Version; - voidPtr f_VirtualStart; + VoidPtr f_VirtualStart; SizeT f_VirtualSize; - voidPtr f_PhysicalStart; + VoidPtr f_PhysicalStart; + + VoidPtr f_HeapStart; WideChar f_FirmwareVendorName[32]; SizeT f_FirmwareVendorLen; diff --git a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx index 49ddfa6c..17502b7c 100644 --- a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx +++ b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx @@ -86,10 +86,12 @@ EXTERN_C void hal_init_platform( } Kernel::Void hal_real_init(Kernel::Void) noexcept -{ +{ // reset kAllocationInProgress field to zero. kAllocationInProgress = false; + kKernelVMTStart = kHandoverHeader->f_HeapStart; + // get page size. kKernelVirtualSize = kHandoverHeader->f_VirtualSize; @@ -215,36 +217,39 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept kSyscalls[cLastExitInterrupt].Leak().Leak()->fHooked = true; kSyscalls[cShutdownInterrupt].Leak().Leak()->fHooked = true; kSyscalls[cRebootInterrupt].Leak().Leak()->fHooked = true; - + Kernel::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr); Kernel::kcout << "newoskrnl: Creating filesystem and such.\r"; auto fs = new Kernel::NewFilesystemManager(); - + MUST_PASS(fs); MUST_PASS(fs->GetParser()); Kernel::NewFilesystemManager::Mount(fs); - delete fs->GetParser()->CreateCatalog("\\Users\\", 0, kNewFSCatalogKindDir); - - Kernel::kcout << "newoskrnl: Created filesystem and now creating " << kSuperUser << "..." << Kernel::endl; + if (auto node = fs->GetParser()->GetCatalog("\\Users\\"); + !node) + { + delete fs->GetParser()->CreateCatalog("\\Users\\", 0, kNewFSCatalogKindDir); + } cRoot = new Kernel::User(Kernel::RingKind::kRingSuperUser, kSuperUser); #ifdef __DEBUG__ - const auto cPassword = "6aa162f3-20f6-4143-92f9-5dd37066aedc"; + const auto cPassword = "infdev"; #else const auto cPassword = "password"; #endif - + Kernel::UserManager::The()->fRootUser = cRoot; Kernel::kcout << "newoskrnl: Root is " << kSuperUser << "." << Kernel::endl; cRoot->TrySave(cPassword); - + + /// TODO: Fix this now! Kernel::UserManager::The()->TryLogIn(cRoot, cPassword); Kernel::ke_stop(RUNTIME_CHECK_FAILED); diff --git a/dev/ZKA/HALKit/AMD64/Processor.hxx b/dev/ZKA/HALKit/AMD64/Processor.hxx index d80a2834..8d9fc1b8 100644 --- a/dev/ZKA/HALKit/AMD64/Processor.hxx +++ b/dev/ZKA/HALKit/AMD64/Processor.hxx @@ -40,7 +40,6 @@ EXTERN_C #define kTaskGate (0b10001100) #define kGdtCodeSelector (0x08) #define kGdtUserCodeSelector (0x10) -#define cHeapStartOffset (0x80000000) namespace Kernel { @@ -341,7 +340,7 @@ EXTERN_C Kernel::Void hal_load_gdt(Kernel::HAL::RegisterGDT ptr); #define kKernelIdtSize 0x100 #define kKernelInterruptId 0x32 -inline Kernel::VoidPtr kKernelVMTStart = (Kernel::VoidPtr)cHeapStartOffset; +inline Kernel::VoidPtr kKernelVMTStart = nullptr; inline Kernel::VoidPtr kKernelVirtualStart = nullptr; inline Kernel::UIntPtr kKernelVirtualSize = 0UL; diff --git a/dev/ZKA/KernelKit/FileManager.hxx b/dev/ZKA/KernelKit/FileManager.hxx index 68fa1eb5..e27bcc35 100644 --- a/dev/ZKA/KernelKit/FileManager.hxx +++ b/dev/ZKA/KernelKit/FileManager.hxx @@ -59,6 +59,9 @@ namespace Kernel cFileReadChunk = 102, cFileWriteChunk = 103, cFileIOCnt = (cFileWriteChunk - cFileWriteAll) + 1, + // file flags + cFileFlagRsrc = 104, + cFileFlagData = 105, }; /// @brief filesystem node generic type. @@ -173,11 +176,8 @@ namespace Kernel _Input SizeT sz) override; public: - void SetResourceFork(const char* forkName); - void SetDataFork(const char* forkName); - - /// @brief Get internal parser. - /// @return + /// @brief Get NewFS parser class. + /// @return The filesystem parser class. NewFSParser* GetParser() noexcept; private: diff --git a/dev/ZKA/KernelKit/User.hxx b/dev/ZKA/KernelKit/User.hxx index 56014c9b..ed1f6047 100644 --- a/dev/ZKA/KernelKit/User.hxx +++ b/dev/ZKA/KernelKit/User.hxx @@ -59,7 +59,7 @@ namespace Kernel const RingKind& Ring() noexcept; /// @brief Get user name - StringView& Name() noexcept; + Char* Name() noexcept; /// @brief Is he a standard user? Bool IsStdUser() noexcept; @@ -71,7 +71,7 @@ namespace Kernel private: RingKind fRing{RingKind::kRingStdUser}; - StringView fUserName; + Char fUserName[kMaxUserNameLen]; VoidPtr fUserToken{nullptr}; friend UserManager; diff --git a/dev/ZKA/Sources/FS/NewFS.cxx b/dev/ZKA/Sources/FS/NewFS.cxx index 90f48eb2..bea3e9ec 100644 --- a/dev/ZKA/Sources/FS/NewFS.cxx +++ b/dev/ZKA/Sources/FS/NewFS.cxx @@ -52,10 +52,9 @@ STATIC MountpointInterface sMountpointInterface; /// @param theFork the fork itself. /// @return the fork _Output NFS_FORK_STRUCT* NewFSParser::CreateFork(_Input NFS_CATALOG_STRUCT* catalog, - _Input NFS_FORK_STRUCT& theFork) + _Input NFS_FORK_STRUCT& theFork) { - if (catalog && theFork.ForkName[0] != 0 && - theFork.DataSize == kNewFSForkSize) + if (catalog && theFork.ForkName[0] != 0) { Lba lba = (theFork.Kind == kNewFSDataForkKind) ? catalog->DataFork : catalog->ResourceFork; @@ -87,11 +86,17 @@ _Output NFS_FORK_STRUCT* NewFSParser::CreateFork(_Input NFS_CATALOG_STRUCT* cata drv.fInput(&drv.fPacket); + if (curFork.NextSibling > kBadAddress) + { + kcout << "newoskrnl: bad fork: " << hex_number(curFork.NextSibling) << endl; + break; + } + kcout << "newoskrnl: next fork: " << hex_number(curFork.NextSibling) << endl; if (curFork.Flags == kNewFSFlagCreated) { - kcout << "newoskrnl: Fork already exists.\r"; + kcout << "newoskrnl: fork already exists.\r"; /// sanity check. if (StringBuilder::Equals(curFork.ForkName, theFork.ForkName) && @@ -156,8 +161,8 @@ _Output NFS_FORK_STRUCT* NewFSParser::CreateFork(_Input NFS_CATALOG_STRUCT* cata /// @param name the fork name. /// @return the fork. _Output NFS_FORK_STRUCT* NewFSParser::FindFork(_Input NFS_CATALOG_STRUCT* catalog, - _Input const Char* name, - Boolean isDataFork) + _Input const Char* name, + Boolean isDataFork) { auto drv = sMountpointInterface.A(); NFS_FORK_STRUCT* theFork = nullptr; @@ -218,7 +223,7 @@ _Output NFS_CATALOG_STRUCT* NewFSParser::CreateCatalog(_Input const Char* name) /// @param flags the flags of the catalog. /// @param kind the catalog kind. /// @return catalog pointer. -_Output NFS_CATALOG_STRUCT* NewFSParser::CreateCatalog(_Input const Char* name, +_Output NFS_CATALOG_STRUCT* NewFSParser::CreateCatalog(_Input const Char* name, _Input const Int32& flags, _Input const Int32& kind) { @@ -238,14 +243,14 @@ _Output NFS_CATALOG_STRUCT* NewFSParser::CreateCatalog(_Input const Char* name, name[rt_string_len(name) - 1] == NewFilesystemHelper::Separator()) return nullptr; - NFS_CATALOG_STRUCT* copyExists = this->FindCatalog(name, outLba); + NFS_CATALOG_STRUCT* catalog_copy = this->FindCatalog(name, outLba); - if (copyExists) + if (catalog_copy) { - kcout << "newoskrnl: Copy already exists.\r"; + kcout << "newoskrnl: Catalog already exists: " << name << ".\r"; ErrLocal() = kErrorFileExists; - return copyExists; + return catalog_copy; } Char parentName[kNewFSNodeNameLen] = {0}; @@ -327,31 +332,31 @@ _Output NFS_CATALOG_STRUCT* NewFSParser::CreateCatalog(_Input const Char* name, auto drive = sMountpointInterface.A(); - Lba startFree = outLba; + Lba start_free = outLba; rt_copy_memory((VoidPtr) "fs/newfs-packet", drive.fPacket.fPacketMime, rt_string_len("fs/newfs-packet")); drive.fPacket.fPacketContent = catalogBuf; drive.fPacket.fPacketSize = kNewFSSectorSz; - drive.fPacket.fLba = startFree; + drive.fPacket.fLba = start_free; drive.fInput(&drive.fPacket); NFS_CATALOG_STRUCT* nextSibling = (NFS_CATALOG_STRUCT*)catalogBuf; - startFree = nextSibling->NextSibling; + start_free = nextSibling->NextSibling; catalogChild->PrevSibling = outLba; - drive.fPacket.fLba = startFree; + drive.fPacket.fLba = start_free; drive.fInput(&drive.fPacket); while (drive.fPacket.fPacketGood) { nextSibling = reinterpret_cast<NFS_CATALOG_STRUCT*>(catalogBuf); - if (startFree <= kNewFSStartLba) + if (start_free <= kNewFSStartLba) { delete catalogChild; delete catalog; @@ -387,28 +392,28 @@ _Output NFS_CATALOG_STRUCT* NewFSParser::CreateCatalog(_Input const Char* name, catalogChild->ResourceFork = catalogChild->DataFork; catalogChild->NextSibling = - startFree + (sizeof(NFS_CATALOG_STRUCT) * cNewFSCatalogPadding); + start_free + (sizeof(NFS_CATALOG_STRUCT) * cNewFSCatalogPadding); drive.fPacket.fPacketContent = catalogChild; drive.fPacket.fPacketSize = sizeof(NFS_CATALOG_STRUCT); - drive.fPacket.fLba = startFree; + drive.fPacket.fLba = start_free; drive.fOutput(&drive.fPacket); drive.fPacket.fPacketContent = catalogBuf; drive.fPacket.fPacketSize = kNewFSSectorSz; drive.fPacket.fLba = - startFree - (sizeof(NFS_CATALOG_STRUCT) * cNewFSCatalogPadding); + start_free - (sizeof(NFS_CATALOG_STRUCT) * cNewFSCatalogPadding); drive.fInput(&drive.fPacket); - nextSibling->NextSibling = startFree; + nextSibling->NextSibling = start_free; drive.fOutput(&drive.fPacket); kcout << "newoskrnl: Create new catalog, status: " << hex_number(catalogChild->Flags) << endl; - kcout << "newoskrnl: Create new catalog, status: " << catalogChild->Name + kcout << "newoskrnl: Create new catalog, name: " << catalogChild->Name << endl; drive.fPacket.fPacketContent = sectorBufPartBlock; @@ -431,11 +436,11 @@ _Output NFS_CATALOG_STRUCT* NewFSParser::CreateCatalog(_Input const Char* name, constexpr auto cNewFSCatalogPadding = 4; //// @note that's how we find the next catalog in the partition block. - startFree = startFree + (sizeof(NFS_CATALOG_STRUCT) * cNewFSCatalogPadding); + start_free = start_free + (sizeof(NFS_CATALOG_STRUCT) * cNewFSCatalogPadding); drive.fPacket.fPacketContent = catalogBuf; drive.fPacket.fPacketSize = kNewFSSectorSz; - drive.fPacket.fLba = startFree; + drive.fPacket.fLba = start_free; drive.fInput(&drive.fPacket); } @@ -611,18 +616,15 @@ bool NewFSParser::Format(_Input _Output DriveTrait* drive, _Input const Lba endL /// @param catalog the catalog itself /// @param data the data. /// @return if the catalog w rote the contents successfully. -bool NewFSParser::WriteCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, voidPtr data, SizeT sizeOfData, _Input const Char* forkName) +bool NewFSParser::WriteCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, Bool isRsrcFork, _Input VoidPtr data, _Input SizeT sizeOfData, _Input const Char* forkName) { - NFS_FORK_STRUCT forkData{0}; - auto drive = sMountpointInterface.A(); rt_copy_memory((VoidPtr) "fs/newfs-packet", drive.fPacket.fPacketMime, rt_string_len("fs/newfs-packet")); - auto startFork = catalog->DataFork; - - rt_copy_memory(catalog->Name, forkData.CatalogName, kNewFSNodeNameLen); + auto startFork = (!isRsrcFork) ? catalog->DataFork + : catalog->ResourceFork; NFS_FORK_STRUCT forkDataIn{0}; @@ -635,8 +637,6 @@ bool NewFSParser::WriteCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, voidP drive.fInput(&drive.fPacket); - kcout << "newoskrnl: fork name: " << forkName << endl; - // check the fork, if it's position is valid. if (forkDataIn.DataOffset <= kNewFSCatalogStartAddress) { @@ -647,22 +647,22 @@ bool NewFSParser::WriteCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, voidP return false; } - if (forkData.Flags != kNewFSFlagUnallocated && - forkData.Flags != kNewFSFlagDeleted && - StringBuilder::Equals(forkData.ForkName, forkName) && - StringBuilder::Equals(forkData.CatalogName, catalog->Name)) + if (forkDataIn.Flags != kNewFSFlagUnallocated && + forkDataIn.Flags != kNewFSFlagDeleted && + StringBuilder::Equals(forkDataIn.ForkName, forkName) && + StringBuilder::Equals(forkDataIn.CatalogName, catalog->Name)) { if (forkDataIn.DataSize < sizeOfData) { - startFork = forkData.NextSibling; + startFork = forkDataIn.NextSibling; continue; } drive.fPacket.fPacketContent = data; drive.fPacket.fPacketSize = sizeOfData; - drive.fPacket.fLba = forkData.DataOffset; + drive.fPacket.fLba = forkDataIn.DataOffset; - kcout << "newoskrnl: data offset: " << hex_number(forkData.DataOffset) << endl; + kcout << "newoskrnl: data offset: " << hex_number(forkDataIn.DataOffset) << endl; drive.fOutput(&drive.fPacket); @@ -673,35 +673,37 @@ bool NewFSParser::WriteCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, voidP // ===================================================== // // Store size of blob now. // ===================================================== // - forkData.DataSize = sizeOfData; - if (sizeOfData < kNewFSForkSize) - forkData.DataSize = kNewFSForkSize; + if (forkDataIn.DataSize < sizeOfData) + { + startFork = forkDataIn.NextSibling; + continue; + } + + forkDataIn.Flags = kNewFSFlagCreated; drive.fPacket.fPacketContent = data; drive.fPacket.fPacketSize = sizeOfData; - drive.fPacket.fLba = forkData.DataOffset; + drive.fPacket.fLba = forkDataIn.DataOffset; - kcout << "newoskrnl: data offset: " << hex_number(forkData.DataOffset) << endl; + kcout << "newoskrnl: data offset: " << hex_number(forkDataIn.DataOffset) << endl; drive.fOutput(&drive.fPacket); - forkData.Flags = kNewFSFlagCreated; - - drive.fPacket.fPacketContent = &forkData; + drive.fPacket.fPacketContent = &forkDataIn; drive.fPacket.fPacketSize = sizeof(NFS_FORK_STRUCT); drive.fPacket.fLba = startFork; drive.fOutput(&drive.fPacket); - kcout << "newoskrnl: wrote fork at offset: " << hex_number(forkData.DataOffset) << endl; + kcout << "newoskrnl: wrote fork at offset: " << hex_number(forkDataIn.DataOffset) << endl; delete catalog; return true; } - startFork = forkData.NextSibling; + startFork = forkDataIn.NextSibling; } return false; @@ -922,7 +924,7 @@ Boolean NewFSParser::RemoveCatalog(_Input const Char* catalogName) VoidPtr NewFSParser::ReadCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, _Input SizeT dataSz, - _Input const Char* forkName) + _Input const Char* forkName) { if (!catalog) { diff --git a/dev/ZKA/Sources/FileManager.cxx b/dev/ZKA/Sources/FileManager.cxx index aa8fca2a..b590ef69 100644 --- a/dev/ZKA/Sources/FileManager.cxx +++ b/dev/ZKA/Sources/FileManager.cxx @@ -122,7 +122,7 @@ namespace Kernel NEWOS_UNUSED(flags); if ((reinterpret_cast<NFS_CATALOG_STRUCT*>(node))->Kind == kNewFSCatalogKindFile) - fImpl->WriteCatalog(reinterpret_cast<NFS_CATALOG_STRUCT*>(node), data, size, + fImpl->WriteCatalog(reinterpret_cast<NFS_CATALOG_STRUCT*>(node), (flags & cFileFlagRsrc ? true : false), data, size, name); } diff --git a/dev/ZKA/Sources/Heap.cxx b/dev/ZKA/Sources/Heap.cxx index de0c8a5c..de9eaa86 100644 --- a/dev/ZKA/Sources/Heap.cxx +++ b/dev/ZKA/Sources/Heap.cxx @@ -94,8 +94,6 @@ namespace Kernel if (szFix == 0) ++szFix; - kcout << "newoskrnl: allocating VMH page...\r"; - auto wrapper = kHeapPageManager.Request(rw, user, false, szFix); Detail::HEAP_INFORMATION_BLOCK_PTR heap_info_ptr = diff --git a/dev/ZKA/Sources/NewFS+FileManager.cxx b/dev/ZKA/Sources/NewFS+FileManager.cxx index f94831cd..36a0e984 100644 --- a/dev/ZKA/Sources/NewFS+FileManager.cxx +++ b/dev/ZKA/Sources/NewFS+FileManager.cxx @@ -49,7 +49,7 @@ namespace Kernel /// @return The Node pointer. NodePtr NewFilesystemManager::Create(const char* path) { - return node_cast(fImpl->CreateCatalog(path, 0, kNewFSCatalogKindFile)); + return node_cast(fImpl->CreateCatalog(path)); } /// @brief Creates a node with is a directory. @@ -90,7 +90,7 @@ namespace Kernel } /// @brief Gets the metafile character. - /// @return + /// @return const char NewFilesystemHelper::MetaFile() { return kNewFSMetaFilePrefix; diff --git a/dev/ZKA/Sources/PageManager.cxx b/dev/ZKA/Sources/PageManager.cxx index 7e0ef67b..868a9f7a 100644 --- a/dev/ZKA/Sources/PageManager.cxx +++ b/dev/ZKA/Sources/PageManager.cxx @@ -63,11 +63,9 @@ namespace Kernel /// @return PTEWrapper PageManager::Request(Boolean Rw, Boolean User, Boolean ExecDisable, SizeT Sz) { - kcout << "newoskrnl: Allocating VMH page from PageManager...\r"; - // Store PTE wrapper right after PTE. VoidPtr ptr = Kernel::HAL::hal_alloc_page(Rw, User, Sz); - + if (ptr == kBadAddress) { kcout << "[create_page_wrapper] kBadAddress returned\n"; diff --git a/dev/ZKA/Sources/ProcessScheduler.cxx b/dev/ZKA/Sources/ProcessScheduler.cxx index 8ca94b60..a979c413 100644 --- a/dev/ZKA/Sources/ProcessScheduler.cxx +++ b/dev/ZKA/Sources/ProcessScheduler.cxx @@ -51,6 +51,7 @@ namespace Kernel if (Kernel::ProcessScheduler::The().Leak().CurrentTeam().AsArray().Count() < 1) { kcout << "*** BAD PROCESS ***\rTerminating as we are the only process...\r"; + ke_stop(RUNTIME_CHECK_PROCESS); } diff --git a/dev/ZKA/Sources/User.cxx b/dev/ZKA/Sources/User.cxx index e05aa283..3aad5ad4 100644 --- a/dev/ZKA/Sources/User.cxx +++ b/dev/ZKA/Sources/User.cxx @@ -29,17 +29,21 @@ namespace Kernel /// \brief Constructs a token by hashing the password. /// \param password password to hash. /// \return the hashed password - const Int32 cred_construct_token(Char* password, User* user) + const Int32 cred_construct_token(Char* password, const Char* in_password, User* user, SizeT length) { if (!password || !user) return -1; - for (Size i_pass = 0; i_pass < rt_string_len(password); ++i_pass) + kcout << "Constructing token...\r"; + + for (Size i_pass = 0; i_pass < length; ++i_pass) { - Char cur_chr = password[i_pass]; + Char cur_chr = in_password[i_pass]; password[i_pass] = cur_chr + (user->IsStdUser() ? cStdUser : cSuperUser); } + kcout << "Done constructing token...\r"; + return 0; } } // namespace Detail @@ -48,46 +52,74 @@ namespace Kernel : fRing((RingKind)sel) { MUST_PASS(sel >= 0); - this->fUserName += userName; + rt_copy_memory((VoidPtr)userName, this->fUserName, rt_string_len(userName)); } User::User(const RingKind& ringKind, const Char* userName) : fRing(ringKind) { - this->fUserName += userName; + rt_copy_memory((VoidPtr)userName, this->fUserName, rt_string_len(userName)); } User::~User() = default; Bool User::TrySave(const Char* password) noexcept { - kcout << "Trying to save password...\r"; - SizeT len = rt_string_len(password); Char* token = new Char[len]; MUST_PASS(token); - rt_copy_memory((VoidPtr)password, token, rt_string_len(password)); + kcout << "Trying to save password...\r"; - Detail::cred_construct_token(token, this); + rt_copy_memory((VoidPtr)password, token, len); + Detail::cred_construct_token(token, password, this, len); if (NewFilesystemManager::GetMounted()) { - auto node = NewFilesystemManager::GetMounted()->Create(kUsersFile); + NewFilesystemManager* new_fs = (NewFilesystemManager*)NewFilesystemManager::GetMounted(); + + kcout << "newoskrnl: Opening catalog.\r"; + + auto node = new_fs->GetParser()->GetCatalog(kUsersFile); - if (node) + if (!node) { - NewFilesystemManager::GetMounted()->Write(this->fUserName.CData(), node, (VoidPtr)token, (this->IsStdUser() ? cStdUser : cSuperUser) | kNewFSCatalogKindMetaFile, len); - delete node; + node = new_fs->GetParser()->CreateCatalog(kUsersFile); } - delete token; + kcout << "newoskrnl: Writing token...\r"; + + NFS_FORK_STRUCT fork{0}; + + fork.Kind = kNewFSRsrcForkKind; + fork.DataSize = rt_string_len(password); + + rt_copy_memory((VoidPtr)this->fUserName, fork.ForkName, rt_string_len(this->fUserName)); + rt_copy_memory((VoidPtr)kUsersFile, fork.CatalogName, rt_string_len(kUsersFile)); + + fork.DataSize = len; + + new_fs->GetParser()->CreateFork(node, fork); + + new_fs->GetParser()->WriteCatalog(node, (fork.Kind == kNewFSRsrcForkKind), reinterpret_cast<VoidPtr>(token), len, this->fUserName); + + delete node; + node = nullptr; + + delete[] token; + token = nullptr; + + kcout << "newoskrnl: Wrote token...\r"; return true; } - delete token; + kcout << "No filesystem mounted...\r"; + + delete[] token; + token = nullptr; + return false; } @@ -101,7 +133,7 @@ namespace Kernel return lhs.fRing != this->fRing; } - StringView& User::Name() noexcept + Char* User::Name() noexcept { return this->fUserName; } @@ -123,7 +155,7 @@ namespace Kernel UserManager* UserManager::The() noexcept { - UserManager* view = nullptr; + static UserManager* view = nullptr; if (!view) view = new UserManager(); @@ -136,22 +168,33 @@ namespace Kernel if (!password || !user) { - ErrLocal() = kErrorInvalidData; - kcout << "newoskrnl: Incorrect data given.\r"; + ErrLocal() = kErrorInvalidData; + return false; } kcout << "newoskrnl: Trying to log-in.\r"; - FileStreamUTF8 file(kUsersFile, "rb"); + NewFilesystemManager* new_fs = (NewFilesystemManager*)NewFilesystemManager::GetMounted(); + + // do not use if unmounted. + + if (!new_fs) + return false; + + auto node = new_fs->GetParser()->GetCatalog(kUsersFile); // ------------------------------------------ // // Retrieve token from a specific file fork. + // Fail on null. // ------------------------------------------ // - auto token = file.Read(user->fUserName.CData()); + if (!node) + return false; + + auto token = new_fs->GetParser()->ReadCatalog(node, rt_string_len(password), user->fUserName); if (!token) { @@ -162,7 +205,7 @@ namespace Kernel } else { - Char generated_token[255] = {0}; + Char generated_token[kMaxUserTokenLen] = {0}; // ================================================== // // Provide password on token variable. @@ -174,7 +217,7 @@ namespace Kernel // Construct token. // ================================================== // - Detail::cred_construct_token(generated_token, user); + Detail::cred_construct_token(generated_token, password, user, rt_string_len(password)); // ================================================== // // Checks if it matches the current token we have. @@ -210,7 +253,7 @@ namespace Kernel } fCurrentUser = user; - Kernel::kcout << "newoskrnl: Logged in as: " << fCurrentUser->Name().CData() << Kernel::endl; + Kernel::kcout << "newoskrnl: Logged in as: " << fCurrentUser->Name() << Kernel::endl; return true; } |
