diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-04-19 08:36:30 +0200 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2025-04-19 08:36:30 +0200 |
| commit | 1740a0dff822d7666b8c1f056b6c411ef6b0f9fd (patch) | |
| tree | 646ae3f61ebcd3f83c888912c5f72efc0a8c25b0 /dev/kernel | |
| parent | 1dfc636e87c289d4091a9008a0beae0ff3d4e926 (diff) | |
kernel, mod, boot: extend GPT support.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev/kernel')
| -rw-r--r-- | dev/kernel/FirmwareKit/EFI.h | 1 | ||||
| -rw-r--r-- | dev/kernel/FirmwareKit/GPT.h | 8 | ||||
| -rw-r--r-- | dev/kernel/src/DriveMgr.cc | 36 |
3 files changed, 33 insertions, 12 deletions
diff --git a/dev/kernel/FirmwareKit/EFI.h b/dev/kernel/FirmwareKit/EFI.h index e4e78720..ca4360b1 100644 --- a/dev/kernel/FirmwareKit/EFI.h +++ b/dev/kernel/FirmwareKit/EFI.h @@ -7,5 +7,6 @@ #pragma once #include <FirmwareKit/EFI/EFI.h> +#include <FirmwareKit/GPT.h> /// @note this header is used to reference the EFI/EFI.h diff --git a/dev/kernel/FirmwareKit/GPT.h b/dev/kernel/FirmwareKit/GPT.h index 7ee5d10e..dc2b5ce3 100644 --- a/dev/kernel/FirmwareKit/GPT.h +++ b/dev/kernel/FirmwareKit/GPT.h @@ -11,7 +11,9 @@ #define kSectorAlignGPT_PartTbl (420U) #define kSectorAlignGPT_PartEntry (72U) -#define kPartNameGPT (8U) +#define kMagicLenGPT (8U) +#define kMagicGPT ("EFI PART") // "EFI PART" +#define kGPTPartitionTableLBA (512U + sizeof(GPT_PARTITION_TABLE)) namespace Kernel { @@ -30,10 +32,10 @@ namespace Kernel struct PACKED GPT_PARTITION_TABLE final { - Char PartitionName[kPartNameGPT]; + Char Signature[kMagicLenGPT]; UInt32 Revision; UInt32 HeaderSize; - UInt32 ChecksumCRC32; + UInt32 CRC32; UInt32 Reserved1; UInt64 LBAHeader; UInt64 LBAAltHeader; diff --git a/dev/kernel/src/DriveMgr.cc b/dev/kernel/src/DriveMgr.cc index a379ea43..f958a33f 100644 --- a/dev/kernel/src/DriveMgr.cc +++ b/dev/kernel/src/DriveMgr.cc @@ -8,6 +8,7 @@ #include <KernelKit/DriveMgr.h> #include <NewKit/Utils.h> #include <FirmwareKit/EPM.h> +#include <FirmwareKit/GPT.h> #include <modules/ATA/ATA.h> #include <modules/AHCI/AHCI.h> #include <modules/NVME/NVME.h> @@ -170,12 +171,12 @@ namespace Kernel trait.fInput(trait.fPacket); - if (rt_string_cmp(((EPM_PART_BLOCK*)trait.fPacket.fPacketContent)->Magic, kEPMMagic, kEPMMagicLength) == 0) + if (rt_string_cmp(block_struct.Magic, kEPMMagic, kEPMMagicLength) == 0) { trait.fPacket.fPacketReadOnly = NO; trait.fKind = kMassStorageDrive | kEPMDrive; - kout << "Disk is EPM.\r"; + kout << "Disk is EPM formatted.\r"; trait.fSectorSz = block_struct.SectorSz; trait.fLbaEnd = block_struct.LbaEnd; @@ -183,17 +184,34 @@ namespace Kernel } else { - trait.fPacket.fPacketReadOnly = YES; - trait.fKind = kMassStorageDrive | kUnformattedDrive | kReadOnlyDrive; + GPT_PARTITION_TABLE gpt_struct; - if (block_struct.Name[0] == 0 || - !rt_is_alnum(block_struct.Name[0])) + trait.fPacket.fPacketLba = kEPMBootBlockLba; + trait.fPacket.fPacketSize = sizeof(GPT_PARTITION_TABLE); + trait.fPacket.fPacketContent = &gpt_struct; + + rt_copy_memory((VoidPtr) "fs/detect-packet", trait.fPacket.fPacketMime, + rt_string_len("fs/detect-packet")); + + trait.fInput(trait.fPacket); + + if (rt_string_cmp(gpt_struct.Signature, kMagicGPT, kMagicLenGPT) == 0) { - kout << "Disk partition is empty (Read Only)\r"; + trait.fPacket.fPacketReadOnly = NO; + trait.fKind = kMassStorageDrive | kGPTDrive; + + kout << "Disk is GPT formatted.\r"; + + trait.fSectorSz = gpt_struct.SizeOfEntries; + trait.fLbaEnd = gpt_struct.LastGPTEntry; + trait.fLbaStart = gpt_struct.FirstGPTEntry; } else { - (void)(kout << "Scheme Found: " << block_struct.Name << kendl); + kout << "Disk is unformatted.\r"; + + trait.fPacket.fPacketReadOnly = YES; + trait.fKind = kMassStorageDrive | kUnformattedDrive | kReadOnlyDrive; } } @@ -212,7 +230,7 @@ namespace Kernel { DriveTrait trait; - constexpr auto kMainDrive = "/media/sda/"; + constexpr auto kMainDrive = "/media/main/"; rt_copy_memory((VoidPtr)kMainDrive, trait.fName, rt_string_len(kMainDrive)); |
