diff options
| author | Amlal EL Mahrouss <amlalelmahrouss@icloud.com> | 2024-08-04 17:47:13 +0200 |
|---|---|---|
| committer | Amlal EL Mahrouss <amlalelmahrouss@icloud.com> | 2024-08-04 17:48:40 +0200 |
| commit | fb0ca452cda3bdc4a13f278c115f2dcd9360d818 (patch) | |
| tree | 788411aebd30ed446cb8c4bb5756a3e937c08f0a /Kernel | |
| parent | 34bb37c9a464ab0dfccfa5ff217a283e36b32693 (diff) | |
[IMP] [MHR-39] Ticket done.
Signed-off-by: Amlal EL Mahrouss <amlalelmahrouss@icloud.com>
Diffstat (limited to 'Kernel')
| -rw-r--r-- | Kernel/HALKit/AMD64/HalDescriptorLoader.cxx | 2 | ||||
| -rw-r--r-- | Kernel/HALKit/AMD64/HalKernelMain.cxx | 53 | ||||
| -rw-r--r-- | Kernel/Modules/CoreCG/TextRenderer.hxx | 3 | ||||
| -rw-r--r-- | Kernel/Sources/KernelCheck.cxx | 22 | ||||
| -rw-r--r-- | Kernel/Sources/Main.cxx | 159 |
5 files changed, 46 insertions, 193 deletions
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 <CFKit/Property.hxx> #include <Modules/CoreCG/TextRenderer.hxx> -#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<Kernel::VoidPtr>( - reinterpret_cast<Kernel::UIntPtr>(HandoverHeader->f_VirtualStart) + cHeapStartOffset); + reinterpret_cast<Kernel::UIntPtr>(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<Kernel::UIntPtr>(&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 <FirmwareKit/Handover.hxx> #include <Modules/ACPI/ACPIFactoryInterface.hxx> +#include <Modules/CoreCG/Accessibility.hxx> +#include <Modules/CoreCG/FbRenderer.hxx> +#include <Modules/CoreCG/TextRenderer.hxx> + 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 <ArchKit/ArchKit.hxx> -#include <Modules/CoreCG/FbRenderer.hxx> -#include <CompilerKit/Detail.hxx> -#include <FirmwareKit/Handover.hxx> -#include <KernelKit/FileManager.hxx> -#include <KernelKit/Framebuffer.hxx> -#include <KernelKit/Heap.hxx> -#include <KernelKit/PEF.hxx> -#include <KernelKit/PEFCodeManager.hxx> -#include <KernelKit/ProcessScheduler.hxx> -#include <KernelKit/ProcessHeap.hxx> -#include <NewKit/Json.hxx> -#include <NewKit/KernelCheck.hxx> -#include <NewKit/String.hxx> -#include <NewKit/Utils.hxx> -#include <KernelKit/CodeManager.hxx> -#include <CFKit/Property.hxx> - -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 += - "<!properties/>\r<p>Kind: folder</p>\r<p>Created by: system</p>\r<p>Edited by: " - "system</p>\r<p>Volume Type: ZKA Filesystem</p>\r"; - - metadataFolder += "<p>Path: "; - metadataFolder += cDirStr[dirIndx]; - metadataFolder += "</p>\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(); -} |
