From fb0ca452cda3bdc4a13f278c115f2dcd9360d818 Mon Sep 17 00:00:00 2001 From: Amlal EL Mahrouss Date: Sun, 4 Aug 2024 17:47:13 +0200 Subject: [IMP] [MHR-39] Ticket done. Signed-off-by: Amlal EL Mahrouss --- Kernel/HALKit/AMD64/HalDescriptorLoader.cxx | 2 +- Kernel/HALKit/AMD64/HalKernelMain.cxx | 53 ++++------ Kernel/Modules/CoreCG/TextRenderer.hxx | 3 +- Kernel/Sources/KernelCheck.cxx | 22 ++++ Kernel/Sources/Main.cxx | 159 ---------------------------- 5 files changed, 46 insertions(+), 193 deletions(-) delete mode 100644 Kernel/Sources/Main.cxx (limited to 'Kernel') diff --git a/Kernel/HALKit/AMD64/HalDescriptorLoader.cxx b/Kernel/HALKit/AMD64/HalDescriptorLoader.cxx index 62d31a40..99776265 100644 --- a/Kernel/HALKit/AMD64/HalDescriptorLoader.cxx +++ b/Kernel/HALKit/AMD64/HalDescriptorLoader.cxx @@ -61,7 +61,7 @@ namespace Kernel::HAL { MUST_PASS(baseIdt[i]); - Detail::kInterruptVectorTable[i].Selector = (i == kSyscallRoute) ? ((3 * 8) | 3) : kGdtCodeSelector; + Detail::kInterruptVectorTable[i].Selector = kGdtCodeSelector; Detail::kInterruptVectorTable[i].Ist = 0x0; Detail::kInterruptVectorTable[i].TypeAttributes = kInterruptGate; Detail::kInterruptVectorTable[i].OffsetLow = ((UIntPtr)baseIdt[i] & __INT16_MAX__); diff --git a/Kernel/HALKit/AMD64/HalKernelMain.cxx b/Kernel/HALKit/AMD64/HalKernelMain.cxx index 0ed63569..020ee59d 100644 --- a/Kernel/HALKit/AMD64/HalKernelMain.cxx +++ b/Kernel/HALKit/AMD64/HalKernelMain.cxx @@ -21,16 +21,9 @@ #include #include -#define mInitKernel(X) \ - X; \ - Kernel::ke_stop(RUNTIME_CHECK_BOOTSTRAP); - Kernel::Property cKernelVersion; Kernel::Property cAutoFormatDisk; -/// @brief This symbol is the kernel main symbol. -EXTERN_C void KeMain(); - EXTERN_C Kernel::VoidPtr kInterruptVectorTable[]; struct HEAP_ALLOC_INFO final @@ -72,6 +65,8 @@ STATIC Kernel::HAL::Detail::NewOSGDT cGdt = { {0, 0, 0, 0x92, 0xaf, 0}, // user data }; +void hal_real_init(void); + EXTERN_C void hal_init_platform( Kernel::HEL::HandoverInformationHeader* HandoverHeader) { @@ -87,17 +82,23 @@ EXTERN_C void hal_init_platform( cg_write_text("NEWOSKRNL (C) ZKA TECHNOLOGIES.", kTextOffsetY, 10, RGB(0x00, 0x00, 0x00)); kTextOffsetY += 10; - cg_write_text("SMP OS (MAX 8 CORES).", kTextOffsetY, 10, RGB(0x00, 0x00, 0x00)); - kKernelVirtualSize = HandoverHeader->f_VirtualSize; + hal_real_init(); +} + +void hal_real_init(void) +{ + kKernelVirtualSize = kHandoverHeader->f_VirtualSize; kKernelVirtualStart = reinterpret_cast( - reinterpret_cast(HandoverHeader->f_VirtualStart) + cHeapStartOffset); + reinterpret_cast(kHandoverHeader->f_VirtualStart) + cHeapStartOffset); - kKernelPhysicalStart = HandoverHeader->f_PhysicalStart; + kKernelPhysicalStart = kHandoverHeader->f_PhysicalStart; - // Load memory descriptors. + kTextOffsetY += 10; + cg_write_text("LOADING INTERRUPTS...", kTextOffsetY, 10, RGB(0x00, 0x00, 0x00)); + // Load memory descriptors. Kernel::HAL::RegisterGDT gdtBase; gdtBase.Base = reinterpret_cast(&cGdt); @@ -117,6 +118,9 @@ EXTERN_C void hal_init_platform( // Register the basic SCI functions. + kTextOffsetY += 10; + cg_write_text("LOADING SYSCALLS...", kTextOffsetY, 10, RGB(0x00, 0x00, 0x00)); + constexpr auto cVGAWrite = 0x10; constexpr auto cTlsInterrupt = 0x11; constexpr auto cTlsInstallInterrupt = 0x12; @@ -226,17 +230,8 @@ 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() = __MAHROUSS_VER__; - - Kernel::StringView strAutoMount(cMaxPropLen); - strAutoMount += "\\Properties\\AutoMountFS?"; - - cAutoFormatDisk.GetKey() = strAutoMount; + kTextOffsetY += 10; + cg_write_text("LOADING SMP...", kTextOffsetY, 10, RGB(0x00, 0x00, 0x00)); for (size_t i = 0; i < cMaxCmdLine; i++) { @@ -247,14 +242,8 @@ EXTERN_C void hal_init_platform( } } - for (size_t i = 0; i < cMaxCmdLine; i++) - { - if (Kernel::rt_string_cmp(kHandoverHeader->f_CommandLine[i], "/SMP", Kernel::rt_string_len("/SMP")) == 0) - { - Kernel::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr); - break; - } - } + kTextOffsetY += 10; + cg_write_text("LOADING SUBSYSTEMS...", kTextOffsetY, 10, RGB(0x00, 0x00, 0x00)); - mInitKernel(KeMain()); + Kernel::ke_stop(RUNTIME_CHECK_BOOTSTRAP); } diff --git a/Kernel/Modules/CoreCG/TextRenderer.hxx b/Kernel/Modules/CoreCG/TextRenderer.hxx index 2ea46b3f..eada9b9f 100644 --- a/Kernel/Modules/CoreCG/TextRenderer.hxx +++ b/Kernel/Modules/CoreCG/TextRenderer.hxx @@ -166,7 +166,8 @@ inline Kernel::Void cg_write_text(const Kernel::Char* text, Kernel::Int32 x_dst, if (text[i] == '\r' || text[i] == '\n') { - x_dst += FONT_SIZE_X; + y_dst += FONT_SIZE_Y; + continue; } diff --git a/Kernel/Sources/KernelCheck.cxx b/Kernel/Sources/KernelCheck.cxx index d33002bd..defe6841 100644 --- a/Kernel/Sources/KernelCheck.cxx +++ b/Kernel/Sources/KernelCheck.cxx @@ -11,6 +11,10 @@ #include #include +#include +#include +#include + EXTERN_C [[noreturn]] Kernel::Void ke_wait_for_debugger() { while (Yes) @@ -29,6 +33,24 @@ namespace Kernel { void ke_stop(const Kernel::Int& id) { + CGInit(); + + auto panicBack = RGB(0xDC, 0xF5, 0xF5); + auto panicTxt = RGB(0, 0, 0); + + CGDrawInRegion(panicBack, UIAccessibilty::The().Height(), UIAccessibilty::The().Width(), 0, 0); + + auto start_y = 10; + auto x = 10; + + cg_write_text("*** Kernel panic! ***\rnewoskrnl.dll stopped working properly so we had to shut it down.", start_y, x, panicTxt); + + CGFini(); + + // ******* // + // shows in debug only. + // ******* // + kcout << "*** STOP *** \r"; kcout << "*** Kernel has trigerred a runtime stop. *** \r"; diff --git a/Kernel/Sources/Main.cxx b/Kernel/Sources/Main.cxx deleted file mode 100644 index ac6d3fe7..00000000 --- a/Kernel/Sources/Main.cxx +++ /dev/null @@ -1,159 +0,0 @@ -/* ------------------------------------------- - - Copyright ZKA Technologies - - File: Main.cxx - Purpose: Main entrypoint of kernel. - -------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -EXTERN Kernel::Property cKernelVersion; -EXTERN Kernel::Property cAutoFormatDisk; - -namespace Kernel::Detail -{ - /// @brief Filesystem auto formatter, additional checks are also done by the class. - class FilesystemInstaller final - { - Kernel::NewFilesystemManager* fNewFS{nullptr}; - - public: - /// @brief wizard constructor. - explicit FilesystemInstaller() - { - if (cAutoFormatDisk.GetValue() == No) - { - return; - } - - if (Kernel::FilesystemManagerInterface::GetMounted()) - { - // Partition is mounted, cool! - Kernel::kcout - << "newoskrnl: No need to create for a new NewFS (EPM) partition here...\r"; - } - else - { - // Mounts a NewFS from main drive. - fNewFS = new Kernel::NewFilesystemManager(); - - Kernel::FilesystemManagerInterface::Mount(fNewFS); - - if (fNewFS->GetParser()) - { - constexpr auto cFolderInfo = "META-INF"; - const auto cDirCount = 7; - const char* cDirStr[cDirCount] = { - "\\Boot\\", "\\System\\", "\\Support\\", "\\Applications\\", - "\\Users\\", "\\Library\\", "\\Mounted\\"}; - - 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); - - NFS_FORK_STRUCT 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 += - "\r

Kind: folder

\r

Created by: system

\r

Edited by: " - "system

\r

Volume Type: ZKA Filesystem

\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; - } - } - } - } - - ~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::UserManager::The()->fRootUser = new User(RingKind::kRingSuperUser, kSuperUser); - Kernel::UserManager::The()->LogIn(Kernel::UserManager::The()->fRootUser, "root"); - - 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(); -} -- cgit v1.2.3