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 | |
| parent | 34bb37c9a464ab0dfccfa5ff217a283e36b32693 (diff) | |
[IMP] [MHR-39] Ticket done.
Signed-off-by: Amlal EL Mahrouss <amlalelmahrouss@icloud.com>
| -rw-r--r-- | Boot/BootKit/BootKit.hxx | 24 | ||||
| -rw-r--r-- | Boot/Sources/HEL/AMD64/BootMain.cxx | 58 | ||||
| -rw-r--r-- | Boot/Sources/HEL/AMD64/New+Delete.cxx | 4 | ||||
| -rw-r--r-- | Boot/Sources/ProgramLoader.cxx | 2 | ||||
| -rw-r--r-- | Boot/amd64-efi.make | 2 | ||||
| -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 |
10 files changed, 112 insertions, 217 deletions
diff --git a/Boot/BootKit/BootKit.hxx b/Boot/BootKit/BootKit.hxx index 1f6b7d95..680c9863 100644 --- a/Boot/BootKit/BootKit.hxx +++ b/Boot/BootKit/BootKit.hxx @@ -273,9 +273,9 @@ private: constexpr auto cNewFSCatalogPadding = 4; - NFS_CATALOG_STRUCT* catalogKind = (NFS_CATALOG_STRUCT*)bufCatalog; - catalogKind->PrevSibling = startLba; - catalogKind->NextSibling = (startLba + (sizeof(NFS_CATALOG_STRUCT) * cNewFSCatalogPadding)); + NFS_CATALOG_STRUCT* catalogKind = (NFS_CATALOG_STRUCT*)bufCatalog; + catalogKind->PrevSibling = startLba; + catalogKind->NextSibling = (startLba + (sizeof(NFS_CATALOG_STRUCT) * cNewFSCatalogPadding)); /// Fill catalog kind. catalogKind->Kind = blob->fKind; @@ -288,6 +288,9 @@ private: EFI::ThrowError(L"Developer-Error", L"This is caused by the developer of the bootloader."); } + --partBlock.FreeCatalog; + --partBlock.FreeSectors; + writer.Write(L"newosldr: root directory: ").Write(blob->fFileName).Write(L"\r"); memcpy(catalogKind->Name, blob->fFileName, strlen(blob->fFileName)); @@ -297,11 +300,6 @@ private: fDiskDev.Write((Char*)bufCatalog, sizeof(NFS_CATALOG_STRUCT)); - --partBlock.FreeCatalog; - --partBlock.FreeSectors; - - memset(bufCatalog, 0, sizeof(NFS_CATALOG_STRUCT)); - return true; } @@ -324,8 +322,8 @@ inline Boolean BDiskFormatFactory<BootDev>::Format(const char* partName, return false; /// sanity check /// convert the sector into something that the disk understands. - SizeT sectorSz = BootDev::kSectorSize; - Char buf[BootDev::kSectorSize] = {0}; + SizeT sectorSz = BootDev::kSectorSize; + Char* buf = new Char[BootDev::kSectorSize]; NFS_ROOT_PARTITION_BLOCK* partBlock = reinterpret_cast<NFS_ROOT_PARTITION_BLOCK*>(buf); @@ -340,6 +338,7 @@ inline Boolean BDiskFormatFactory<BootDev>::Format(const char* partName, if (GIB(fDiskDev.GetDiskSize()) < cMinimumDiskSize) { + delete buf; EFI::ThrowError(L"Disk-Too-Tiny", L"Can't format a New Filesystem partition here."); return false; } @@ -382,19 +381,22 @@ inline Boolean BDiskFormatFactory<BootDev>::Format(const char* partName, CopyMem(epmBoot->Magic, reinterpret_cast<VoidPtr>(const_cast<Char*>(kEPMMagic)), StrLen(kEPMMagic)); BTextWriter writer; - writer.Write(L"newosldr: wrote partition.\r"); + writer.Write(L"newosldr: wrote partition with success.\r"); fDiskDev.Leak().mBase = kEpmBase; fDiskDev.Leak().mSize = sectorSz; fDiskDev.Write(buf, sectorSz); + delete buf; return true; } else { + delete buf; EFI::ThrowError(L"Filesystem-Failure-Part", L"Filesystem couldn't be partitioned."); } + delete buf; return false; } diff --git a/Boot/Sources/HEL/AMD64/BootMain.cxx b/Boot/Sources/HEL/AMD64/BootMain.cxx index 6aec67f5..2bc2aca1 100644 --- a/Boot/Sources/HEL/AMD64/BootMain.cxx +++ b/Boot/Sources/HEL/AMD64/BootMain.cxx @@ -7,6 +7,7 @@ #include <BootKit/BootKit.hxx> #include <BootKit/Rsrc/NewBoot.rsrc> #include <Modules/CoreCG/FbRenderer.hxx> +#include <Modules/CoreCG/TextRenderer.hxx> #include <FirmwareKit/EFI.hxx> #include <FirmwareKit/EFI/API.hxx> #include <FirmwareKit/Handover.hxx> @@ -16,7 +17,6 @@ #include <NewKit/Macros.hxx> #include <NewKit/Ref.hxx> #include <BootKit/ProgramLoader.hxx> -#include <Modules/CoreCG/TextRenderer.hxx> #include <cstring> // make the compiler shut up. @@ -97,14 +97,11 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, .Write(BVersionString::The()) .Write("\r"); - UInt32* MapKey = new UInt32(); - UInt32* SizePtr = new UInt32(); + UInt32 MapKey = 0; + UInt32 SizePtr = sizeof(EfiMemoryDescriptor); EfiMemoryDescriptor* Descriptor = nullptr; - UInt32* SzDesc = new UInt32(); - UInt32* RevDesc = new UInt32(); - - *MapKey = 0; - *SizePtr = 0; + UInt32 SzDesc = sizeof(EfiMemoryDescriptor); + UInt32 RevDesc = 0; HEL::HandoverInformationHeader* handoverHdrPtr = new HEL::HandoverInformationHeader(); @@ -130,6 +127,47 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, // Fill handover header now. + BS->GetMemoryMap(&SizePtr, Descriptor, &MapKey, &SzDesc, &RevDesc); + + Descriptor = new EfiMemoryDescriptor[SzDesc]; + BS->GetMemoryMap(&SizePtr, Descriptor, &MapKey, &SzDesc, &RevDesc); + + auto cDefaultMemoryMap = 0; // The sixth entry. + + //-----------------------------------------------------------// + // A simple loop which finds a usable memory region for us. + //-----------------------------------------------------------// + + SizeT lookIndex = 0UL; + + for (; Descriptor[lookIndex].Kind != EfiMemoryType::EfiConventionalMemory; ++lookIndex) + { + ; + } + + cDefaultMemoryMap = lookIndex; + + //-----------------------------------------------------------// + // Update handover file specific table and phyiscal start field. + //-----------------------------------------------------------// + + handoverHdrPtr->f_PhysicalStart = + (VoidPtr)Descriptor[cDefaultMemoryMap].PhysicalStart; + + handoverHdrPtr->f_FirmwareSpecific[HEL::kHandoverSpecificAttrib] = + Descriptor[cDefaultMemoryMap].Attribute; + handoverHdrPtr->f_FirmwareSpecific[HEL::kHandoverSpecificKind] = + Descriptor[cDefaultMemoryMap].Kind; + handoverHdrPtr->f_FirmwareSpecific[HEL::kHandoverSpecificMemoryEfi] = + (UIntPtr)Descriptor; + + handoverHdrPtr->f_VirtualStart = + (VoidPtr)Descriptor[cDefaultMemoryMap].VirtualStart; + handoverHdrPtr->f_VirtualSize = + Descriptor[cDefaultMemoryMap].NumberOfPages; /* # of pages */ + + handoverHdrPtr->f_FirmwareVendorLen = BStrLen(SystemTable->FirmwareVendor); + handoverHdrPtr->f_Magic = kHandoverMagic; handoverHdrPtr->f_Version = kHandoverVersion; @@ -164,7 +202,7 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, // ---------------------------------------------------- // BFileReader readerKernel(L"newoskrnl.dll", ImageHandle); - + readerKernel.ReadAll(0); Boot::ProgramLoader* loader = nullptr; @@ -185,7 +223,7 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, handoverHdrPtr->f_FirmwareVendorLen = BStrLen(SystemTable->FirmwareVendor); - EFI::ExitBootServices(*MapKey, ImageHandle); + EFI::ExitBootServices(MapKey, ImageHandle); // ---------------------------------------------------- // // Call kernel. diff --git a/Boot/Sources/HEL/AMD64/New+Delete.cxx b/Boot/Sources/HEL/AMD64/New+Delete.cxx index 62dcda35..b651f091 100644 --- a/Boot/Sources/HEL/AMD64/New+Delete.cxx +++ b/Boot/Sources/HEL/AMD64/New+Delete.cxx @@ -19,7 +19,9 @@ EXTERN EfiBootServices* BS; void* operator new(size_t sz) { void* buf = nullptr; - BS->AllocatePool(EfiMemoryType::EfiLoaderData, sz, &buf); + + while (BS->AllocatePool(EfiMemoryType::EfiLoaderData, sz, &buf) == kBufferTooSmall) + BS->FreePool(buf); return buf; } diff --git a/Boot/Sources/ProgramLoader.cxx b/Boot/Sources/ProgramLoader.cxx index 6568f0aa..bdd54383 100644 --- a/Boot/Sources/ProgramLoader.cxx +++ b/Boot/Sources/ProgramLoader.cxx @@ -41,7 +41,7 @@ namespace Boot if (firstBytes[0] == kMagMz0 && firstBytes[1] == kMagMz1) { - writer.Write("newosldr: Windows executable detected.\r"); + writer.Write("newosldr: PE32+ executable detected.\r"); ExecHeaderPtr hdrPtr = ldr_find_exec_header(firstBytes); ExecOptionalHeaderPtr optHdr = ldr_find_opt_exec_header(firstBytes); diff --git a/Boot/amd64-efi.make b/Boot/amd64-efi.make index f11d68e3..b8d5b771 100644 --- a/Boot/amd64-efi.make +++ b/Boot/amd64-efi.make @@ -29,7 +29,7 @@ IMG=epm-master-1.img IMG_2=epm-slave.img IMG_3=epm-master-2.img -EMU_FLAGS=-net none -smp 2 -m 4G -M q35 \ +EMU_FLAGS=-net none -smp 2 -m 6G -M q35 \ -bios $(BIOS) -device piix3-ide,id=ide \ -drive id=disk,file=$(IMG),format=raw,if=none \ -device ide-hd,drive=disk,bus=ide.0 -drive \ 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(); -} |
