From 42ae768f08f2ec8a41d2ea2183f30a571f0c432f Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Tue, 22 Apr 2025 08:48:07 +0200 Subject: dev, kernel: VEPM WiP implementation, and syschk fixes in WiP. - Currently working on VEPM and adapting it to SysChk. - Refactor DriveMgr for VEPM. - Fix warnings in HeFS.cc, ALIGN(8) on HeFS.h - Update PIO modules to use VEPM. Signed-off-by: Amlal El Mahrouss --- compile_flags.txt | 5 +- dev/boot/BootKit/BootKit.h | 127 ++++++++++++++++++++-------- dev/boot/amd64-ci.make | 4 +- dev/boot/amd64-desktop.make | 4 +- dev/boot/arm64-desktop.make | 4 +- dev/boot/modules/SysChk/SysChk.cc | 6 +- dev/boot/modules/SysChk/amd64-ahci-gpt.json | 3 +- dev/boot/modules/SysChk/amd64-pio-gpt.json | 3 +- dev/boot/src/BootThread.cc | 22 ++++- dev/boot/src/HEL/AMD64/BootAPI.S | 45 ++++++++++ dev/boot/src/HEL/AMD64/BootEFI.cc | 2 +- dev/boot/src/HEL/AMD64/BootPlatform.cc | 56 ------------ dev/boot/src/HEL/ARM64/BootEFI.cc | 2 +- dev/kernel/FSKit/HeFS.h | 4 +- dev/kernel/FirmwareKit/EPM.h | 11 ++- dev/kernel/FirmwareKit/GPT.h | 16 +--- dev/kernel/FirmwareKit/VEPM.h | 29 +++++++ dev/kernel/KernelKit/DriveMgr.h | 2 +- dev/kernel/amd64-ci.make | 2 +- dev/kernel/amd64-desktop.make | 2 +- dev/kernel/arm64-desktop.make | 2 +- dev/kernel/kernel_rsrc.rsrc | 2 +- dev/kernel/src/FS/HeFS.cc | 8 +- modules_pio_x64.sh | 2 +- 24 files changed, 229 insertions(+), 134 deletions(-) diff --git a/compile_flags.txt b/compile_flags.txt index 001d0cfc..604ab767 100644 --- a/compile_flags.txt +++ b/compile_flags.txt @@ -21,7 +21,8 @@ -Wall -Wpedantic -Wextra --DBOOTZ_GPT_SUPPORT -D__FSKIT_INCLUDES_HEFS__ -D__FSKIT_INCLUDES_NEFS__ --D__FSKIT_INCLUDES_EXT2__ \ No newline at end of file +-D__FSKIT_INCLUDES_EXT2__ +-D__NE_VEPM__ +-DBOOTZ_VEPM_SUPPORT \ No newline at end of file diff --git a/dev/boot/BootKit/BootKit.h b/dev/boot/BootKit/BootKit.h index c781876c..2555812f 100644 --- a/dev/boot/BootKit/BootKit.h +++ b/dev/boot/BootKit/BootKit.h @@ -12,7 +12,6 @@ #pragma once #include -#include #include #include @@ -28,6 +27,9 @@ #include #include +#include +#include +#include #include /***********************************************************************************/ @@ -225,6 +227,7 @@ namespace Boot /// @brief check if partition is good. Bool IsPartitionValid() noexcept { +#if defined(BOOTZ_EPM_SUPPORT) fDiskDev.Leak().mBase = (kNeFSRootCatalogStartAddress); fDiskDev.Leak().mSize = BootDev::kSectorSize; @@ -258,6 +261,9 @@ namespace Boot writer.Write(L"BootZ: Partition: ").Write(blockPart->PartitionName).Write(L" is healthy.\r"); return true; +#else + return false; +#endif } private: @@ -307,7 +313,7 @@ namespace Boot BootDev fDiskDev; }; - /// @brief Format disk. + /// @brief Format disk with a specific partition scheme. /// @param part_name partition Name /// @param blob blos. /// @param blob_sz n blobs (n * sizeof(blob_struct)). @@ -321,11 +327,10 @@ namespace Boot if (!blob || !blob_sz) return false; /// sanity check - /// @note A catalog roughly equal to a sector. - + /// @note A catalog roughly equal to a sector in NeFS terms. constexpr auto kMinimumDiskSize = kNeFSMinimumDiskSize; // at minimum. - /// @note also look at EPM headers, for free part blocks. + /// @note also look at EPM headers, for free part blocks. (only applies if EPM or vEPM is used) if (fDiskDev.GetDiskSize() < kMinimumDiskSize) { @@ -349,13 +354,6 @@ namespace Boot part.DiskSize = fDiskDev.GetDiskSize(); part.Flags = kNeFSPartitionTypeBoot | kNeFSPartitionTypeStandard; -#if defined(BOOTZ_EPM_SUPPORT) - fDiskDev.Leak().mBase = kNeFSRootCatalogStartAddress; - fDiskDev.Leak().mSize = sizeof(NEFS_ROOT_PARTITION_BLOCK); - - fDiskDev.Write((Char*)&part, sizeof(NEFS_ROOT_PARTITION_BLOCK)); -#endif // defined(BOOTZ_EPM_SUPPORT) - BootTextWriter writer; writer << "BootZ: Partition name: " << part.PartitionName << "\r"; @@ -369,7 +367,7 @@ namespace Boot EPM_PART_BLOCK epm_boot{0}; const auto kFsName = "NeFS"; - const auto kBlockName = "OS"; + const auto kBlockName = "OS (EPM)"; epm_boot.FsVersion = kNeFSVersionInteger; epm_boot.LbaStart = kNeFSRootCatalogStartAddress; @@ -378,11 +376,7 @@ namespace Boot epm_boot.Kind = kEPMNeKernel; epm_boot.NumBlocks = part.CatalogCount; - epm_boot.Guid.Data1 = 0x00000000; - epm_boot.Guid.Data2 = 0x0000; - epm_boot.Guid.Data3 = 0x0000; - - SetMem(epm_boot.Guid.Data4, 0, 8); + epm_boot.Guid = kEPMNilGuid; CopyMem(epm_boot.Fs, reinterpret_cast(const_cast(kFsName)), StrLen(kFsName)); CopyMem(epm_boot.Name, reinterpret_cast(const_cast(kBlockName)), StrLen(kBlockName)); @@ -393,36 +387,44 @@ namespace Boot fDiskDev.Write((Char*)&epm_boot, sizeof(EPM_PART_BLOCK)); - writer.Write(L"BootZ: Drive is EPM formatted.\r"); -#elif defined(BOOTZ_GPT_SUPPORT) - const auto kBlockName = "NeFS_OS"; + fDiskDev.Leak().mBase = kNeFSRootCatalogStartAddress; + fDiskDev.Leak().mSize = sizeof(NEFS_ROOT_PARTITION_BLOCK); + + fDiskDev.Write((Char*)&part, sizeof(NEFS_ROOT_PARTITION_BLOCK)); + writer.Write(L"BootZ: Drive is EPM formatted.\r"); +#elif defined(BOOTZ_GPT_SUPPORT) || defined(BOOTZ_VEPM_SUPPORT) GPT_PARTITION_TABLE gpt_part{0}; CopyMem(gpt_part.Signature, reinterpret_cast(const_cast(kMagicGPT)), StrLen(kMagicGPT)); - gpt_part.Revision = 0x00010000; + gpt_part.Revision = 0x00010000; gpt_part.HeaderSize = sizeof(GPT_PARTITION_TABLE); gpt_part.CRC32 = 0x00000000; - gpt_part.Reserved1 = 0x00000000; - gpt_part.LBAHeader = 0x00000000; - gpt_part.LBAAltHeader = 0x00000000; + gpt_part.Reserved1 = 0x00000000; + gpt_part.LBAHeader = 0x00000000; + gpt_part.LBAAltHeader = 0x00000000; gpt_part.FirstGPTEntry = 0x00000000; - gpt_part.LastGPTEntry = 0x00000000; - gpt_part.Guid.Data1 = 0x00000000; - gpt_part.Guid.Data2 = 0x0000; - gpt_part.Guid.Data3 = 0x0000; + gpt_part.LastGPTEntry = 0x00000000; - gpt_part.Revision = 0x00010000; +#if defined(BOOTZ_GPT_SUPPORT) + gpt_part.Guid.Data1 = 0x00000000; + gpt_part.Guid.Data2 = 0x0000; + gpt_part.Guid.Data3 = 0x0000; SetMem(gpt_part.Guid.Data4, 0, 8); +#else + gpt_part.Guid = kVEPMGuidEFI; +#endif - gpt_part.StartingLBA = 0x00000000; + gpt_part.Revision = 0x00010000; + + gpt_part.StartingLBA = 0x00000000; gpt_part.NumPartitionEntries = 0x00000000; - gpt_part.SizeOfEntries = 0x00000000; - gpt_part.CRC32PartEntry = 0x00000000; + gpt_part.SizeOfEntries = 0x00000000; + gpt_part.CRC32PartEntry = 0x00000000; SetMem(gpt_part.Reserved2, 0, kSectorAlignGPT_PartTbl); @@ -431,6 +433,63 @@ namespace Boot fDiskDev.Write((Char*)&gpt_part, sizeof(GPT_PARTITION_TABLE)); +#if defined(BOOTZ_VEPM_SUPPORT) + const auto kBlockName = "OS (VEPM)"; + + GPT_PARTITION_ENTRY gpt_part_entry{0}; + + gpt_part_entry.StartLBA = kNeFSRootCatalogStartAddress; + gpt_part_entry.EndLBA = fDiskDev.GetDiskSize(); + gpt_part_entry.Attributes = 0x00000000; + + gpt_part_entry.PartitionTypeGUID.Data1 = 0x00000000; + gpt_part_entry.PartitionTypeGUID.Data2 = 0x0000; + gpt_part_entry.PartitionTypeGUID.Data3 = 0x0000; + + CopyMem(gpt_part_entry.Name, reinterpret_cast(const_cast(kBlockName)), StrLen(kBlockName)); + + SetMem(gpt_part_entry.PartitionTypeGUID.Data4, 0, 8); + + fDiskDev.Leak().mBase = kGPTPartitionTableLBA + sizeof(GPT_PARTITION_TABLE); + fDiskDev.Leak().mSize = sizeof(GPT_PARTITION_ENTRY); + fDiskDev.Write((Char*)&gpt_part_entry, sizeof(GPT_PARTITION_ENTRY)); + + EPM_PART_BLOCK epm_boot{0}; + + const auto kFsName = "NeFS"; + + epm_boot.FsVersion = kNeFSVersionInteger; + epm_boot.LbaStart = kNeFSRootCatalogStartAddress; + epm_boot.LbaEnd = fDiskDev.GetDiskSize(); + epm_boot.SectorSz = part.SectorSize; + epm_boot.Kind = kEPMNeKernel; + epm_boot.NumBlocks = part.CatalogCount; + + epm_boot.Guid = kEPMNilGuid; + + CopyMem(epm_boot.Fs, reinterpret_cast(const_cast(kFsName)), StrLen(kFsName)); + CopyMem(epm_boot.Name, reinterpret_cast(const_cast(kBlockName)), StrLen(kBlockName)); + CopyMem(epm_boot.Magic, reinterpret_cast(const_cast(kEPMMagic)), StrLen(kEPMMagic)); + + fDiskDev.Leak().mBase = kGPTPartitionTableLBA + sizeof(GPT_PARTITION_TABLE); + fDiskDev.Leak().mSize = sizeof(GPT_PARTITION_ENTRY); + + fDiskDev.Write((Char*)&gpt_part_entry, sizeof(GPT_PARTITION_ENTRY)); + + fDiskDev.Leak().mBase = gpt_part_entry.StartLBA; + fDiskDev.Leak().mSize = sizeof(EPM_PART_BLOCK); + + fDiskDev.Write((Char*)&epm_boot, sizeof(EPM_PART_BLOCK)); + + fDiskDev.Leak().mBase = gpt_part_entry.StartLBA + kNeFSRootCatalogStartAddress; + fDiskDev.Leak().mSize = sizeof(NEFS_ROOT_PARTITION_BLOCK); + + fDiskDev.Write((Char*)&part, sizeof(NEFS_ROOT_PARTITION_BLOCK)); + + writer.Write(L"BootZ: Drive is vEPM formatted.\r"); +#else + const auto kBlockName = "OS (GPT)"; + GPT_PARTITION_ENTRY gpt_part_entry{0}; gpt_part_entry.StartLBA = kNeFSRootCatalogStartAddress; @@ -455,7 +514,7 @@ namespace Boot fDiskDev.Write((Char*)&part, sizeof(NEFS_ROOT_PARTITION_BLOCK)); writer.Write(L"BootZ: Drive is GPT formatted.\r"); - +#endif /// defined(BOOTZ_VEPM_SUPPORT) #endif return YES; diff --git a/dev/boot/amd64-ci.make b/dev/boot/amd64-ci.make index 62ab9af1..b396b0d5 100644 --- a/dev/boot/amd64-ci.make +++ b/dev/boot/amd64-ci.make @@ -70,7 +70,7 @@ FLAG_GNU=-fshort-wchar -Wall -Wpedantic -Wextra -Werror -D__EFI_x86_64__ -mno-re -std=c++20 -DBOOTZ_GPT_SUPPORT -DBOOTZ_EPM_SUPPORT -D__HAVE_NE_APIS__ -DZBA_USE_FB -D__NE_AMD64__ -D__NE__ -DNE_AUTO_FORMAT BOOTLOADER=bootz.efi -KERNEL=vmkrnl.efi +KERNEL=krnl.efi SYSCHK=chk.efi BOOTNET=net.efi SCIKIT=user.sys @@ -130,7 +130,7 @@ efi: $(HTTP_GET) https://retrage.github.io/edk2-nightly/bin/DEBUGX64_OVMF.fd -O OVMF.fd BINS=*.bin -EXECUTABLES=bootz.efi vmkrnl.efi OVMF.fd +EXECUTABLES=bootz.efi krnl.efi OVMF.fd TARGETS=$(REM_FLAG) $(OBJ) $(BIN) $(IMG) $(IMG_2) $(EXECUTABLES) diff --git a/dev/boot/amd64-desktop.make b/dev/boot/amd64-desktop.make index 45446333..432a00c8 100644 --- a/dev/boot/amd64-desktop.make +++ b/dev/boot/amd64-desktop.make @@ -72,7 +72,7 @@ FLAG_GNU=-fshort-wchar -D__EFI_x86_64__ -Wall -Wpedantic -Wextra -mno-red-zone - -std=c++20 -DBOOTZ_GPT_SUPPORT -DBOOTZ_EPM_SUPPORT -D__HAVE_NE_APIS__ -DZBA_USE_FB -D__NE_AMD64__ -D__NE__ -DNE_AUTO_FORMAT -Wl,--disable-reloc-section BOOTLOADER=bootz.efi -KERNEL=vmkrnl.efi +KERNEL=krnl.efi SYSCHK=chk.efi BOOTNET=net.efi SCIKIT=user.sys @@ -138,7 +138,7 @@ efi: $(HTTP_GET) https://retrage.github.io/edk2-nightly/bin/DEBUGX64_OVMF.fd -O OVMF.fd BINS=*.bin -EXECUTABLES=bootz.efi vmkrnl.efi OVMF.fd +EXECUTABLES=bootz.efi krnl.efi OVMF.fd TARGETS=$(REM_FLAG) $(OBJ) $(BIN) $(IMG) $(IMG_2) $(EXECUTABLES) diff --git a/dev/boot/arm64-desktop.make b/dev/boot/arm64-desktop.make index 06ec84d0..114d2e7e 100644 --- a/dev/boot/arm64-desktop.make +++ b/dev/boot/arm64-desktop.make @@ -48,7 +48,7 @@ FLAG_GNU=-fshort-wchar -c -ffreestanding -MMD -mno-red-zone -D__NE_ARM64__ -fno- -std=c++20 -DBOOTZ_EPM_SUPPORT -DZBA_USE_FB -D__FSKIT_USE_NEFS__ -D__BOOTZ_STANDALONE__ -D__NEOSKRNL__ -D__BOOTZ__ -D__HAVE_NE_APIS__ -D__NE__ -I../ -I../kernel BOOT_LOADER=bootz.efi -KERNEL=vmkrnl.efi +KERNEL=krnl.efi SYSCHK=chk.efi STARTUP=startup.efi @@ -94,7 +94,7 @@ efi: $(HTTP_GET) https://retrage.github.io/edk2-nightly/bin/DEBUGAARCH64_QEMU_EFI.fd -O OVMF.fd BINS=*.bin -EXECUTABLES=bootz.efi vmkrnl.efi OVMF.fd +EXECUTABLES=bootz.efi krnl.efi OVMF.fd TARGETS=$(REM_FLAG) $(OBJ) $(BIN) $(IMG) $(IMG_2) $(EXECUTABLES) diff --git a/dev/boot/modules/SysChk/SysChk.cc b/dev/boot/modules/SysChk/SysChk.cc index 3979714d..1b1de6f4 100644 --- a/dev/boot/modules/SysChk/SysChk.cc +++ b/dev/boot/modules/SysChk/SysChk.cc @@ -23,7 +23,7 @@ // Makes the compiler shut up. #ifndef kMachineModel -#define kMachineModel "Ne" +#define kMachineModel "OS" #endif // !kMachineModel EXTERN_C Int32 SysChkModuleMain(Kernel::HEL::BootInfoHeader* handover) @@ -31,6 +31,8 @@ EXTERN_C Int32 SysChkModuleMain(Kernel::HEL::BootInfoHeader* handover) NE_UNUSED(handover); #if defined(__ATA_PIO__) + Boot::BootTextWriter writer; + Boot::BDiskFormatFactory partition_factory; if (partition_factory.IsPartitionValid()) @@ -44,6 +46,8 @@ EXTERN_C Int32 SysChkModuleMain(Kernel::HEL::BootInfoHeader* handover) partition_factory.Format(kMachineModel, &desc, 1); + writer.Write(L"BootZ: Partition formatted.\r"); + if (partition_factory.IsPartitionValid()) return kEfiOk; diff --git a/dev/boot/modules/SysChk/amd64-ahci-gpt.json b/dev/boot/modules/SysChk/amd64-ahci-gpt.json index 52864969..6a204a25 100644 --- a/dev/boot/modules/SysChk/amd64-ahci-gpt.json +++ b/dev/boot/modules/SysChk/amd64-ahci-gpt.json @@ -17,7 +17,8 @@ "__BOOTZ_STANDALONE__", "__NE_AMD64__", "__AHCI__", - "BOOTZ_GPT_SUPPORT", + "__NE_VEPM__", + "BOOTZ_VEPM_SUPPORT", "kChkVersionHighest=0x0100", "kChkVersionLowest=0x0100", "kChkVersion=0x0100" diff --git a/dev/boot/modules/SysChk/amd64-pio-gpt.json b/dev/boot/modules/SysChk/amd64-pio-gpt.json index 2a4c4efe..4fe9d986 100644 --- a/dev/boot/modules/SysChk/amd64-pio-gpt.json +++ b/dev/boot/modules/SysChk/amd64-pio-gpt.json @@ -17,7 +17,8 @@ "__BOOTZ_STANDALONE__", "__NE_AMD64__", "__ATA_PIO__", - "BOOTZ_GPT_SUPPORT", + "__NE_VEPM__", + "BOOTZ_VEPM_SUPPORT", "kChkVersionHighest=0x0100", "kChkVersionLowest=0x0100", "kChkVersion=0x0100" diff --git a/dev/boot/src/BootThread.cc b/dev/boot/src/BootThread.cc index 0a1e74c9..cf303bec 100644 --- a/dev/boot/src/BootThread.cc +++ b/dev/boot/src/BootThread.cc @@ -129,16 +129,16 @@ namespace Boot #ifdef __NE_AMD64__ if (handover_struc->HandoverArch != HEL::kArchAMD64) { - fb_render_string("BootZ: Not an handover header, bad CPU...", 40, 10, RGB(0xFF, 0xFF, 0xFF)); + writer.Write("BootZ: Not an handover header, bad CPU...\r"); } #elif defined(__NE_ARM64__) if (handover_struc->HandoverArch != HEL::kArchARM64) { - fb_render_string("BootZ: Not an handover header, bad CPU...", 40, 10, RGB(0xFF, 0xFF, 0xFF)); + writer.Write("BootZ: Not an handover header, bad CPU...\r"); } #endif - fb_render_string("BootZ: Not an handover header...", 40, 10, RGB(0xFF, 0xFF, 0xFF)); + writer.Write("BootZ: Not an handover header...\r"); ::Boot::Stop(); } } @@ -190,10 +190,24 @@ namespace Boot if (own_stack) { - return rt_jump_to_address(fStartAddress, fHandover, &fStack[mib_cast(16) - 1]); + writer.Write("BootZ: Using own stack.\r"); + writer.Write("BootZ: Stack address: ").Write((UIntPtr)&fStack[mib_cast(16) - 1]).Write("\r"); + writer.Write("BootZ: Stack size: ").Write(mib_cast(16)).Write("\r"); + + rt_jump_to_address(fStartAddress, fHandover, &fStack[mib_cast(16) - 1]); + + return kEfiOk; } else { + delete[] fStack; + fStack = nullptr; + // we don't need the stack anymore. + + BootTextWriter writer; + + writer.Write("BootZ: Using EFI stack.\r"); + return reinterpret_cast(fStartAddress)(fHandover); } diff --git a/dev/boot/src/HEL/AMD64/BootAPI.S b/dev/boot/src/HEL/AMD64/BootAPI.S index 963ef46a..9cc15918 100644 --- a/dev/boot/src/HEL/AMD64/BootAPI.S +++ b/dev/boot/src/HEL/AMD64/BootAPI.S @@ -58,3 +58,48 @@ boot_read_cr3: boot_write_cr3: mov cr3, rcx ret + +.section .text + +.extern rt_wait_400ns + +.global rt_out8 +.global rt_out16 +.global rt_out32 + +.global rt_in8 +.global rt_in16 +.global rt_in32 + +rt_out8: + mov al, dl + mov dx, cx + out dx, al + ret + +rt_out16: + mov ax, dx + mov dx, cx + out dx, ax + ret + +rt_out32: + mov eax, edx + mov edx, ecx + out dx, eax + ret + +rt_in8: + mov dx, cx + in al, dx + ret + +rt_in16: + mov edx, ecx + in ax, dx + ret + +rt_in32: + mov rdx, rcx + in eax, dx + ret \ No newline at end of file diff --git a/dev/boot/src/HEL/AMD64/BootEFI.cc b/dev/boot/src/HEL/AMD64/BootEFI.cc index 8a920e1a..85b7f729 100644 --- a/dev/boot/src/HEL/AMD64/BootEFI.cc +++ b/dev/boot/src/HEL/AMD64/BootEFI.cc @@ -229,7 +229,7 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle, handover_hdr->f_FirmwareVendorLen = Boot::BStrLen(sys_table->FirmwareVendor); // Assign to global 'kHandoverHeader'. - WideChar kernel_path[256U] = L"vmkrnl.efi"; + WideChar kernel_path[256U] = L"krnl.efi"; UInt32 kernel_path_sz = 256U; if (ST->RuntimeServices->GetVariable(L"/props/boot_path", kEfiGlobalNamespaceVarGUID, nullptr, &kernel_path_sz, kernel_path) != kEfiOk) diff --git a/dev/boot/src/HEL/AMD64/BootPlatform.cc b/dev/boot/src/HEL/AMD64/BootPlatform.cc index a06b8aa0..1a1f9b89 100644 --- a/dev/boot/src/HEL/AMD64/BootPlatform.cc +++ b/dev/boot/src/HEL/AMD64/BootPlatform.cc @@ -38,62 +38,6 @@ EXTERN_C void rt_std() asm volatile("std"); } -EXTERN_C void rt_out8(UInt16 port, UInt8 value) -{ - asm volatile("outb %%al, %1" - : - : "a"(value), "Nd"(port) - : "memory"); -} - -EXTERN_C void rt_out16(UInt16 port, UInt16 value) -{ - asm volatile("outw %%ax, %1" - : - : "a"(value), "Nd"(port) - : "memory"); -} - -EXTERN_C void rt_out32(UInt16 port, UInt32 value) -{ - asm volatile("outl %%eax, %1" - : - : "a"(value), "Nd"(port) - : "memory"); -} - -EXTERN_C UInt8 rt_in8(UInt16 port) -{ - UInt8 value; - asm volatile("inb %1, %%al" - : "=a"(value) - : "Nd"(port) - : "memory"); - - return value; -} - -EXTERN_C UInt16 rt_in16(UInt16 port) -{ - UInt16 value; - asm volatile("inw %%dx, %%ax" - : "=a"(value) - : "d"(port)); - - return value; -} - -EXTERN_C UInt32 rt_in32(UInt16 port) -{ - UInt32 value; - asm volatile("inl %1, %%eax" - : "=a"(value) - : "Nd"(port) - : "memory"); - - return value; -} - #else #include diff --git a/dev/boot/src/HEL/ARM64/BootEFI.cc b/dev/boot/src/HEL/ARM64/BootEFI.cc index e071def1..9132cec1 100644 --- a/dev/boot/src/HEL/ARM64/BootEFI.cc +++ b/dev/boot/src/HEL/ARM64/BootEFI.cc @@ -226,7 +226,7 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle, handover_hdr->f_FirmwareVendorLen = Boot::BStrLen(sys_table->FirmwareVendor); - Boot::BootFileReader reader_kernel(L"vmkrnl.efi", image_handle); + Boot::BootFileReader reader_kernel(L"krnl.efi", image_handle); reader_kernel.ReadAll(0); diff --git a/dev/kernel/FSKit/HeFS.h b/dev/kernel/FSKit/HeFS.h index 4a50f438..65594b99 100644 --- a/dev/kernel/FSKit/HeFS.h +++ b/dev/kernel/FSKit/HeFS.h @@ -115,7 +115,7 @@ inline constexpr ATime kHeFSTimeMax = 0xFFFFFFFFFFFFFFFF; /// @details This structure is used to store the file information of a file. /// @note The index node is a special type of INode that contains the file information. /// @note The index node is used to store the file information of a file. -struct PACKED HEFS_INDEX_NODE final +struct PACKED ALIGN(8) HEFS_INDEX_NODE final { Kernel::Utf16Char fName[kHeFSFileNameLen]; /// @brief File name. Kernel::UInt32 fFlags; /// @brief File flags. @@ -147,7 +147,7 @@ enum /// @brief HeFS directory node. /// @details This structure is used to store the directory information of a file. /// @note The directory node is a special type of INode that contains the directory entries. -struct PACKED HEFS_INDEX_NODE_DIRECTORY final +struct PACKED ALIGN(8) HEFS_INDEX_NODE_DIRECTORY final { Kernel::Utf16Char fName[kHeFSFileNameLen]; /// @brief Directory name. diff --git a/dev/kernel/FirmwareKit/EPM.h b/dev/kernel/FirmwareKit/EPM.h index 548bb9a7..6db82506 100644 --- a/dev/kernel/FirmwareKit/EPM.h +++ b/dev/kernel/FirmwareKit/EPM.h @@ -80,8 +80,8 @@ typedef struct EPM_GUID */ struct PACKED EPM_PART_BLOCK { - Kernel::Char Magic[kEPMMagicLength]; - Kernel::Char Name[kEPMNameLength]; + Kernel::Char Magic[kEPMMagicLength] = {0}; + Kernel::Char Name[kEPMNameLength] = {0}; EPM_GUID Guid; Kernel::Int32 Version; Kernel::Int64 NumBlocks; @@ -108,4 +108,11 @@ enum kEPMInvalidOS = 0xff, }; +inline EPM_GUID kEPMNilGuid = { + 0x0U, + 0x0U, + 0x0U, + { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } +}; + #endif // ifndef FIRMWAREKIT_EPM_H diff --git a/dev/kernel/FirmwareKit/GPT.h b/dev/kernel/FirmwareKit/GPT.h index aab6b650..4be1fed2 100644 --- a/dev/kernel/FirmwareKit/GPT.h +++ b/dev/kernel/FirmwareKit/GPT.h @@ -17,19 +17,9 @@ namespace Kernel { - struct GPT_GUID; struct GPT_PARTITION_TABLE; struct GPT_PARTITION_ENTRY; - /// @brief GPT GUID structure. - typedef struct GPT_GUID - { - Kernel::UInt32 Data1; - Kernel::UInt16 Data2; - Kernel::UInt16 Data3; - Kernel::UInt8 Data4[8]; - } GPT_GUID; - struct PACKED GPT_PARTITION_TABLE final { Char Signature[kMagicLenGPT]; @@ -41,7 +31,7 @@ namespace Kernel UInt64 LBAAltHeader; UInt64 FirstGPTEntry; UInt64 LastGPTEntry; - GPT_GUID Guid; + EfiGUID Guid; UInt64 StartingLBA; UInt32 NumPartitionEntries; UInt32 SizeOfEntries; @@ -51,8 +41,8 @@ namespace Kernel struct PACKED GPT_PARTITION_ENTRY { - GPT_GUID PartitionTypeGUID; - GPT_GUID UniquePartitionGUID; + EfiGUID PartitionTypeGUID; + EfiGUID UniquePartitionGUID; UInt64 StartLBA; UInt64 EndLBA; UInt64 Attributes; diff --git a/dev/kernel/FirmwareKit/VEPM.h b/dev/kernel/FirmwareKit/VEPM.h index 9d8fa4d4..2b95e12d 100644 --- a/dev/kernel/FirmwareKit/VEPM.h +++ b/dev/kernel/FirmwareKit/VEPM.h @@ -8,7 +8,36 @@ #define FIRMWAREKIT_VEPM_H #include +#include /// @brief The Virtual Explicit Partition Map scheme extension. +#ifdef __NE_VEPM__ +#ifdef kEPMMagic +#undef kEPMMagic +#endif // kEPMMagic + +#define kEPMMagic "EPMVM" + +/// @brief VEPM GUID. +/// @note This is the GUID used to identify a VEPM partition. +inline EPM_GUID kVEPMGuidEPM = { + 0x9a1b3f2e, + 0x4c3f, + 0x4d52, + { 0xa7, 0x83, 0x9c, 0x21, 0x7b, 0x5e, 0x4d, 0xac } +}; + +/// @brief VEPM GUID. +/// @note This is the GUID used to identify a VEPM partition (EFI version) +inline EfiGUID kVEPMGuidEFI = { + 0x9a1b3f2e, + 0x4c3f, + 0x4d52, + { 0xa7, 0x83, 0x9c, 0x21, 0x7b, 0x5e, 0x4d, 0xac } +}; + +#define kVEPMGuidStr "9a1b3f2e-4c3f-4d52-a783-9c217b5e4dac" +#endif // __NE_VEPM__ + #endif // FIRMWAREKIT_VEPM_H \ No newline at end of file diff --git a/dev/kernel/KernelKit/DriveMgr.h b/dev/kernel/KernelKit/DriveMgr.h index 36aa635e..9dc8162b 100644 --- a/dev/kernel/KernelKit/DriveMgr.h +++ b/dev/kernel/KernelKit/DriveMgr.h @@ -39,7 +39,7 @@ namespace Kernel /// Storage flags, combine with types. kReadOnlyDrive = 0x10, // Read only drive kEPMDrive = 0x11, // Explicit Partition Map. - kEPTDrive = 0x12, // ESP w/ EPM partition. + kVEPMDrive = 0x12, // ESP w/ EPM partition. kMBRDrive = 0x13, // PC classic partition scheme kGPTDrive = 0x14, // PC new partition scheme kUnformattedDrive = 0x15, diff --git a/dev/kernel/amd64-ci.make b/dev/kernel/amd64-ci.make index 7748fc7c..4fb87ee1 100644 --- a/dev/kernel/amd64-ci.make +++ b/dev/kernel/amd64-ci.make @@ -35,7 +35,7 @@ LDFLAGS = -e hal_init_platform --subsystem=17 --image-base 0x4000000 LDOBJ = obj/*.obj # This file is the Kernel, responsible of task, memory, driver, sci, disk and device management. -KERNEL_IMG = vmkrnl.efi +KERNEL_IMG = krnl.efi .PHONY: error error: diff --git a/dev/kernel/amd64-desktop.make b/dev/kernel/amd64-desktop.make index ca31d130..7a901229 100644 --- a/dev/kernel/amd64-desktop.make +++ b/dev/kernel/amd64-desktop.make @@ -37,7 +37,7 @@ LDFLAGS = -e hal_init_platform --subsystem=17 --image-base 0x10000000 LDOBJ = obj/*.obj # This file is the Kernel, responsible of task, memory, driver, sci, disk and device management. -KERNEL_IMG = vmkrnl.efi +KERNEL_IMG = krnl.efi .PHONY: error error: diff --git a/dev/kernel/arm64-desktop.make b/dev/kernel/arm64-desktop.make index ec2a04ce..8a1a8c19 100644 --- a/dev/kernel/arm64-desktop.make +++ b/dev/kernel/arm64-desktop.make @@ -23,7 +23,7 @@ LDFLAGS = -subsystem:efi_application -entry:hal_init_platform /nodefaultlib LDOBJ = obj/*.obj # This file is the Kernel, responsible of task management and memory. -KERNEL = vmkrnl.efi +KERNEL = krnl.efi .PHONY: error error: diff --git a/dev/kernel/kernel_rsrc.rsrc b/dev/kernel/kernel_rsrc.rsrc index ab149b31..69922999 100644 --- a/dev/kernel/kernel_rsrc.rsrc +++ b/dev/kernel/kernel_rsrc.rsrc @@ -13,7 +13,7 @@ BEGIN VALUE "FileVersion", KERNEL_VERSION VALUE "InternalName", "neoskrnl" VALUE "LegalCopyright", "(c) 2024-2025 Amlal El Mahrouss, all rights reserved" - VALUE "OriginalFilename", "vmkrnl.efi" + VALUE "OriginalFilename", "krnl.efi" VALUE "ProductName", "NeKernel" VALUE "ProductVersion", KERNEL_VERSION END diff --git a/dev/kernel/src/FS/HeFS.cc b/dev/kernel/src/FS/HeFS.cc index 2269896f..e053c8c4 100644 --- a/dev/kernel/src/FS/HeFS.cc +++ b/dev/kernel/src/FS/HeFS.cc @@ -31,14 +31,14 @@ namespace Kernel /// @param dir_name The name of the directory. /// @param file_name The name of the file. /// @param kind The kind of the file (regular, directory, block, character, FIFO, socket, symbolic link, unknown). - STATIC HEFS_INDEX_NODE* hefs_fetch_index_node(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* dir_name, const Utf16Char* file_name, UInt8 kind) noexcept; + STATIC ATTRIBUTE(unused) HEFS_INDEX_NODE* hefs_fetch_index_node(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* dir_name, const Utf16Char* file_name, UInt8 kind) noexcept; /// @brief Allocate a new index node. /// @param root The root node of the filesystem. /// @param mnt The drive to read from. /// @param parent_dir_name The name of the parent directory. /// @return Status, see err_global_get(). - STATIC BOOL hefs_allocate_index_node(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* parent_dir_name, HEFS_INDEX_NODE* node) noexcept; + STATIC ATTRIBUTE(unused) BOOL hefs_allocate_index_node(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* parent_dir_name, HEFS_INDEX_NODE* node) noexcept; /// @brief Get the index node of a file or directory. /// @param root The root node of the filesystem. @@ -46,7 +46,7 @@ namespace Kernel /// @param dir_name The name of the directory. /// @param file_name The name of the file. /// @param kind The kind of the file (regular, directory, block, character, FIFO, socket, symbolic link, unknown). - STATIC HEFS_INDEX_NODE* hefs_fetch_index_node(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* dir_name, const Utf16Char* file_name, UInt8 kind) noexcept + STATIC ATTRIBUTE(unused) HEFS_INDEX_NODE* hefs_fetch_index_node(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* dir_name, const Utf16Char* file_name, UInt8 kind) noexcept { if (root) { @@ -178,7 +178,7 @@ namespace Kernel /// @param mnt The drive to read from. /// @param parent_dir_name The name of the parent directory. /// @return Status, see err_global_get(). - STATIC BOOL hefs_allocate_index_node(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* parent_dir_name, HEFS_INDEX_NODE* node) noexcept + STATIC ATTRIBUTE(unused) BOOL hefs_allocate_index_node(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* parent_dir_name, HEFS_INDEX_NODE* node) noexcept { NE_UNUSED(root); NE_UNUSED(mnt); diff --git a/modules_pio_x64.sh b/modules_pio_x64.sh index b091704e..49f0e667 100755 --- a/modules_pio_x64.sh +++ b/modules_pio_x64.sh @@ -5,7 +5,7 @@ # 04/05/25: Improve and fix script. cd dev/boot/modules/SysChk -btb amd64-pio-epm.json +btb amd64-pio-gpt.json cd ../ cd BootNet btb amd64.json \ No newline at end of file -- cgit v1.2.3