summaryrefslogtreecommitdiffhomepage
path: root/tooling
diff options
context:
space:
mode:
authorAmlal <amlal@nekernel.org>2025-04-28 09:06:35 +0200
committerAmlal <amlal@nekernel.org>2025-04-28 09:06:35 +0200
commit2ead335ccc7afd8e1b2a6533e966c10f49fbdfe9 (patch)
treeca447cda4307a2e51990d901be29a72829b2ea4c /tooling
parent8a7396493c3effb356d2dc4484b993b4698bc422 (diff)
dev, kernel: HeFS, Tooling: reworked the mkfs.hefs tool for the new filesystem.
other/related: - Add new KPC codes. - Final refactors for HeFS's Format method. - Dma pool improvements. - Better standard disk I/O names. - Add mm_memory_fence function inside HalPagingMgrAMD64.cc Signed-off-by: Amlal <amlal@nekernel.org>
Diffstat (limited to 'tooling')
-rw-r--r--tooling/hefs.h67
-rw-r--r--tooling/mkfs.hefs.cc24
2 files changed, 41 insertions, 50 deletions
diff --git a/tooling/hefs.h b/tooling/hefs.h
index d0ad823b..2a04a1c3 100644
--- a/tooling/hefs.h
+++ b/tooling/hefs.h
@@ -1,6 +1,6 @@
/* -------------------------------------------
- Copyright (C) 2025, Amlal El Mahrouss, all rights reserved.
+ Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved.
------------------------------------------- */
@@ -16,17 +16,11 @@
#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 kHeFSDefaultVoluneName u8"HeFS Volume"
namespace mkfs::hefs {
+
+// Drive kinds
enum {
kHeFSHardDrive = 0xC0, // Hard Drive
kHeFSSolidStateDrive = 0xC1, // Solid State Drive
@@ -38,6 +32,7 @@ enum {
kHeFSDriveCount = 7,
};
+// Disk status
enum {
kHeFSStatusUnlocked = 0x18,
kHeFSStatusLocked,
@@ -46,6 +41,7 @@ enum {
kHeFSStatusCount,
};
+// Encodings
enum {
kHeFSEncodingUTF8 = 0x00,
kHeFSEncodingUTF16,
@@ -60,18 +56,13 @@ enum {
kHeFSEncodingCount,
};
-// Constants
+// Block constants
constexpr std::size_t kHeFSBlockCount = 16;
-// Types
+// Time type
using ATime = std::uint64_t;
-enum {
- kHeFSRed = 100,
- kHeFSBlack,
- kHeFSColorCount,
-};
-
+// File kinds
inline constexpr uint16_t kHeFSFileKindRegular = 0x00;
inline constexpr uint16_t kHeFSFileKindDirectory = 0x01;
inline constexpr uint16_t kHeFSFileKindBlock = 0x02;
@@ -82,14 +73,22 @@ inline constexpr uint16_t kHeFSFileKindSymbolicLink = 0x06;
inline constexpr uint16_t kHeFSFileKindUnknown = 0x07;
inline constexpr uint16_t kHeFSFileKindCount = 0x08;
-// Basic Time Constants
+// Red-black tree colors
+enum {
+ kHeFSInvalidColor = 0,
+ kHeFSRed = 100,
+ kHeFSBlack,
+ kHeFSColorCount,
+};
+
+// Time constants
inline constexpr ATime kHeFSTimeInvalid = 0x0000000000000000;
inline constexpr ATime kHeFSTimeMax = 0xFFFFFFFFFFFFFFFF - 1;
-// Boot Node (Superblock Equivalent)
+// Boot Node
struct alignas(8) BootNode {
char magic[kHeFSMagicLen]{};
- char16_t volumeName[kHeFSPartNameLen]{};
+ char8_t volumeName[kHeFSPartNameLen]{};
std::uint32_t version{};
std::uint64_t badSectors{};
std::uint64_t sectorCount{};
@@ -108,19 +107,16 @@ struct alignas(8) BootNode {
std::uint64_t reserved2{};
std::uint64_t reserved3{};
std::uint64_t reserved4{};
+ char pad[272]{};
};
-// File Node (Index Node)
+// Index Node
struct alignas(8) IndexNode {
- char16_t name[kHeFSFileNameLen]{};
+ char8_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{};
@@ -129,23 +125,18 @@ struct alignas(8) IndexNode {
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]{};
+ std::uint64_t block[kHeFSBlockCount]{};
+ char pad[62]{};
};
-// Directory Node (Red-Black Tree Node)
+// Index Node Directory (Red-Black Tree Node)
struct alignas(8) IndexNodeDirectory {
- char16_t name[kHeFSFileNameLen]{};
+ char8_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{};
@@ -153,13 +144,13 @@ struct alignas(8) IndexNodeDirectory {
std::uint32_t uid{};
std::uint32_t gid{};
std::uint32_t mode{};
- std::uint64_t indexNodeStart[kHeFSBlockCount]{};
- std::uint64_t indexNodeEnd[kHeFSBlockCount]{};
+ std::uint64_t indexNode[kHeFSBlockCount]{};
std::uint8_t color{};
std::uint64_t next{};
std::uint64_t prev{};
std::uint64_t child{};
std::uint64_t parent{};
+ char pad[32]{};
};
} // namespace mkfs::hefs
diff --git a/tooling/mkfs.hefs.cc b/tooling/mkfs.hefs.cc
index 542ae175..3147a6e6 100644
--- a/tooling/mkfs.hefs.cc
+++ b/tooling/mkfs.hefs.cc
@@ -28,10 +28,10 @@ static std::basic_string<CharType> get_option(const std::basic_string<CharType>&
}
} // namespace mkfs::detail
-static size_t kDiskSize = 1024 * 1024 * 1024 * 4UL;
-static uint16_t kVersion = kHeFSVersion;
-static std::u16string kLabel = kHeFSDefaultVoluneName;
-static size_t kSectorSize = 512;
+static size_t kDiskSize = 1024 * 1024 * 1024 * 4UL;
+static uint16_t kVersion = kHeFSVersion;
+static std::u8string kLabel = kHeFSDefaultVoluneName;
+static size_t kSectorSize = 512;
int main(int argc, char** argv) {
if (argc < 2) {
@@ -42,8 +42,8 @@ int main(int argc, char** argv) {
return EXIT_FAILURE;
}
- std::string args;
- std::u16string args_wide;
+ std::string args;
+ std::u8string args_wide;
for (int i = 1; i < argc; ++i) {
args += argv[i];
@@ -55,13 +55,13 @@ int main(int argc, char** argv) {
args_wide.push_back(ch);
}
- args_wide += u" ";
+ args_wide += u8" ";
}
auto output_device = mkfs::detail::get_option<char>(args, "-o");
kSectorSize = std::strtol(mkfs::detail::get_option<char>(args, "-s").data(), nullptr, 10);
- kLabel = mkfs::detail::get_option<char16_t>(args_wide, u"-L");
+ kLabel = mkfs::detail::get_option<char8_t>(args_wide, u8"-L");
if (kLabel.empty()) kLabel = kHeFSDefaultVoluneName;
@@ -91,14 +91,14 @@ int main(int argc, char** argv) {
bootNode.version = kVersion;
bootNode.diskKind = mkfs::hefs::kHeFSHardDrive;
- bootNode.encoding = mkfs::hefs::kHeFSEncodingUTF16;
+ bootNode.encoding = mkfs::hefs::kHeFSEncodingUTF8;
bootNode.diskSize = kDiskSize;
bootNode.sectorSize = kSectorSize;
bootNode.startIND = start_ind;
bootNode.endIND = end_ind;
bootNode.diskStatus = mkfs::hefs::kHeFSStatusUnlocked;
- std::memcpy(bootNode.magic, kHeFSMagic, kHeFSMagicLen);
+ std::memcpy(bootNode.magic, kHeFSMagic, kHeFSMagicLen - 1);
std::memcpy(bootNode.volumeName, kLabel.data(), kLabel.size() * sizeof(char16_t));
filesystem.seekp(std::strtol(mkfs::detail::get_option<char>(args, "-p").data(), nullptr, 10));
@@ -121,9 +121,9 @@ int main(int argc, char** argv) {
for (size_t i = 0; i < cnt; ++i) {
mkfs::hefs::IndexNodeDirectory indexNode{};
- std::memcpy(indexNode.name, u"/", std::u16string(u"/").size() * sizeof(char16_t));
+ std::memcpy(indexNode.name, u8"/", std::u8string(u8"/").size() * sizeof(char16_t));
- indexNode.flags = mkfs::hefs::kHeFSEncodingUTF16;
+ indexNode.flags = mkfs::hefs::kHeFSEncodingUTF8;
indexNode.kind = mkfs::hefs::kHeFSFileKindDirectory;
indexNode.deleted = mkfs::hefs::kHeFSTimeMax;