From 95f1448a371f563071a755b9ed507cd64d70ed5b Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 18 Apr 2025 09:18:55 +0200 Subject: kernel, boot: improvements and tweaks on the kernel's filesystems. - HeFS requires a 4gb disk at minimum now. - make_app fully supports STEPS. - Errata of NeFS.tex, add HeFS.tex. - Better boot flow. - New filesystems for FileMgr. Signed-off-by: Amlal El Mahrouss --- dev/kernel/FSKit/HeFS.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'dev/kernel/FSKit/HeFS.h') diff --git a/dev/kernel/FSKit/HeFS.h b/dev/kernel/FSKit/HeFS.h index cf1bebfc..92f396e9 100644 --- a/dev/kernel/FSKit/HeFS.h +++ b/dev/kernel/FSKit/HeFS.h @@ -6,7 +6,11 @@ #pragma once +#include +#include +#include #include +#include /// @file HeFS.h /// @brief HeFS filesystem support. @@ -18,9 +22,10 @@ #define kHeFSFileNameLen (256U) #define kHeFSPartNameLen (256U) -#define kHeFSMinimumDiskSize (mib_cast(256)) +#define kHeFSMinimumDiskSize (gib_cast(4)) struct HeFS_BOOT_NODE; +struct HeFS_INDEX_NODE; enum { -- cgit v1.2.3 From ad5df912a008f7df88b263e32da80d4b245c1003 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 18 Apr 2025 10:03:40 +0200 Subject: HeFS.h: Worked on CoreHeFS. Signed-off-by: Amlal El Mahrouss --- dev/kernel/FSKit/HeFS.h | 107 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 91 insertions(+), 16 deletions(-) (limited to 'dev/kernel/FSKit/HeFS.h') diff --git a/dev/kernel/FSKit/HeFS.h b/dev/kernel/FSKit/HeFS.h index 92f396e9..52f01111 100644 --- a/dev/kernel/FSKit/HeFS.h +++ b/dev/kernel/FSKit/HeFS.h @@ -20,12 +20,13 @@ #define kHeFSMagicLen (8) #define kHeFSFileNameLen (256U) -#define kHeFSPartNameLen (256U) +#define kHeFSPartNameLen (128U) #define kHeFSMinimumDiskSize (gib_cast(4)) struct HeFS_BOOT_NODE; struct HeFS_INDEX_NODE; +struct HeFS_INDEX_NODE_DIRECTORY; enum { @@ -48,28 +49,102 @@ enum kHeFSStatusCount, }; +enum +{ + kHeFSEncodingUTF8 = 0x00, + kHeFSEncodingUTF16, + kHeFSEncodingUTF32, + kHeFSEncodingUTF16BE, + kHeFSEncodingUTF16LE, + kHeFSEncodingUTF32BE, + kHeFSEncodingUTF32LE, + kHeFSEncodingUTF8BE, + kHeFSEncodingUTF8LE, + kHeFSEncodingCount, +}; + +inline constexpr UInt16 kHeFSFileKindRegular = 0x00; +inline constexpr UInt16 kHeFSFileKindDirectory = 0x01; +inline constexpr UInt16 kHeFSFileKindBlock = 0x02; +inline constexpr UInt16 kHeFSFileKindCharacter = 0x03; +inline constexpr UInt16 kHeFSFileKindFIFO = 0x04; +inline constexpr UInt16 kHeFSFileKindSocket = 0x05; +inline constexpr UInt16 kHeFSFileKindSymbolicLink = 0x06; +inline constexpr UInt16 kHeFSFileKindUnknown = 0x07; +inline constexpr UInt16 kHeFSFileKindCount = 0x08; + +/// @brief HeFS blocks are array containing sparse blocks of data. +/// @details The blocks are used to store the data of a file. Each block is a pointer to a block of data on the disk. +inline constexpr UInt16 fHeFSBlockCount = 0x06; + struct PACKED HeFS_BOOT_NODE final { - Kernel::Char fMagic[kHeFSMagicLen]; - Kernel::Char fPartName[kHeFSPartNameLen]; - Kernel::UInt32 fVersion; - Kernel::UInt64 fBadSectors; - Kernel::UInt64 fSectorCount; - Kernel::UInt64 fSectorSize; - Kernel::UInt32 fChecksum; - Kernel::UInt8 fDriveKind; - Kernel::UInt8 fTextEncoding; - Kernel::UInt64 fRootINode; - Kernel::UInt64 fRecoveryINode; + Kernel::Char fMagic[kHeFSMagicLen]; + Kernel::Utf16Char fVolName[kHeFSPartNameLen]; + Kernel::UInt32 fVersion; + Kernel::UInt64 fBadSectors; + Kernel::UInt64 fSectorCount; + Kernel::UInt64 fSectorSize; + Kernel::UInt32 fChecksum; + Kernel::UInt8 fDriveKind; + Kernel::UInt8 fEncoding; + Kernel::UInt64 fStartIND; + Kernel::UInt64 fEndIND; + Kernel::UInt64 fINodeCount; + Kernel::UInt64 fDiskSize; + Kernel::UInt16 fDiskStatus; + Kernel::UInt16 fDiskFlags; + Kernel::UInt16 fVID; // virtual identification number within an EPM disk. +}; + +/// @brief Access time type. +/// @details Used to keep track of the INode, INodeDir allocation status. +typedef Kernel::UInt64 ATime; + +inline constexpr ATime kHeFSTimeInvalid = 0x0000000000000000; +inline constexpr ATime kHeFSTimeMax = 0xFFFFFFFFFFFFFFFF; + +struct PACKED HeFS_INDEX_NODE final +{ + Kernel::Utf16Char fName[kHeFSFileNameLen]; + Kernel::UInt32 fFlags; + Kernel::UInt16 fKind; + Kernel::UInt32 fSize; + Kernel::UInt32 fChecksum; + + ATime fCreated, fAccessed, fModified, fDeleted; + Kernel::UInt32 fUID, fGID; + Kernel::UInt32 fMode; + + Kernel::UInt64 fBlockLinkStart[fHeFSBlockCount]; + Kernel::UInt64 fBlockLinkEnd[fHeFSBlockCount]; + + Kernel::UInt64 fBlockStart[fHeFSBlockCount]; + Kernel::UInt64 fBlockEnd[fHeFSBlockCount]; + + Kernel::UInt64 fBlockRecoveryStart[fHeFSBlockCount]; + Kernel::UInt64 fBlockRecoveryEnd[fHeFSBlockCount]; + + /// @brief Red-black tree pointers. + Kernel::Lba fNext, fPrev, fChild, fParent; }; -struct PACKED HeFS_INDEX_NODE +struct PACKED HeFS_INDEX_NODE_DIRECTORY final { - Kernel::Char fName[kHeFSFileNameLen]; + Kernel::Utf16Char fName[kHeFSFileNameLen]; + Kernel::UInt32 fFlags; Kernel::UInt16 fKind; Kernel::UInt32 fSize; - Kernel::Lba fFirstINode; - Kernel::Lba fLastINode; Kernel::UInt32 fChecksum; + + ATime fCreated, fAccessed, fModified, fDeleted; + Kernel::UInt32 fUID, fGID; + Kernel::UInt32 fMode; + + Kernel::UInt64 fIndexNodeStart[fHeFSBlockCount]; + Kernel::UInt64 fIndexNodeEnd[fHeFSBlockCount]; + + /// @brief Red-black tree pointers. + Kernel::Lba fNext, fPrev, fChild, fParent; }; \ No newline at end of file -- cgit v1.2.3 From 19c375e849dc407a49d16dd93b23029102bdee89 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 18 Apr 2025 10:06:36 +0200 Subject: CoreHeFS: Checksum for blocks, integration with Crc32 and User APIs details: - A checksum shall be made available for checking data integrity. - User API shall be used to keep track of user permissions. Signed-off-by: Amlal El Mahrouss --- dev/kernel/FSKit/HeFS.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'dev/kernel/FSKit/HeFS.h') diff --git a/dev/kernel/FSKit/HeFS.h b/dev/kernel/FSKit/HeFS.h index 52f01111..d67b2f82 100644 --- a/dev/kernel/FSKit/HeFS.h +++ b/dev/kernel/FSKit/HeFS.h @@ -11,6 +11,8 @@ #include #include #include +#include +#include /// @file HeFS.h /// @brief HeFS filesystem support. @@ -110,7 +112,7 @@ struct PACKED HeFS_INDEX_NODE final Kernel::UInt32 fFlags; Kernel::UInt16 fKind; Kernel::UInt32 fSize; - Kernel::UInt32 fChecksum; + Kernel::UInt32 fChecksum, fRecoverChecksum, fBlockChecksum, fLinkChecksum; ATime fCreated, fAccessed, fModified, fDeleted; Kernel::UInt32 fUID, fGID; @@ -136,7 +138,7 @@ struct PACKED HeFS_INDEX_NODE_DIRECTORY final Kernel::UInt32 fFlags; Kernel::UInt16 fKind; Kernel::UInt32 fSize; - Kernel::UInt32 fChecksum; + Kernel::UInt32 fChecksum, fIndexNodeChecksum; ATime fCreated, fAccessed, fModified, fDeleted; Kernel::UInt32 fUID, fGID; -- cgit v1.2.3 From b18a1dac7d4bfb2fa335fc4c7f49d14e9a25bc06 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 18 Apr 2025 12:28:44 +0200 Subject: FSKit, HeFS: Fix name regarding hungarian convention Signed-off-by: Amlal El Mahrouss --- dev/kernel/FSKit/HeFS.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'dev/kernel/FSKit/HeFS.h') diff --git a/dev/kernel/FSKit/HeFS.h b/dev/kernel/FSKit/HeFS.h index d67b2f82..6e529ce4 100644 --- a/dev/kernel/FSKit/HeFS.h +++ b/dev/kernel/FSKit/HeFS.h @@ -77,7 +77,7 @@ inline constexpr UInt16 kHeFSFileKindCount = 0x08; /// @brief HeFS blocks are array containing sparse blocks of data. /// @details The blocks are used to store the data of a file. Each block is a pointer to a block of data on the disk. -inline constexpr UInt16 fHeFSBlockCount = 0x06; +inline constexpr UInt16 kHeFSBlockCount = 0x06; struct PACKED HeFS_BOOT_NODE final { @@ -118,14 +118,14 @@ struct PACKED HeFS_INDEX_NODE final Kernel::UInt32 fUID, fGID; Kernel::UInt32 fMode; - Kernel::UInt64 fBlockLinkStart[fHeFSBlockCount]; - Kernel::UInt64 fBlockLinkEnd[fHeFSBlockCount]; + Kernel::UInt64 fBlockLinkStart[kHeFSBlockCount]; + Kernel::UInt64 fBlockLinkEnd[kHeFSBlockCount]; - Kernel::UInt64 fBlockStart[fHeFSBlockCount]; - Kernel::UInt64 fBlockEnd[fHeFSBlockCount]; + Kernel::UInt64 fBlockStart[kHeFSBlockCount]; + Kernel::UInt64 fBlockEnd[kHeFSBlockCount]; - Kernel::UInt64 fBlockRecoveryStart[fHeFSBlockCount]; - Kernel::UInt64 fBlockRecoveryEnd[fHeFSBlockCount]; + Kernel::UInt64 fBlockRecoveryStart[kHeFSBlockCount]; + Kernel::UInt64 fBlockRecoveryEnd[kHeFSBlockCount]; /// @brief Red-black tree pointers. Kernel::Lba fNext, fPrev, fChild, fParent; @@ -144,8 +144,8 @@ struct PACKED HeFS_INDEX_NODE_DIRECTORY final Kernel::UInt32 fUID, fGID; Kernel::UInt32 fMode; - Kernel::UInt64 fIndexNodeStart[fHeFSBlockCount]; - Kernel::UInt64 fIndexNodeEnd[fHeFSBlockCount]; + Kernel::UInt64 fIndexNodeStart[kHeFSBlockCount]; + Kernel::UInt64 fIndexNodeEnd[kHeFSBlockCount]; /// @brief Red-black tree pointers. Kernel::Lba fNext, fPrev, fChild, fParent; -- cgit v1.2.3 From 0a595d68cd69c365da98c58babf2217bd501615d Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 18 Apr 2025 12:35:28 +0200 Subject: kernel, HeFS (IMP): time algorithm. Signed-off-by: Amlal El Mahrouss --- dev/kernel/FSKit/HeFS.h | 71 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 66 insertions(+), 5 deletions(-) (limited to 'dev/kernel/FSKit/HeFS.h') diff --git a/dev/kernel/FSKit/HeFS.h b/dev/kernel/FSKit/HeFS.h index 6e529ce4..8fdf933e 100644 --- a/dev/kernel/FSKit/HeFS.h +++ b/dev/kernel/FSKit/HeFS.h @@ -77,7 +77,7 @@ inline constexpr UInt16 kHeFSFileKindCount = 0x08; /// @brief HeFS blocks are array containing sparse blocks of data. /// @details The blocks are used to store the data of a file. Each block is a pointer to a block of data on the disk. -inline constexpr UInt16 kHeFSBlockCount = 0x06; +inline constexpr UInt16 kHeFSBlockCount = 0x10; struct PACKED HeFS_BOOT_NODE final { @@ -103,9 +103,13 @@ struct PACKED HeFS_BOOT_NODE final /// @details Used to keep track of the INode, INodeDir allocation status. typedef Kernel::UInt64 ATime; -inline constexpr ATime kHeFSTimeInvalid = 0x0000000000000000; -inline constexpr ATime kHeFSTimeMax = 0xFFFFFFFFFFFFFFFF; +inline constexpr ATime kHeFSTimeInvalid = 0x0000000000000000; +inline constexpr ATime kHeFSTimeMax = 0xFFFFFFFFFFFFFFFF; +/// @brief HeFS index node. +/// @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 { Kernel::Utf16Char fName[kHeFSFileNameLen]; @@ -126,11 +130,14 @@ struct PACKED HeFS_INDEX_NODE final Kernel::UInt64 fBlockRecoveryStart[kHeFSBlockCount]; Kernel::UInt64 fBlockRecoveryEnd[kHeFSBlockCount]; - + /// @brief Red-black tree pointers. Kernel::Lba fNext, fPrev, fChild, fParent; }; +/// @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 { Kernel::Utf16Char fName[kHeFSFileNameLen]; @@ -149,4 +156,58 @@ struct PACKED HeFS_INDEX_NODE_DIRECTORY final /// @brief Red-black tree pointers. Kernel::Lba fNext, fPrev, fChild, fParent; -}; \ No newline at end of file +}; + +namespace Kernel::Detail +{ + /// @brief HeFS get year from ATime. + /// @param raw_atime the raw ATime value. + /// @return the year value. + /// @note The year is stored in the upper 32 bits of the ATime value. + inline UInt32 hefs_year_get(ATime raw_atime) noexcept + { + return (raw_atime & 0x00000000FFFFFFFF) >> 32; + } + + /// @brief HeFS get month from ATime. + /// @param raw_atime the raw ATime value. + /// @return the month value. + /// @note The month is stored in the upper 24 bits of the ATime value. + inline UInt32 hefs_month_get(ATime raw_atime) noexcept + { + return (raw_atime & 0x00000000FFFFFFFF) >> 24; + } + + /// @brief HeFS get day from ATime. + /// @param raw_atime the raw ATime value. + /// @return the day value. + /// @note The day is stored in the upper 16 bits of the ATime value. + inline UInt32 hefs_day_get(ATime raw_atime) noexcept + { + return (raw_atime & 0x00000000FFFFFFFF) >> 16; + } + + /// @brief HeFS get hour from ATime. + /// @param raw_atime the raw ATime value. + /// @return the hour value. + /// @note The hour is stored in the upper 8 bits of the ATime value. + inline UInt32 hefs_hour_get(ATime raw_atime) noexcept + { + return (raw_atime & 0x00000000FFFFFFFF) >> 8; + } + + /// @brief HeFS get minute from ATime. + /// @param raw_atime the raw ATime value. + /// @return the minute value. + /// @note The minute is stored in the lower 8 bits of the ATime value. + inline UInt32 hefs_minute_get(ATime raw_atime) noexcept + { + return (raw_atime & 0x00000000FFFFFFFF); + } + + inline constexpr UInt32 kHeFSBaseYear = 1970; + inline constexpr UInt32 kHeFSBaseMonth = 1; + inline constexpr UInt32 kHeFSBaseDay = 1; + inline constexpr UInt32 kHeFSBaseHour = 0; + inline constexpr UInt32 kHeFSBaseMinute = 0; +} // namespace Kernel::Detail \ No newline at end of file -- cgit v1.2.3