diff options
| author | Amlal <amlal@nekernel.org> | 2025-04-26 16:56:37 +0200 |
|---|---|---|
| committer | Amlal <amlal@nekernel.org> | 2025-04-26 17:15:56 +0200 |
| commit | 360c69daf7a83ec31c384390d9ec37064b78b40e (patch) | |
| tree | bf78f6267b032815f992f02768251186dbeda7d5 /tooling/hefs.h | |
| parent | 9c33e844d76f9db6d7110de4f05cbe2084cdbca1 (diff) | |
dev, kernel, tooling: add HeFS tooling and early allocation stategy.
why?
- we need to format it externally too.
- a in-kernel format doesn't handle every case.
- and i have to fix the createdir, createfile methods for correct inode dir linking.
Signed-off-by: Amlal <amlal@nekernel.org>
Diffstat (limited to 'tooling/hefs.h')
| -rw-r--r-- | tooling/hefs.h | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/tooling/hefs.h b/tooling/hefs.h new file mode 100644 index 00000000..a85cb2bc --- /dev/null +++ b/tooling/hefs.h @@ -0,0 +1,161 @@ +/* ------------------------------------------- + + Copyright (C) 2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include <cstdint> +#include <cstring> + +#define kHeFSVersion (0x0101) +#define kHeFSMagic " HeFS" +#define kHeFSMagicLen (8) + +#define kHeFSFileNameLen (256U) +#define kHeFSPartNameLen (128U) + +#define kHeFSMinimumDiskSize (gib_cast(4)) + +#define kHeFSDefaultVoluneName u"HeFS Volume" + +#define kHeFSDIMBootDir u"boot-x/dir" +#define kHeFSMIMEBootFile u"boot-x/file" + +#define kHeFSDIMSystemDir u"system-x/dir" +#define kHeFSMIMESystemFile u"system-x/file" + +#define kHeFSSearchAllStr u"*" + +namespace mkfs::hefs { +enum { + kHeFSHardDrive = 0xC0, // Hard Drive + kHeFSSolidStateDrive = 0xC1, // Solid State Drive + kHeFSOpticalDrive = 0x0C, // Blu-Ray/DVD + kHeFSMassStorageDevice = 0xCC, // USB + kHeFSScsiDrive = 0xC4, // SCSI Hard Drive + kHeFSFlashDrive = 0xC6, + kHeFSUnknown = 0xFF, // Unknown device. + kHeFSDriveCount = 7, +}; + +enum { + kHeFSStatusUnlocked = 0x18, + kHeFSStatusLocked, + kHeFSStatusError, + kHeFSStatusInvalid, + kHeFSStatusCount, +}; + +enum { + kHeFSEncodingUTF8 = 0x00, + kHeFSEncodingUTF16, + kHeFSEncodingUTF32, + kHeFSEncodingUTF16BE, + kHeFSEncodingUTF16LE, + kHeFSEncodingUTF32BE, + kHeFSEncodingUTF32LE, + kHeFSEncodingUTF8BE, + kHeFSEncodingUTF8LE, + kHeFSEncodingBinary, + kHeFSEncodingCount, +}; + +// Constants +constexpr std::size_t kHeFSBlockCount = 16; + +// Types +using ATime = std::uint64_t; + +inline constexpr uint16_t kHeFSFileKindRegular = 0x00; +inline constexpr uint16_t kHeFSFileKindDirectory = 0x01; +inline constexpr uint16_t kHeFSFileKindBlock = 0x02; +inline constexpr uint16_t kHeFSFileKindCharacter = 0x03; +inline constexpr uint16_t kHeFSFileKindFIFO = 0x04; +inline constexpr uint16_t kHeFSFileKindSocket = 0x05; +inline constexpr uint16_t kHeFSFileKindSymbolicLink = 0x06; +inline constexpr uint16_t kHeFSFileKindUnknown = 0x07; +inline constexpr uint16_t kHeFSFileKindCount = 0x08; + +// Basic Time Constants +inline constexpr ATime kHeFSTimeInvalid = 0x0000000000000000; +inline constexpr ATime kHeFSTimeMax = 0xFFFFFFFFFFFFFFFF - 1; + +// Boot Node (Superblock Equivalent) +struct alignas(8) BootNode { + char magic[kHeFSMagicLen]{}; + char16_t volumeName[kHeFSPartNameLen]{}; + std::uint32_t version{}; + std::uint64_t badSectors{}; + std::uint64_t sectorCount{}; + std::uint64_t sectorSize{}; + std::uint32_t checksum{}; + std::uint8_t diskKind{}; + std::uint8_t encoding{}; + std::uint64_t startIND{}; + std::uint64_t endIND{}; + std::uint64_t indCount{}; + std::uint64_t diskSize{}; + std::uint16_t diskStatus{}; + std::uint16_t diskFlags{}; + std::uint16_t vid{}; + std::uint64_t reserved{}; + std::uint64_t reserved2{}; + std::uint64_t reserved3{}; + std::uint64_t reserved4{}; +}; + +// File Node (Index Node) +struct alignas(8) IndexNode { + char16_t name[kHeFSFileNameLen]{}; + std::uint32_t flags{}; + std::uint16_t kind{}; + std::uint32_t size{}; + std::uint32_t checksum{}; + std::uint32_t recoverChecksum{}; + std::uint32_t blockChecksum{}; + std::uint32_t linkChecksum{}; + char16_t mime[kHeFSFileNameLen]{}; + bool symbolicLink{false}; + ATime created{}; + ATime accessed{}; + ATime modified{}; + ATime deleted{}; + std::uint32_t uid{}; + std::uint32_t gid{}; + std::uint32_t mode{}; + std::uint64_t blockLinkStart[kHeFSBlockCount]{}; + std::uint64_t blockLinkEnd[kHeFSBlockCount]{}; + std::uint64_t blockStart[kHeFSBlockCount]{}; + std::uint64_t blockEnd[kHeFSBlockCount]{}; + std::uint64_t blockRecoveryStart[kHeFSBlockCount]{}; + std::uint64_t blockRecoveryEnd[kHeFSBlockCount]{}; +}; + +// Directory Node (Red-Black Tree Node) +struct alignas(8) IndexNodeDirectory { + char16_t name[kHeFSFileNameLen]{}; + std::uint32_t flags{}; + std::uint16_t kind{}; + std::uint32_t entryCount{}; + std::uint32_t checksum{}; + std::uint32_t indexNodeChecksum{}; + char16_t dim[kHeFSFileNameLen]{}; + ATime created{}; + ATime accessed{}; + ATime modified{}; + ATime deleted{}; + std::uint32_t uid{}; + std::uint32_t gid{}; + std::uint32_t mode{}; + std::uint64_t indexNodeStart[kHeFSBlockCount]{}; + std::uint64_t indexNodeEnd[kHeFSBlockCount]{}; + std::uint8_t color{}; + std::uint64_t next{}; + std::uint64_t prev{}; + std::uint64_t child{}; + std::uint64_t parent{}; +}; + +} // namespace mkfs::hefs |
