summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel
diff options
context:
space:
mode:
authorAmlal <amlal@nekernel.org>2025-04-28 16:47:44 +0200
committerAmlal <amlal@nekernel.org>2025-04-28 16:47:44 +0200
commitdeb83a5a79f9c19842537ceab1a42fc17572ad67 (patch)
treeb8938449aedef304a66860a5aad0896ff842b0b7 /dev/kernel
parent3ba94a1b9e1e17c4495df3d26f371486879a7184 (diff)
dev, kernel: HeFS improvements and tweaks.
Signed-off-by: Amlal <amlal@nekernel.org>
Diffstat (limited to 'dev/kernel')
-rw-r--r--dev/kernel/FSKit/HeFS.h2
-rw-r--r--dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc46
-rw-r--r--dev/kernel/StorageKit/DmaPool.h1
-rw-r--r--dev/kernel/src/FS/HeFS.cc92
4 files changed, 78 insertions, 63 deletions
diff --git a/dev/kernel/FSKit/HeFS.h b/dev/kernel/FSKit/HeFS.h
index 515034fc..a6fab1c5 100644
--- a/dev/kernel/FSKit/HeFS.h
+++ b/dev/kernel/FSKit/HeFS.h
@@ -28,6 +28,8 @@
#define kHeFSDefaultVoluneName u8"HeFS Volume"
+#define kHeFSINDStartLBA (sizeof(HEFS_BOOT_NODE))
+
#define kHeFSSearchAllStr u8"*"
struct HEFS_BOOT_NODE;
diff --git a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc
index 050826e3..c3c49533 100644
--- a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc
+++ b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc
@@ -22,25 +22,26 @@
#include <KernelKit/LockDelegate.h>
#include <KernelKit/PCI/Iterator.h>
#include <KernelKit/ProcessScheduler.h>
+#include <KernelKit/Timer.h>
#include <NewKit/Utils.h>
#include <StorageKit/AHCI.h>
#include <StorageKit/DmaPool.h>
#include <modules/AHCI/AHCI.h>
#include <modules/ATA/ATA.h>
-#define kHBAErrTaskFile (1 << 30)
-#define kHBAPxCmdST (0x0001)
-#define kHBAPxCmdFre (0x0010)
-#define kHBAPxCmdFR (0x4000)
-#define kHBAPxCmdCR (0x8000)
+#define kSATAErrTaskFile (1 << 30)
+#define kSATAPxCmdST (0x0001)
+#define kSATAPxCmdFre (0x0010)
+#define kSATAPxCmdFR (0x4000)
+#define kSATAPxCmdCR (0x8000)
#define kSATALBAMode (1 << 6)
#define kSATASRBsy (0x80)
#define kSATASRDrq (0x08)
-#define kHBABohcBiosOwned (1 << 0)
-#define kHBABohcOSOwned (1 << 1)
+#define kSATABohcBiosOwned (1 << 0)
+#define kSATABohcOSOwned (1 << 1)
#define kSATAPortCnt (0x20)
@@ -53,6 +54,7 @@
using namespace Kernel;
+STATIC HardwareTimer kSATATimer(rtl_milliseconds(5));
STATIC PCI::Device kSATADev;
STATIC HbaMemRef kSATAHba;
STATIC Lba kSATASectorCount = 0UL;
@@ -126,6 +128,8 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz
SizeT size_buffer) noexcept {
NE_UNUSED(sector_sz);
+ lba /= sector_sz;
+
if (!buffer || size_buffer == 0) {
kout << "Invalid buffer for AHCI I/O.\r";
err_global_get() = kErrorDisk;
@@ -153,10 +157,14 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz
VoidPtr ptr = rtl_dma_alloc(size_buffer, 4096);
+ rtl_dma_flush(ptr, size_buffer);
+
if (Write) {
rt_copy_memory(buffer, ptr, size_buffer);
}
+ rtl_dma_flush(ptr, size_buffer);
+
// Build the PRDT
SizeT bytes_remaining = size_buffer;
SizeT prdt_index = 0;
@@ -227,7 +235,7 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz
rtl_dma_flush(ptr, size_buffer);
- if (kSATAHba->Is & kHBAErrTaskFile) {
+ if (kSATAHba->Is & kSATAErrTaskFile) {
kout << "AHCI Task File Error during I/O.\r";
rtl_dma_free(size_buffer);
@@ -264,26 +272,26 @@ SizeT drv_get_size_ahci() {
STATIC BOOL ahci_enable_and_probe() {
if (kSATAHba->Cap == 0x0) return NO;
- kSATAHba->Ports[kSATAIndex].Cmd &= ~kHBAPxCmdFre;
- kSATAHba->Ports[kSATAIndex].Cmd &= ~kHBAPxCmdST;
+ kSATAHba->Ports[kSATAIndex].Cmd &= ~kSATAPxCmdFre;
+ kSATAHba->Ports[kSATAIndex].Cmd &= ~kSATAPxCmdST;
while (YES) {
- if (kSATAHba->Ports[kSATAIndex].Cmd & kHBAPxCmdCR) continue;
+ if (kSATAHba->Ports[kSATAIndex].Cmd & kSATAPxCmdCR) continue;
- if (kSATAHba->Ports[kSATAIndex].Cmd & kHBAPxCmdFR) continue;
+ if (kSATAHba->Ports[kSATAIndex].Cmd & kSATAPxCmdFR) continue;
break;
}
// Now we are ready.
- kSATAHba->Ports[kSATAIndex].Cmd |= kHBAPxCmdFre;
- kSATAHba->Ports[kSATAIndex].Cmd |= kHBAPxCmdST;
+ kSATAHba->Ports[kSATAIndex].Cmd |= kSATAPxCmdFre;
+ kSATAHba->Ports[kSATAIndex].Cmd |= kSATAPxCmdST;
- if (kSATAHba->Bohc & kHBABohcBiosOwned) {
- kSATAHba->Bohc |= kHBABohcOSOwned;
+ if (kSATAHba->Bohc & kSATABohcBiosOwned) {
+ kSATAHba->Bohc |= kSATABohcOSOwned;
- while (kSATAHba->Bohc & kHBABohcBiosOwned) {
+ while (kSATAHba->Bohc & kSATABohcBiosOwned) {
;
}
}
@@ -426,7 +434,7 @@ Bool drv_std_detected_ahci() {
///
////////////////////////////////////////////////////
Void drv_std_write(UInt64 lba, Char* buffer, SizeT sector_sz, SizeT size_buffer) {
- drv_std_input_output_ahci<YES, YES, NO>(lba / sector_sz, reinterpret_cast<UInt8*>(buffer),
+ drv_std_input_output_ahci<YES, YES, NO>(lba, reinterpret_cast<UInt8*>(buffer),
sector_sz, size_buffer);
}
@@ -434,7 +442,7 @@ Void drv_std_write(UInt64 lba, Char* buffer, SizeT sector_sz, SizeT size_buffer)
///
////////////////////////////////////////////////////
Void drv_std_read(UInt64 lba, Char* buffer, SizeT sector_sz, SizeT size_buffer) {
- drv_std_input_output_ahci<NO, YES, NO>(lba / sector_sz, reinterpret_cast<UInt8*>(buffer),
+ drv_std_input_output_ahci<NO, YES, NO>(lba, reinterpret_cast<UInt8*>(buffer),
sector_sz, size_buffer);
}
diff --git a/dev/kernel/StorageKit/DmaPool.h b/dev/kernel/StorageKit/DmaPool.h
index 09851a0c..a5d8c880 100644
--- a/dev/kernel/StorageKit/DmaPool.h
+++ b/dev/kernel/StorageKit/DmaPool.h
@@ -23,7 +23,6 @@
#pragma once
#include <KernelKit/DebugOutput.h>
-#include "NewKit/Defines.h"
#ifdef __NE_AMD64__
#define NE_DMA_POOL_START (0x1000000)
diff --git a/dev/kernel/src/FS/HeFS.cc b/dev/kernel/src/FS/HeFS.cc
index f4776686..4f05214a 100644
--- a/dev/kernel/src/FS/HeFS.cc
+++ b/dev/kernel/src/FS/HeFS.cc
@@ -91,7 +91,7 @@ namespace Detail {
} else if (dir->fPrev != 0) {
start = dir->fPrev;
} else {
- start = 0;
+ start += sizeof(HEFS_INDEX_NODE_DIRECTORY);
}
}
@@ -303,15 +303,16 @@ namespace Detail {
return NO;
}
- if (tmpdir->fDeleted) {
+ if (!tmpdir->fCreated && tmpdir->fDeleted) {
+ mnt->fPacket.fPacketLba = start;
+ mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY);
+ mnt->fPacket.fPacketContent = dir;
+
dir->fChild = tmpdir->fChild;
dir->fParent = tmpdir->fParent;
dir->fNext = tmpdir->fNext;
dir->fPrev = tmpdir->fPrev;
-
- mnt->fPacket.fPacketLba = start;
- mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY);
- mnt->fPacket.fPacketContent = dir;
+ dir->fColor = tmpdir->fColor;
mnt->fOutput(mnt->fPacket);
@@ -320,13 +321,13 @@ namespace Detail {
auto old_start = start;
hefsi_traverse_tree(tmpdir, root, start);
- if (start == 0 || start == old_start) break;
+ if (start > root->fEndIND || start == old_start) break;
}
- return YES;
+ delete tmpdir;
}
- err_global_get() = kErrorFileNotFound;
+ err_global_get() = kErrorDiskIsFull;
return NO;
}
@@ -376,7 +377,7 @@ namespace Detail {
auto old_start = start;
hefsi_traverse_tree(dir, root, start);
- if (start == 0 || start == old_start) break;
+ if (start > root->fEndIND || start == old_start) break;
}
delete dir;
@@ -488,7 +489,7 @@ namespace Detail {
auto old_start = start;
hefsi_traverse_tree(dir, root, start);
- if (start == 0 || start == old_start) break;
+ if (start > root->fEndIND || start == old_start) break;
}
delete dir;
@@ -549,7 +550,7 @@ namespace Detail {
mnt->fInput(mnt->fPacket);
- if (prev_node.fDeleted > 0 && !prev_node.fAccessed) {
+ if (prev_node.fDeleted > 0 && !prev_node.fCreated) {
mnt->fPacket.fPacketLba = lba;
mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE);
mnt->fPacket.fPacketContent = node;
@@ -571,7 +572,7 @@ namespace Detail {
hefsi_traverse_tree(dir, root, start);
- if (start == 0 || start == old_start) break;
+ if (start > root->fEndIND || start == old_start) break;
}
delete dir;
@@ -690,7 +691,7 @@ namespace Detail {
auto old_start = start;
hefsi_traverse_tree(dir, root, start);
- if (start == 0 || start == old_start) break;
+ if (start > root->fEndIND || start == old_start) break;
continue;
} else {
@@ -700,7 +701,7 @@ namespace Detail {
auto old_start = start;
hefsi_traverse_tree(dir, root, start);
- if (start == 0 || start == old_start) break;
+ if (start > root->fEndIND || start == old_start) break;
continue;
}
@@ -728,7 +729,7 @@ namespace Detail {
auto old_start = start;
hefsi_traverse_tree(dir, root, start);
- if (start == 0 || start == old_start) break;
+ if (start > root->fEndIND || start == old_start) break;
}
delete dir;
@@ -820,9 +821,18 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input
root->fSectorSize = drive->fSectorSz;
- Lba start = drive->fLbaStart;
+ Lba start = drive->fLbaStart + kHeFSINDStartLBA;
+
+ if (start > drive->fLbaEnd) {
+ delete root;
+ root = nullptr;
+
+ err_global_get() = kErrorDiskIsCorrupted;
- root->fStartIND = start + sizeof(HEFS_BOOT_NODE);
+ return NO;
+ }
+
+ root->fStartIND = start;
root->fEndIND = drive->fLbaEnd;
root->fINDCount = 0;
@@ -846,13 +856,11 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input
root->fVersion = kHeFSVersion;
- root->fChecksum = 0;
-
root->fVID = kHeFSInvalidVID;
root->fChecksum = ke_calculate_crc32((Char*) root, sizeof(HEFS_BOOT_NODE));
- drive->fPacket.fPacketLba = start;
+ drive->fPacket.fPacketLba = drive->fLbaStart;
drive->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE);
drive->fPacket.fPacketContent = root;
@@ -881,6 +889,7 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input
dir->fFlags = flags;
dir->fKind = kHeFSFileKindDirectory;
+ dir->fCreated = 0;
dir->fDeleted = kHeFSTimeMax; /// TODO: Add current time.
dir->fEntryCount = 0;
@@ -932,26 +941,19 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input
/// @return If it was sucessful, see err_local_get().
_Output Bool HeFileSystemParser::CreateDirectory(_Input DriveTrait* drive, _Input const Int32 flags,
const Utf8Char* dir) {
- NE_UNUSED(drive);
- NE_UNUSED(flags);
- NE_UNUSED(dir);
-
- HEFS_BOOT_NODE* root = new HEFS_BOOT_NODE();
- HEFS_INDEX_NODE* node = new HEFS_INDEX_NODE();
+ HEFS_BOOT_NODE* root = new HEFS_BOOT_NODE();
kout << "CreateDirectory...\r";
- if (!root || !node) {
+ if (!root) {
kout << "Error: Failed to allocate memory for boot node.\r";
- if (node) delete node;
if (root) delete root;
return NO;
}
rt_set_memory(root, 0, sizeof(HEFS_BOOT_NODE));
- rt_set_memory(node, 0, sizeof(HEFS_INDEX_NODE));
rt_copy_memory((VoidPtr) "fs/hefs-packet", drive->fPacket.fPacketMime,
rt_string_len("fs/hefs-packet"));
@@ -962,8 +964,6 @@ _Output Bool HeFileSystemParser::CreateDirectory(_Input DriveTrait* drive, _Inpu
drive->fInput(drive->fPacket);
- Detail::hefsi_balance_filesystem(root, drive);
-
HEFS_INDEX_NODE_DIRECTORY* dirent = new HEFS_INDEX_NODE_DIRECTORY();
rt_set_memory(dirent, 0, sizeof(HEFS_INDEX_NODE_DIRECTORY));
@@ -980,14 +980,18 @@ _Output Bool HeFileSystemParser::CreateDirectory(_Input DriveTrait* drive, _Inpu
dirent->fFlags = flags;
dirent->fChecksum = 0;
+ dirent->fChecksum = ke_calculate_crc32((Char*) dirent, sizeof(HEFS_INDEX_NODE_DIRECTORY));
+
dirent->fEntryCount = 0;
if (Detail::hefs_allocate_index_directory_node(root, drive, dirent)) {
delete dirent;
dirent = nullptr;
- delete node;
delete root;
+ root = nullptr;
+
+ Detail::hefsi_balance_filesystem(root, drive);
return YES;
}
@@ -995,8 +999,8 @@ _Output Bool HeFileSystemParser::CreateDirectory(_Input DriveTrait* drive, _Inpu
delete dirent;
dirent = nullptr;
- delete node;
delete root;
+ root = nullptr;
return NO;
}
@@ -1040,8 +1044,6 @@ _Output Bool HeFileSystemParser::CreateFile(_Input DriveTrait* drive, _Input con
drive->fInput(drive->fPacket);
- Detail::hefsi_balance_filesystem(root, drive);
-
auto dirent = Detail::hefs_fetch_index_node_directory(root, drive, dir);
if (!dirent) {
@@ -1066,16 +1068,16 @@ _Output Bool HeFileSystemParser::CreateFile(_Input DriveTrait* drive, _Input con
}
node->fAccessed = 0;
- node->fCreated = 0;
+ node->fCreated = kHeFSTimeMax;
node->fDeleted = 0;
node->fModified = 0;
node->fSize = 0;
node->fKind = kHeFSFileKindRegular;
node->fFlags = flags;
node->fChecksum = 0;
-
- node->fGID = 0;
- node->fUID = 0;
+ node->fChecksum = ke_calculate_crc32((Char*) node, sizeof(HEFS_INDEX_NODE));
+ node->fGID = 0;
+ node->fUID = 0;
urt_copy_memory((VoidPtr) name, node->fName, urt_string_len(name));
@@ -1083,6 +1085,8 @@ _Output Bool HeFileSystemParser::CreateFile(_Input DriveTrait* drive, _Input con
delete node;
delete root;
+ Detail::hefsi_balance_filesystem(root, drive);
+
return YES;
}
@@ -1092,19 +1096,21 @@ _Output Bool HeFileSystemParser::CreateFile(_Input DriveTrait* drive, _Input con
return NO;
}
+STATIC DriveTrait kMountPoint;
+
/// @brief Initialize the HeFS filesystem.
/// @return To check its status, see err_local_get().
Boolean fs_init_hefs(Void) noexcept {
kout << "Creating HeFS disk...\r";
- auto drv = io_construct_main_drive();
+ kMountPoint = io_construct_main_drive();
- if (drv.fPacket.fPacketReadOnly == YES)
+ if (kMountPoint.fPacket.fPacketReadOnly == YES)
ke_panic(RUNTIME_CHECK_FILESYSTEM, "Main disk cannot be mounted.");
HeFileSystemParser parser;
- parser.Format(&drv, kHeFSEncodingUTF8, kHeFSDefaultVoluneName);
+ parser.Format(&kMountPoint, kHeFSEncodingUTF8, kHeFSDefaultVoluneName);
return YES;
}