summaryrefslogtreecommitdiffhomepage
path: root/dev/ZKA/Sources
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-08-22 23:03:29 +0200
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-08-22 23:04:42 +0200
commit8c9091c24fe976d358ae0209bc1a48e15b277d76 (patch)
treee19ac39ac70bb9cf5525fd3fb2d9f1b168e22568 /dev/ZKA/Sources
parent10099e99847307fae60aebdf2292002d359d45b4 (diff)
[FIX] NewFS and builtin PIO support have been fixed.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/ZKA/Sources')
-rw-r--r--dev/ZKA/Sources/DriveManager.cxx8
-rw-r--r--dev/ZKA/Sources/FS/NewFS.cxx175
-rw-r--r--dev/ZKA/Sources/ProcessScheduler.cxx4
3 files changed, 91 insertions, 96 deletions
diff --git a/dev/ZKA/Sources/DriveManager.cxx b/dev/ZKA/Sources/DriveManager.cxx
index 90bf12f8..b26c2c16 100644
--- a/dev/ZKA/Sources/DriveManager.cxx
+++ b/dev/ZKA/Sources/DriveManager.cxx
@@ -28,15 +28,11 @@ namespace Kernel
return;
}
- pckt->fPacketGood = false;
-
#ifdef __AHCI__
drv_std_read(pckt->fLba, (Char*)pckt->fPacketContent, kAHCISectorSize, pckt->fPacketSize);
#elif defined(__ATA_PIO__) || defined(__ATA_DMA__)
drv_std_read(pckt->fLba, kATAIO, kATAMaster, (Char*)pckt->fPacketContent, kATASectorSize, pckt->fPacketSize);
#endif
-
- pckt->fPacketGood = true;
}
/// @brief Writes to an ATA drive.
@@ -49,15 +45,11 @@ namespace Kernel
return;
}
- pckt->fPacketGood = false;
-
#ifdef __AHCI__
drv_std_write(pckt->fLba, (Char*)pckt->fPacketContent, kATASectorSize, pckt->fPacketSize);
#elif defined(__ATA_PIO__) || defined(__ATA_DMA__)
drv_std_write(pckt->fLba, kATAIO, kATAMaster, (Char*)pckt->fPacketContent, kATASectorSize, pckt->fPacketSize);
#endif
-
- pckt->fPacketGood = true;
}
/// @brief Executes a disk check on the ATA drive.
diff --git a/dev/ZKA/Sources/FS/NewFS.cxx b/dev/ZKA/Sources/FS/NewFS.cxx
index 503c184b..bdd4622a 100644
--- a/dev/ZKA/Sources/FS/NewFS.cxx
+++ b/dev/ZKA/Sources/FS/NewFS.cxx
@@ -94,7 +94,7 @@ _Output NFS_FORK_STRUCT* NewFSParser::CreateFork(_Input NFS_CATALOG_STRUCT* cata
kcout << "newoskrnl: next fork: " << hex_number(curFork.NextSibling) << endl;
- if (curFork.Flags & kNewFSFlagCreated)
+ if (curFork.Flags == kNewFSFlagCreated)
{
kcout << "newoskrnl: fork already exists.\r";
@@ -133,7 +133,7 @@ _Output NFS_FORK_STRUCT* NewFSParser::CreateFork(_Input NFS_CATALOG_STRUCT* cata
constexpr auto cForkPadding =
4; /// this value gives us space for the data offset.
- theFork.Flags |= kNewFSFlagCreated;
+ theFork.Flags = kNewFSFlagCreated;
theFork.DataOffset = lba - sizeof(NFS_FORK_STRUCT) * cForkPadding;
theFork.PreviousSibling = lbaOfPreviousFork;
theFork.NextSibling = theFork.DataOffset - theFork.DataSize;
@@ -229,7 +229,7 @@ _Output NFS_CATALOG_STRUCT* NewFSParser::CreateCatalog(_Input const Char* name,
{
kcout << "newoskrnl: CreateCatalog(...)\r";
- Lba outLba = 0UL;
+ Lba out_lba = 0UL;
kcout << "newoskrnl: Checking for extension...\r";
@@ -243,7 +243,7 @@ _Output NFS_CATALOG_STRUCT* NewFSParser::CreateCatalog(_Input const Char* name,
name[rt_string_len(name) - 1] == NewFilesystemHelper::Separator())
return nullptr;
- NFS_CATALOG_STRUCT* catalog_copy = this->FindCatalog(name, outLba);
+ NFS_CATALOG_STRUCT* catalog_copy = this->FindCatalog(name, out_lba);
if (catalog_copy)
{
@@ -288,7 +288,9 @@ _Output NFS_CATALOG_STRUCT* NewFSParser::CreateCatalog(_Input const Char* name,
--indexReverseCopy;
}
- NFS_CATALOG_STRUCT* catalog = this->FindCatalog(parentName, outLba);
+ NFS_CATALOG_STRUCT* catalog = this->FindCatalog(parentName, out_lba);
+
+ auto drive = sMountpointInterface.A();
if (catalog && catalog->Kind == kNewFSCatalogKindFile)
{
@@ -298,7 +300,18 @@ _Output NFS_CATALOG_STRUCT* NewFSParser::CreateCatalog(_Input const Char* name,
}
else if (!catalog)
{
- outLba = kNewFSCatalogStartAddress;
+ Char sectorBufPartBlock[kNewFSSectorSz] = {0};
+
+ drive.fPacket.fPacketContent = sectorBufPartBlock;
+ drive.fPacket.fPacketSize = kNewFSSectorSz;
+ drive.fPacket.fLba = kNewFSRootCatalogStartAddress;
+
+ drive.fInput(&drive.fPacket);
+
+ constexpr auto cNewFSCatalogPadding = 4;
+
+ NFS_ROOT_PARTITION_BLOCK* partBlock = (NFS_ROOT_PARTITION_BLOCK*)sectorBufPartBlock;
+ out_lba = partBlock->StartCatalog;
}
constexpr SizeT cDefaultForkSize = kNewFSForkSize;
@@ -310,19 +323,17 @@ _Output NFS_CATALOG_STRUCT* NewFSParser::CreateCatalog(_Input const Char* name,
catalogChild->ResourceForkSize = cDefaultForkSize;
catalogChild->DataForkSize = cDefaultForkSize;
- catalogChild->NextSibling = outLba;
- catalogChild->PrevSibling = outLba;
+ catalogChild->NextSibling = out_lba;
+ catalogChild->PrevSibling = out_lba;
catalogChild->Kind = kind;
- catalogChild->Flags |= kNewFSFlagCreated | flagsList;
+ catalogChild->Flags = kNewFSFlagCreated | flagsList;
rt_copy_memory((VoidPtr)name, (VoidPtr)catalogChild->Name,
rt_string_len(name));
UInt16 catalogBuf[kNewFSSectorSz] = {0};
- auto drive = sMountpointInterface.A();
-
- Lba start_free = outLba;
+ Lba start_free = out_lba;
rt_copy_memory((VoidPtr) "fs/newfs-packet", drive.fPacket.fPacketMime,
rt_string_len("fs/newfs-packet"));
@@ -337,7 +348,7 @@ _Output NFS_CATALOG_STRUCT* NewFSParser::CreateCatalog(_Input const Char* name,
start_free = nextSibling->NextSibling;
- catalogChild->PrevSibling = outLba;
+ catalogChild->PrevSibling = out_lba;
drive.fPacket.fLba = start_free;
drive.fInput(&drive.fPacket);
@@ -346,7 +357,7 @@ _Output NFS_CATALOG_STRUCT* NewFSParser::CreateCatalog(_Input const Char* name,
{
nextSibling = reinterpret_cast<NFS_CATALOG_STRUCT*>(catalogBuf);
- if (start_free <= kNewFSStartLba)
+ if (start_free <= kNewFSRootCatalogStartAddress)
{
delete catalogChild;
delete catalog;
@@ -357,13 +368,13 @@ _Output NFS_CATALOG_STRUCT* NewFSParser::CreateCatalog(_Input const Char* name,
// ========================== //
// allocate catalog now...
// ========================== //
- if (!(nextSibling->Flags & kNewFSFlagCreated))
+ if ((nextSibling->Flags & kNewFSFlagCreated) == 0)
{
Char sectorBufPartBlock[kNewFSSectorSz] = {0};
drive.fPacket.fPacketContent = sectorBufPartBlock;
drive.fPacket.fPacketSize = kNewFSSectorSz;
- drive.fPacket.fLba = kNewFSStartLba;
+ drive.fPacket.fLba = kNewFSRootCatalogStartAddress;
drive.fInput(&drive.fPacket);
@@ -377,38 +388,25 @@ _Output NFS_CATALOG_STRUCT* NewFSParser::CreateCatalog(_Input const Char* name,
return nullptr;
}
- catalogChild->DataFork = partBlock->DiskSize - partBlock->StartCatalog;
-
+ catalogChild->DataFork = partBlock->DiskSize - partBlock->StartCatalog;
catalogChild->ResourceFork = catalogChild->DataFork;
catalogChild->NextSibling =
start_free + (sizeof(NFS_CATALOG_STRUCT) * cNewFSCatalogPadding);
+ // write the new catalog.
+
drive.fPacket.fPacketContent = catalogChild;
drive.fPacket.fPacketSize = sizeof(NFS_CATALOG_STRUCT);
drive.fPacket.fLba = start_free;
drive.fOutput(&drive.fPacket);
- drive.fPacket.fPacketContent = catalogBuf;
- drive.fPacket.fPacketSize = kNewFSSectorSz;
- drive.fPacket.fLba =
- start_free - (sizeof(NFS_CATALOG_STRUCT) * cNewFSCatalogPadding);
-
- drive.fInput(&drive.fPacket);
-
- nextSibling->NextSibling = start_free;
-
- drive.fOutput(&drive.fPacket);
-
- kcout << "newoskrnl: Create new catalog, status: "
- << hex_number(catalogChild->Flags) << endl;
- kcout << "newoskrnl: Create new catalog, name: " << catalogChild->Name
- << endl;
+ // get newfs part block.
drive.fPacket.fPacketContent = sectorBufPartBlock;
drive.fPacket.fPacketSize = kNewFSSectorSz;
- drive.fPacket.fLba = kNewFSStartLba;
+ drive.fPacket.fLba = kNewFSRootCatalogStartAddress;
drive.fInput(&drive.fPacket);
@@ -419,9 +417,19 @@ _Output NFS_CATALOG_STRUCT* NewFSParser::CreateCatalog(_Input const Char* name,
drive.fOutput(&drive.fPacket);
+ kcout << "newoskrnl: Create new catalog, status: "
+ << hex_number(catalogChild->Flags) << endl;
+ kcout << "newoskrnl: Create new catalog, name: " << catalogChild->Name
+ << endl;
+
delete catalog;
return catalogChild;
}
+ else if ((nextSibling->Flags & kNewFSFlagCreated) &&
+ StringBuilder::Equals(nextSibling->Name, name))
+ {
+ return nextSibling;
+ }
constexpr auto cNewFSCatalogPadding = 4;
@@ -463,7 +471,7 @@ bool NewFSParser::Format(_Input _Output DriveTrait* drive, _Input const Lba endL
Char sectorBuf[kNewFSSectorSz] = {0};
- Lba start = kNewFSStartLba;
+ Lba start = kNewFSRootCatalogStartAddress;
drive->fPacket.fPacketContent = sectorBuf;
drive->fPacket.fPacketSize = kNewFSSectorSz;
@@ -569,7 +577,7 @@ bool NewFSParser::Format(_Input _Output DriveTrait* drive, _Input const Lba endL
drive->fPacket.fPacketContent = sectorBuf;
drive->fPacket.fPacketSize = kNewFSSectorSz;
- drive->fPacket.fLba = kNewFSStartLba;
+ drive->fPacket.fLba = kNewFSRootCatalogStartAddress;
drive->fOutput(&drive->fPacket);
@@ -670,7 +678,7 @@ bool NewFSParser::WriteCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, Bool
continue;
}
- forkDataIn.Flags |= kNewFSFlagCreated;
+ forkDataIn.Flags = kNewFSFlagCreated;
drive.fPacket.fPacketContent = data;
drive.fPacket.fPacketSize = sizeOfData;
@@ -703,34 +711,33 @@ bool NewFSParser::WriteCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, Bool
/// @param catalogName the catalog name.
/// @return the newly found catalog.
_Output NFS_CATALOG_STRUCT* NewFSParser::FindCatalog(_Input const Char* catalogName,
- Lba& outLba)
+ Lba& out_lba)
{
kcout << "newoskrnl: start finding catalog...\r";
- Char* sectorBuf = new Char[sizeof(NFS_ROOT_PARTITION_BLOCK)];
- auto drive = sMountpointInterface.A();
+ NFS_ROOT_PARTITION_BLOCK sectorBuf{0};
+ auto drive = sMountpointInterface.A();
rt_copy_memory((VoidPtr) "fs/newfs-packet", drive.fPacket.fPacketMime,
rt_string_len("fs/newfs-packet"));
- drive.fPacket.fPacketContent = sectorBuf;
+ drive.fPacket.fPacketContent = &sectorBuf;
drive.fPacket.fPacketSize = sizeof(NFS_ROOT_PARTITION_BLOCK);
- drive.fPacket.fLba = kNewFSStartLba;
+ drive.fPacket.fLba = kNewFSRootCatalogStartAddress;
drive.fInput(&drive.fPacket);
- NFS_ROOT_PARTITION_BLOCK* part = (NFS_ROOT_PARTITION_BLOCK*)sectorBuf;
+ NFS_ROOT_PARTITION_BLOCK* part = (NFS_ROOT_PARTITION_BLOCK*)&sectorBuf;
auto startCatalogList = part->StartCatalog;
- const auto cStartCatalogList = part->StartCatalog;
+ const auto cCtartCatalogList = startCatalogList;
auto localSearchFirst = false;
- delete sectorBuf;
- sectorBuf = new Char[sizeof(NFS_CATALOG_STRUCT)];
+ NFS_CATALOG_STRUCT catalogBuf{0};
drive.fPacket.fLba = startCatalogList;
- drive.fPacket.fPacketContent = sectorBuf;
+ drive.fPacket.fPacketContent = &catalogBuf;
drive.fPacket.fPacketSize = sizeof(NFS_CATALOG_STRUCT);
drive.fInput(&drive.fPacket);
@@ -758,12 +765,12 @@ _Output NFS_CATALOG_STRUCT* NewFSParser::FindCatalog(_Input const Char* catalogN
--indexReverseCopy;
}
- NFS_CATALOG_STRUCT* parentCatalog = this->FindCatalog(parentName, outLba);
+ NFS_CATALOG_STRUCT* parentCatalog = this->FindCatalog(parentName, out_lba);
if (parentCatalog &&
!StringBuilder::Equals(parentName, NewFilesystemHelper::Root()))
{
- startCatalogList = outLba;
+ startCatalogList = parentCatalog->NextSibling;
delete parentCatalog;
localSearchFirst = true;
@@ -774,55 +781,53 @@ _Output NFS_CATALOG_STRUCT* NewFSParser::FindCatalog(_Input const Char* catalogN
}
}
- kcout << "newoskrnl: Fetching catalog: " << catalogName << "\r";
-
- startCatalogList = cStartCatalogList;
+ kcout << "newoskrnl: fetching catalog...\r";
_NewFSSearchThroughCatalogList:
while (drive.fPacket.fPacketGood)
{
drive.fPacket.fLba = startCatalogList;
- drive.fPacket.fPacketContent = sectorBuf;
+ drive.fPacket.fPacketContent = &catalogBuf;
drive.fPacket.fPacketSize = sizeof(NFS_CATALOG_STRUCT);
drive.fInput(&drive.fPacket);
- NFS_CATALOG_STRUCT* catalog = (NFS_CATALOG_STRUCT*)sectorBuf;
-
- kcout << "newoskrnl: Fetching catalog: " << catalog->Name << "\r";
- kcout << "newoskrnl: Fetching catalog: " << catalogName << "\r";
+ NFS_CATALOG_STRUCT* catalog = (NFS_CATALOG_STRUCT*)&catalogBuf;
- if (StringBuilder::Equals(catalogName, catalog->Name) &&
- (catalog->Flags & kNewFSFlagCreated))
+ if (StringBuilder::Equals(catalogName, catalog->Name))
{
- kcout << "newoskrnl: Found catalog at: " << hex_number(startCatalogList) << endl;
+ /// ignore unallocated catalog, break
+ if (!(catalog->Flags & kNewFSFlagCreated))
+ {
+ goto NewFSContinueSearch;
+ }
+
+ NFS_CATALOG_STRUCT* catalogPtr = new NFS_CATALOG_STRUCT();
+ rt_copy_memory(catalog, catalogPtr, sizeof(NFS_CATALOG_STRUCT));
- outLba = startCatalogList;
- return catalog;
+ kcout << "newoskrnl: found catalog at: " << hex_number(startCatalogList) << endl;
+ kcout << "newoskrnl: found catalog at: " << catalog->Name << endl;
+
+ out_lba = startCatalogList;
+ return catalogPtr;
}
NewFSContinueSearch:
startCatalogList = catalog->NextSibling;
- if (startCatalogList <= kNewFSStartLba)
- {
+ if (startCatalogList <= kNewFSRootCatalogStartAddress)
break;
- }
}
if (localSearchFirst)
{
localSearchFirst = false;
- startCatalogList = cStartCatalogList;
+ startCatalogList = cCtartCatalogList;
goto _NewFSSearchThroughCatalogList;
}
- kcout << "Didnt find it.\r";
-
- outLba = 0UL;
- delete[] sectorBuf;
-
+ out_lba = 0UL;
return nullptr;
}
@@ -831,10 +836,8 @@ _NewFSSearchThroughCatalogList:
/// @return
_Output NFS_CATALOG_STRUCT* NewFSParser::GetCatalog(_Input const Char* name)
{
- Lba unused = 0;
- NFS_CATALOG_STRUCT* catalog = this->FindCatalog(name, unused);
-
- return catalog;
+ Lba unused = 0;
+ return this->FindCatalog(name, unused);
}
/// @brief Closes a catalog, (frees it).
@@ -863,20 +866,20 @@ Boolean NewFSParser::RemoveCatalog(_Input const Char* catalogName)
return false;
}
- Lba outLba = 0;
- auto catalog = this->FindCatalog(catalogName, outLba);
+ Lba out_lba = 0;
+ auto catalog = this->FindCatalog(catalogName, out_lba);
- if (outLba >= kNewFSCatalogStartAddress ||
- (catalog->Flags & kNewFSFlagCreated))
+ if (out_lba >= kNewFSCatalogStartAddress ||
+ catalog->Flags == kNewFSFlagCreated)
{
- catalog->Flags |= kNewFSFlagDeleted;
+ catalog->Flags = kNewFSFlagDeleted;
auto drive = sMountpointInterface.A();
rt_copy_memory((VoidPtr) "fs/newfs-packet", drive.fPacket.fPacketMime,
rt_string_len("fs/newfs-packet"));
- drive.fPacket.fLba = outLba; // the catalog position.
+ drive.fPacket.fLba = out_lba; // the catalog position.
drive.fPacket.fPacketSize =
sizeof(NFS_CATALOG_STRUCT); // size of catalog. roughly the sector size.
drive.fPacket.fPacketContent = catalog; // the catalog itself.
@@ -885,7 +888,7 @@ Boolean NewFSParser::RemoveCatalog(_Input const Char* catalogName)
Char partitionBlockBuf[sizeof(NFS_ROOT_PARTITION_BLOCK)] = {0};
- drive.fPacket.fLba = kNewFSStartLba;
+ drive.fPacket.fLba = kNewFSRootCatalogStartAddress;
drive.fPacket.fPacketContent = partitionBlockBuf;
drive.fPacket.fPacketSize = sizeof(NFS_ROOT_PARTITION_BLOCK);
@@ -928,12 +931,10 @@ VoidPtr NewFSParser::ReadCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog,
return nullptr;
}
- kcout << "newoskrnl: Reading catalog..\r";
-
- Lba dataForkLba = catalog->DataFork;
- Size dataForkSize = catalog->DataForkSize;
+ Lba dataForkLba = (!isRsrcFork) ? catalog->DataFork : catalog->ResourceFork;
+ Size dataForkSize = (!isRsrcFork) ? catalog->DataForkSize : catalog->ResourceForkSize;
- kcout << "newoskrnl: Catalog " << catalog->Name
+ kcout << "newoskrnl: catalog " << catalog->Name
<< ", fork: " << hex_number(dataForkLba) << endl;
Char* sectorBuf = new Char[sizeof(NFS_FORK_STRUCT)];
diff --git a/dev/ZKA/Sources/ProcessScheduler.cxx b/dev/ZKA/Sources/ProcessScheduler.cxx
index 902a3c42..9e0708e7 100644
--- a/dev/ZKA/Sources/ProcessScheduler.cxx
+++ b/dev/ZKA/Sources/ProcessScheduler.cxx
@@ -44,7 +44,9 @@ namespace Kernel
void PROCESS_HEADER_BLOCK::Crash()
{
- kcout << (*this->Name == 0 ? "UNKNOWN" : this->Name) << ": crashed. (id = " << number(kErrorProcessFault);
+ constexpr auto cUnknownProcess = "?";
+
+ kcout << (*this->Name == 0 ? cUnknownProcess : this->Name) << ": crashed. (id = " << number(kErrorProcessFault);
kcout << ")\r";
this->Exit(kErrorProcessFault);