summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel
diff options
context:
space:
mode:
authorAmlal <amlal@nekernel.org>2025-05-01 08:30:58 +0200
committerAmlal <amlal@nekernel.org>2025-05-01 08:30:58 +0200
commit72fa8a81498a53491950f92d9e96fbe6dd65cc04 (patch)
tree5d3e67a39d0864892a058634b7073797df615dff /dev/kernel
parentfcea594f2df75dcd0f3d4bfeac988b748be89c13 (diff)
dev, kernel: HeFS spec and tooling, and PEF spec updates.
Signed-off-by: Amlal <amlal@nekernel.org>
Diffstat (limited to 'dev/kernel')
-rw-r--r--dev/kernel/FSKit/HeFS.h6
-rw-r--r--dev/kernel/KernelKit/PEF.h8
-rw-r--r--dev/kernel/src/FS/HeFS.cc8
3 files changed, 12 insertions, 10 deletions
diff --git a/dev/kernel/FSKit/HeFS.h b/dev/kernel/FSKit/HeFS.h
index 80ef6646..da5da3c1 100644
--- a/dev/kernel/FSKit/HeFS.h
+++ b/dev/kernel/FSKit/HeFS.h
@@ -83,7 +83,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 = 0x10;
+inline constexpr UInt16 kHeFSSliceCount = 0x10;
inline constexpr UInt16 kHeFSInvalidVID = 0xFFFF;
@@ -146,7 +146,7 @@ struct PACKED HEFS_INDEX_NODE final {
Kernel::UInt32 fUID, fGID; /// @brief User ID and Group ID of the file.
Kernel::UInt32 fMode; /// @brief File mode. (read, write, execute, etc).
- Kernel::UInt64 fBlock[kHeFSBlockCount]; /// @brief block slice.
+ Kernel::UInt64 fBlock[kHeFSSliceCount]; /// @brief block slice.
Kernel::Char fPad[69];
};
@@ -180,7 +180,7 @@ struct PACKED HEFS_INDEX_NODE_DIRECTORY final {
/// [0] = OFFSET
/// [1] = SIZE
/// @note Thus the += 2 when iterating over them.
- Kernel::UInt64 fIndexNode[kHeFSBlockCount]; /// @brief Start of the index node.
+ Kernel::UInt64 fIndexNode[kHeFSSliceCount]; /// @brief Start of the index node.
Kernel::UInt8 fColor; /// @brief Color of the node. (Red or Black).
Kernel::Lba fNext, fPrev, fChild, fParent; /// @brief Red-black tree pointers.
diff --git a/dev/kernel/KernelKit/PEF.h b/dev/kernel/KernelKit/PEF.h
index 4c6ee5ae..03398b48 100644
--- a/dev/kernel/KernelKit/PEF.h
+++ b/dev/kernel/KernelKit/PEF.h
@@ -23,7 +23,7 @@
#define kPefMagicLen (5)
-#define kPefVersion (3)
+#define kPefVersion (4)
#define kPefNameLen (256U)
/* not mandatory, only for non fork based filesystems. */
@@ -59,7 +59,7 @@ enum {
};
enum {
- kPefSubArchAMD,
+ kPefSubArchAMD = 200,
kPefSubArchIntel,
kPefSubArchARM,
kPefSubArchGeneric,
@@ -67,7 +67,7 @@ enum {
};
enum {
- kPefKindExec = 1, /* .o */
+ kPefKindExec = 1, /* .exec */
kPefKindDylib = 2, /* .dylib */
kPefKindObject = 4, /* .obj */
kPefKindDebug = 5, /* .dbg */
@@ -86,6 +86,7 @@ typedef struct PEFContainer final {
UIntPtr Start;
SizeT HdrSz; /* Size of header */
SizeT Count; /* container header count */
+ UInt32 Checksum;
} PACKED PEFContainer;
/* First PEFCommandHeader starts after PEFContainer */
@@ -97,6 +98,7 @@ typedef struct PEFCommandHeader final {
UInt32 Flags; /* container flags */
UInt16 Kind; /* container kind */
UIntPtr Offset; /* content offset */
+ UIntPtr VMAddress; /* VM offset */
SizeT Size; /* content Size */
} PACKED PEFCommandHeader;
diff --git a/dev/kernel/src/FS/HeFS.cc b/dev/kernel/src/FS/HeFS.cc
index 605df480..2f5bb55d 100644
--- a/dev/kernel/src/FS/HeFS.cc
+++ b/dev/kernel/src/FS/HeFS.cc
@@ -204,7 +204,7 @@ namespace Detail {
if (dir->fKind == kHeFSFileKindDirectory) {
if (KStringBuilder::Equals(dir_name, dir->fName) ||
KStringBuilder::Equals(dir_name, kHeFSSearchAllStr)) {
- for (SizeT inode_index = 0UL; inode_index < kHeFSBlockCount; inode_index += 2) {
+ for (SizeT inode_index = 0UL; inode_index < kHeFSSliceCount; inode_index += 2) {
mnt->fPacket.fPacketLba = dir->fIndexNode[inode_index];
mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE);
mnt->fPacket.fPacketContent = node;
@@ -329,7 +329,7 @@ namespace Detail {
if (child > root->fEndIND) dirent->fChild = root->fEndIND;
}
- for (SizeT index = 0UL; index < (kHeFSBlockCount * 2); index += 2) {
+ for (SizeT index = 0UL; index < (kHeFSSliceCount * 2); index += 2) {
dirent->fIndexNode[index] = root->fStartIN;
dirent->fIndexNode[index + 1] = 0UL;
}
@@ -459,7 +459,7 @@ namespace Detail {
dir->fChecksum)
ke_panic(RUNTIME_CHECK_FILESYSTEM, "CRC32 failure on HeFS IND!");
- for (SizeT inode_index = 0UL; inode_index < (kHeFSBlockCount * 2); inode_index += 2) {
+ for (SizeT inode_index = 0UL; inode_index < (kHeFSSliceCount * 2); inode_index += 2) {
if (dir->fIndexNode[inode_index] != 0) {
mnt->fPacket.fPacketLba = dir->fIndexNode[inode_index];
mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE);
@@ -527,7 +527,7 @@ namespace Detail {
mnt->fInput(mnt->fPacket);
if (KStringBuilder::Equals(dir->fName, parent_dir_name)) {
- for (SizeT inode_index = 0UL; inode_index < (kHeFSBlockCount * 2); inode_index += 2) {
+ for (SizeT inode_index = 0UL; inode_index < (kHeFSSliceCount * 2); inode_index += 2) {
if (dir->fIndexNode[inode_index] != 0) {
auto lba = dir->fIndexNode[inode_index];