summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-04-19 08:36:30 +0200
committerAmlal El Mahrouss <amlal@nekernel.org>2025-04-19 08:36:30 +0200
commit1740a0dff822d7666b8c1f056b6c411ef6b0f9fd (patch)
tree646ae3f61ebcd3f83c888912c5f72efc0a8c25b0 /dev/kernel
parent1dfc636e87c289d4091a9008a0beae0ff3d4e926 (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.h1
-rw-r--r--dev/kernel/FirmwareKit/GPT.h8
-rw-r--r--dev/kernel/src/DriveMgr.cc36
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));