summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
Diffstat (limited to 'dev')
-rw-r--r--dev/boot/BootKit/BootKit.h127
-rw-r--r--dev/boot/amd64-ci.make4
-rw-r--r--dev/boot/amd64-desktop.make4
-rw-r--r--dev/boot/arm64-desktop.make4
-rw-r--r--dev/boot/modules/SysChk/SysChk.cc6
-rw-r--r--dev/boot/modules/SysChk/amd64-ahci-gpt.json3
-rw-r--r--dev/boot/modules/SysChk/amd64-pio-gpt.json3
-rw-r--r--dev/boot/src/BootThread.cc22
-rw-r--r--dev/boot/src/HEL/AMD64/BootAPI.S45
-rw-r--r--dev/boot/src/HEL/AMD64/BootEFI.cc2
-rw-r--r--dev/boot/src/HEL/AMD64/BootPlatform.cc56
-rw-r--r--dev/boot/src/HEL/ARM64/BootEFI.cc2
-rw-r--r--dev/kernel/FSKit/HeFS.h4
-rw-r--r--dev/kernel/FirmwareKit/EPM.h11
-rw-r--r--dev/kernel/FirmwareKit/GPT.h16
-rw-r--r--dev/kernel/FirmwareKit/VEPM.h29
-rw-r--r--dev/kernel/KernelKit/DriveMgr.h2
-rw-r--r--dev/kernel/amd64-ci.make2
-rw-r--r--dev/kernel/amd64-desktop.make2
-rw-r--r--dev/kernel/arm64-desktop.make2
-rw-r--r--dev/kernel/kernel_rsrc.rsrc2
-rw-r--r--dev/kernel/src/FS/HeFS.cc8
22 files changed, 225 insertions, 131 deletions
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 <BootKit/HW/ATA.h>
-#include <FirmwareKit/EPM.h>
#include <CompilerKit/Version.h>
#include <modules/CoreGfx/CoreGfx.h>
@@ -28,6 +27,9 @@
#include <NewKit/Defines.h>
#include <modules/ATA/ATA.h>
+#include <FirmwareKit/VEPM.h>
+#include <FirmwareKit/EPM.h>
+#include <FirmwareKit/GPT.h>
#include <FirmwareKit/EFI.h>
/***********************************************************************************/
@@ -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<VoidPtr>(const_cast<Char*>(kFsName)), StrLen(kFsName));
CopyMem(epm_boot.Name, reinterpret_cast<VoidPtr>(const_cast<Char*>(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<VoidPtr>(const_cast<Char*>(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<VoidPtr>(const_cast<Char*>(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<VoidPtr>(const_cast<Char*>(kFsName)), StrLen(kFsName));
+ CopyMem(epm_boot.Name, reinterpret_cast<VoidPtr>(const_cast<Char*>(kBlockName)), StrLen(kBlockName));
+ CopyMem(epm_boot.Magic, reinterpret_cast<VoidPtr>(const_cast<Char*>(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<BootDeviceATA> 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<HEL::HandoverProc>(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 <HALKit/AMD64/Processor.h>
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 <FirmwareKit/EPM.h>
+#include <FirmwareKit/EFI.h>
/// @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);