summaryrefslogtreecommitdiffhomepage
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
parent10099e99847307fae60aebdf2292002d359d45b4 (diff)
[FIX] NewFS and builtin PIO support have been fixed.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
-rw-r--r--dev/ZBA/BootKit/BootKit.hxx99
-rw-r--r--dev/ZBA/Sources/HEL/AMD64/BootATA.cxx16
-rw-r--r--dev/ZBA/Sources/HEL/AMD64/BootMain.cxx3
-rw-r--r--dev/ZBA/Sources/HEL/AMD64/New+Delete.cxx4
-rw-r--r--dev/ZBA/amd64-efi.make2
-rw-r--r--dev/ZKA/FSKit/NewFS.hxx6
-rw-r--r--dev/ZKA/HALKit/AMD64/HalKernelMain.cxx15
-rw-r--r--dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx20
-rw-r--r--dev/ZKA/KernelKit/FileManager.hxx8
-rw-r--r--dev/ZKA/KernelKit/User.hxx2
-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
13 files changed, 164 insertions, 198 deletions
diff --git a/dev/ZBA/BootKit/BootKit.hxx b/dev/ZBA/BootKit/BootKit.hxx
index 71d94c14..bdffb69f 100644
--- a/dev/ZBA/BootKit/BootKit.hxx
+++ b/dev/ZBA/BootKit/BootKit.hxx
@@ -219,7 +219,7 @@ public:
/// @brief check if partition is good.
Bool IsPartitionValid() noexcept
{
- fDiskDev.Leak().mBase = (kNewFSStartLba);
+ fDiskDev.Leak().mBase = (kNewFSRootCatalogStartAddress);
fDiskDev.Leak().mSize = BootDev::kSectorSize;
Char buf[BootDev::kSectorSize] = {0};
@@ -263,37 +263,32 @@ private:
/// @param partBlock the NewFS partition block.
Boolean WriteRootCatalog(BFileDescriptor* fileBlobs, SizeT blobCount, NFS_ROOT_PARTITION_BLOCK& partBlock)
{
- if (partBlock.SectorSize != BootDev::kSectorSize)
- return false;
-
BFileDescriptor* blob = fileBlobs;
Lba startLba = partBlock.StartCatalog;
BTextWriter writer;
- Char bufCatalog[sizeof(NFS_CATALOG_STRUCT)] = {0};
+ NFS_CATALOG_STRUCT catalogKind{0};
constexpr auto cNewFSCatalogPadding = 4;
- NFS_CATALOG_STRUCT* catalogKind = (NFS_CATALOG_STRUCT*)bufCatalog;
- catalogKind->PrevSibling = startLba;
- catalogKind->NextSibling = (startLba + (sizeof(NFS_CATALOG_STRUCT) * cNewFSCatalogPadding));
+ catalogKind.PrevSibling = startLba;
+ catalogKind.NextSibling = (startLba + sizeof(NFS_CATALOG_STRUCT) * cNewFSCatalogPadding);
/// Fill catalog kind.
- catalogKind->Kind = blob->fKind;
- catalogKind->Flags = kNewFSFlagCreated;
+ catalogKind.Kind = blob->fKind;
+ catalogKind.Flags = kNewFSFlagCreated;
--partBlock.FreeCatalog;
--partBlock.FreeSectors;
- writer.Write(L"newosldr: Wrote directory: ").Write(blob->fFileName).Write(L"\r");
- writer.Write(L"newosldr: Disk formatted.\r");
-
- CopyMem(catalogKind->Name, blob->fFileName, StrLen(blob->fFileName));
+ CopyMem(catalogKind.Name, blob->fFileName, StrLen(blob->fFileName));
fDiskDev.Leak().mBase = startLba;
fDiskDev.Leak().mSize = sizeof(NFS_CATALOG_STRUCT);
- fDiskDev.Write((Char*)bufCatalog, sizeof(NFS_CATALOG_STRUCT));
+ fDiskDev.Write((Char*)&catalogKind, sizeof(NFS_CATALOG_STRUCT));
+
+ writer.Write(L"newosldr: Wrote directory: ").Write(blob->fFileName).Write(L"\r");
return true;
}
@@ -318,12 +313,10 @@ inline Boolean BDiskFormatFactory<BootDev>::Format(const Char* partName,
/// convert the sector into something that the disk understands.
SizeT sectorSz = BootDev::kSectorSize;
- Char* buf = new Char[BootDev::kSectorSize];
+ NFS_ROOT_PARTITION_BLOCK partBlock{0};
- NFS_ROOT_PARTITION_BLOCK* partBlock = reinterpret_cast<NFS_ROOT_PARTITION_BLOCK*>(buf);
-
- memcpy(partBlock->Ident, kNewFSIdent, kNewFSIdentLen - 1);
- memcpy(partBlock->PartitionName, partName, strlen(partName));
+ CopyMem(partBlock.Ident, kNewFSIdent, kNewFSIdentLen - 1);
+ CopyMem(partBlock.PartitionName, partName, strlen(partName));
/// @note A catalog roughly equal to a sector.
@@ -333,62 +326,58 @@ inline Boolean BDiskFormatFactory<BootDev>::Format(const Char* partName,
if (GIB(fDiskDev.GetDiskSize()) < cMinimumDiskSize)
{
- delete buf;
EFI::ThrowError(L"Disk-Too-Tiny", L"Can't format a New Filesystem partition here.");
return false;
}
- partBlock->Version = kNewFSVersionInteger;
- partBlock->CatalogCount = blobCount;
- partBlock->Kind = kNewFSHardDrive;
- partBlock->SectorSize = sectorSz;
- partBlock->FreeCatalog = fDiskDev.GetSectorsCount() / sizeof(NFS_CATALOG_STRUCT);
- partBlock->SectorCount = fDiskDev.GetSectorsCount();
- partBlock->FreeSectors = fDiskDev.GetSectorsCount();
- partBlock->StartCatalog = kNewFSCatalogStartAddress;
- partBlock->DiskSize = fDiskDev.GetDiskSize();
- partBlock->Flags |= kNewFSPartitionTypeBoot;
+ partBlock.Version = kNewFSVersionInteger;
+ partBlock.CatalogCount = blobCount;
+ partBlock.Kind = kNewFSHardDrive;
+ partBlock.SectorSize = sectorSz;
+ partBlock.FreeCatalog = fDiskDev.GetSectorsCount() / sizeof(NFS_CATALOG_STRUCT);
+ partBlock.SectorCount = fDiskDev.GetSectorsCount();
+ partBlock.FreeSectors = fDiskDev.GetSectorsCount();
+ partBlock.StartCatalog = kNewFSCatalogStartAddress;
+ partBlock.DiskSize = fDiskDev.GetDiskSize();
+ partBlock.Flags |= kNewFSPartitionTypeBoot | kNewFSPartitionTypeStandard;
- /// if we can write a root catalog, then write the partition block.
- if (this->WriteRootCatalog(fileBlobs, blobCount, *partBlock))
- {
- fDiskDev.Leak().mBase = kNewFSStartLba;
- fDiskDev.Leak().mSize = sectorSz;
+ fDiskDev.Leak().mBase = kNewFSRootCatalogStartAddress;
+ fDiskDev.Leak().mSize = sectorSz;
- fDiskDev.Write(buf, sectorSz);
+ fDiskDev.Write((Char*)&partBlock, sectorSz);
- /// Reset buffer.
- SetMem(buf, 0, sectorSz);
+ BOOT_BLOCK_STRUCT epmBoot{0};
- BOOT_BLOCK_STRUCT* epmBoot = (BOOT_BLOCK_STRUCT*)buf;
+ constexpr auto cFsName = "NewFS";
+ constexpr auto cBlockName = "ZKA:";
- constexpr auto cFsName = "NewFS";
- constexpr auto cBlockName = "ZKA:";
+ CopyMem(epmBoot.Fs, reinterpret_cast<VoidPtr>(const_cast<Char*>(cFsName)), StrLen(cFsName));
- CopyMem(reinterpret_cast<VoidPtr>(const_cast<Char*>(cFsName)), epmBoot->Fs, StrLen(cFsName));
+ epmBoot.FsVersion = kNewFSVersionInteger;
+ epmBoot.LbaStart = kNewFSRootCatalogStartAddress;
+ epmBoot.SectorSz = partBlock.SectorSize;
+ epmBoot.NumBlocks = partBlock.CatalogCount;
- epmBoot->FsVersion = kNewFSVersionInteger;
- epmBoot->LbaStart = kNewFSStartLba;
- epmBoot->SectorSz = partBlock->SectorSize;
- epmBoot->NumBlocks = partBlock->CatalogCount;
+ CopyMem(epmBoot.Name, reinterpret_cast<VoidPtr>(const_cast<Char*>(cBlockName)), StrLen(cBlockName));
+ CopyMem(epmBoot.Magic, reinterpret_cast<VoidPtr>(const_cast<Char*>(kEPMMagic)), StrLen(kEPMMagic));
- CopyMem(epmBoot->Name, reinterpret_cast<VoidPtr>(const_cast<Char*>(cBlockName)), StrLen(cBlockName));
- CopyMem(epmBoot->Magic, reinterpret_cast<VoidPtr>(const_cast<Char*>(kEPMMagic)), StrLen(kEPMMagic));
+ fDiskDev.Leak().mBase = 1; // always always resies at zero block.
+ fDiskDev.Leak().mSize = BootDev::kSectorSize;
- fDiskDev.Leak().mBase = kEpmBase;
- fDiskDev.Leak().mSize = sectorSz;
+ fDiskDev.Write((Char*)&epmBoot, sectorSz);
- fDiskDev.Write(buf, sectorSz);
+ /// if we can write a root catalog, then write the partition block.
+ if (this->WriteRootCatalog(fileBlobs, blobCount, partBlock))
+ {
+ BTextWriter writer;
+ writer.Write(L"newosldr: Disk formatted.\r");
- delete buf;
return true;
}
else
{
- delete buf;
EFI::ThrowError(L"Filesystem-Failure-Part", L"Filesystem couldn't be partitioned.");
}
- delete buf;
return false;
}
diff --git a/dev/ZBA/Sources/HEL/AMD64/BootATA.cxx b/dev/ZBA/Sources/HEL/AMD64/BootATA.cxx
index 4beed241..0c2e557d 100644
--- a/dev/ZBA/Sources/HEL/AMD64/BootATA.cxx
+++ b/dev/ZBA/Sources/HEL/AMD64/BootATA.cxx
@@ -111,6 +111,8 @@ ATAInit_Retry:
Void boot_ata_read(UInt64 Lba, UInt16 IO, UInt8 Master, CharacterTypeUTF8* Buf, SizeT SectorSz, SizeT Size)
{
+ Lba /= SectorSz;
+
UInt8 Command = ((!Master) ? 0xE0 : 0xF0);
boot_ata_wait_io(IO);
@@ -120,7 +122,7 @@ Void boot_ata_read(UInt64 Lba, UInt16 IO, UInt8 Master, CharacterTypeUTF8* Buf,
Out8(IO + ATA_REG_SEC_COUNT0, 2);
- Out8(IO + ATA_REG_LBA0, (Lba));
+ Out8(IO + ATA_REG_LBA0, (Lba) & 0xFF);
Out8(IO + ATA_REG_LBA1, (Lba) >> 8);
Out8(IO + ATA_REG_LBA2, (Lba) >> 16);
Out8(IO + ATA_REG_LBA3, (Lba) >> 24);
@@ -139,6 +141,8 @@ Void boot_ata_read(UInt64 Lba, UInt16 IO, UInt8 Master, CharacterTypeUTF8* Buf,
Void boot_ata_write(UInt64 Lba, UInt16 IO, UInt8 Master, CharacterTypeUTF8* Buf, SizeT SectorSz, SizeT Size)
{
+ Lba /= SectorSz;
+
UInt8 Command = ((!Master) ? 0xE0 : 0xF0);
boot_ata_wait_io(IO);
@@ -148,7 +152,7 @@ Void boot_ata_write(UInt64 Lba, UInt16 IO, UInt8 Master, CharacterTypeUTF8* Buf,
Out8(IO + ATA_REG_SEC_COUNT0, 2);
- Out8(IO + ATA_REG_LBA0, (Lba));
+ Out8(IO + ATA_REG_LBA0, (Lba) & 0xFF);
Out8(IO + ATA_REG_LBA1, (Lba) >> 8);
Out8(IO + ATA_REG_LBA2, (Lba) >> 16);
Out8(IO + ATA_REG_LBA3, (Lba) >> 24);
@@ -219,9 +223,7 @@ BootDeviceATA& BootDeviceATA::Read(CharacterTypeUTF8* Buf, const SizeT& SectorSz
if (!Buf || SectorSz < 1)
return *this;
- auto lba = this->Leak().mBase / SectorSz;
-
- boot_ata_read(lba, this->Leak().mBus, this->Leak().mMaster,
+ boot_ata_read(this->Leak().mBase, this->Leak().mBus, this->Leak().mMaster,
Buf, SectorSz, this->Leak().mSize);
return *this;
@@ -245,9 +247,7 @@ BootDeviceATA& BootDeviceATA::Write(CharacterTypeUTF8* Buf, const SizeT& SectorS
if (!Buf || SectorSz < 1)
return *this;
- auto lba = this->Leak().mBase / SectorSz;
-
- boot_ata_write(lba, this->Leak().mBus, this->Leak().mMaster,
+ boot_ata_write(this->Leak().mBase, this->Leak().mBus, this->Leak().mMaster,
Buf, SectorSz, this->Leak().mSize);
return *this;
diff --git a/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx b/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx
index f6438be8..1011ce10 100644
--- a/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx
+++ b/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx
@@ -216,9 +216,6 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle,
checkPart.Format("ZKA (A:)", &root, 1);
- cg_write_text("INSATLLED PARTITION WITH SUCCESS.", 40, 10, RGB(0xFF, 0xFF, 0xFF));
-
- rt_reset_hardware();
EFI::Stop();
}
diff --git a/dev/ZBA/Sources/HEL/AMD64/New+Delete.cxx b/dev/ZBA/Sources/HEL/AMD64/New+Delete.cxx
index 8b9a41fa..4a308f94 100644
--- a/dev/ZBA/Sources/HEL/AMD64/New+Delete.cxx
+++ b/dev/ZBA/Sources/HEL/AMD64/New+Delete.cxx
@@ -19,7 +19,7 @@ EXTERN EfiBootServices* BS;
void* operator new(size_t sz)
{
void* buf = nullptr;
-
+
while (BS->AllocatePool(EfiMemoryType::EfiLoaderData, sz, &buf) == kBufferTooSmall)
BS->FreePool(buf);
@@ -59,4 +59,4 @@ void operator delete(void* buf, size_t size)
BS->FreePool(buf);
}
-#endif // Inactive
+#endif // __STANDALONE__
diff --git a/dev/ZBA/amd64-efi.make b/dev/ZBA/amd64-efi.make
index dcb0972c..9e1fcd98 100644
--- a/dev/ZBA/amd64-efi.make
+++ b/dev/ZBA/amd64-efi.make
@@ -33,7 +33,7 @@ EMU_FLAGS=-net none -smp 4 -m 8G -M q35 \
-bios $(BIOS) -device piix3-ide,id=ide \
-drive id=disk,file=$(IMG),format=raw,if=none \
-device ide-hd,drive=disk,bus=ide.0 -drive \
- file=fat:rw:Sources/Root/,index=2,format=raw -d int -hdd $(IMG_2)
+ file=fat:rw:Sources/Root/,index=2,format=raw -d int
LD_FLAGS=-e Main --subsystem=10
diff --git a/dev/ZKA/FSKit/NewFS.hxx b/dev/ZKA/FSKit/NewFS.hxx
index e0629ab4..d243c6bc 100644
--- a/dev/ZKA/FSKit/NewFS.hxx
+++ b/dev/ZKA/FSKit/NewFS.hxx
@@ -49,7 +49,7 @@ default.
#define kNewFSCatalogKindDir (2)
#define kNewFSCatalogKindAlias (3)
-#define kNewFSForkSize (8192)
+#define kNewFSForkSize (512)
//! shared between network or
//! other filesystems. Export forks as .zip when copying.
@@ -85,8 +85,8 @@ default.
#define kNewFSLbaType (Kernel::Lba)
/// Start After the PM headers, pad 1024 bytes.
-#define kNewFSStartLba (1024)
-#define kNewFSCatalogStartAddress ((1024) + sizeof(NFS_ROOT_PARTITION_BLOCK) + sizeof(NFS_CATALOG_STRUCT))
+#define kNewFSRootCatalogStartAddress (1024)
+#define kNewFSCatalogStartAddress ((2048) + sizeof(NFS_ROOT_PARTITION_BLOCK))
#define kResourceTypeDialog (10)
#define kResourceTypeString (11)
diff --git a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
index de5ea494..43c2248d 100644
--- a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
@@ -227,22 +227,11 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept
Kernel::NewFilesystemManager::Mount(fs);
- if (auto node = fs->GetParser()->GetCatalog("\\Users\\");
- !node)
- {
- delete fs->GetParser()->CreateCatalog("\\Users\\", 0, kNewFSCatalogKindDir);
- delete fs->GetParser()->CreateCatalog(kUsersFile, 0, kNewFSCatalogKindFile);
- }
-
#ifdef __DEBUG__
- const auto cPassword = "debug_usr";
+ const auto cPassword = "debug_usr";
const auto cPasswordIncorrect = "debug_usr_invalid";
- Kernel::User user{Kernel::RingKind::kRingSuperUser, kSuperUser};
- if (!user.TrySave(cPassword))
- {
- Kernel::ke_stop(RUNTIME_CHECK_UNEXCPECTED);
- }
+ Kernel::User user{Kernel::RingKind::kRingSuperUser, kSuperUser};
Kernel::UserManager::The()->TryLogIn(user, cPassword);
#endif
diff --git a/dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx b/dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx
index c1cdd013..acca5dd4 100644
--- a/dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx
+++ b/dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx
@@ -67,7 +67,7 @@ Boolean drv_std_init(UInt16 Bus, UInt8 Drive, UInt16& OutBus, UInt8& OutMaster)
UInt16 IO = Bus;
drv_std_select(IO);
-
+
Kernel::kcout << "newoskrnl: Initializing drive...\r";
ATAInit_Retry:
@@ -114,9 +114,9 @@ ATAInit_Retry:
Void drv_std_read(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT SectorSz, SizeT Size)
{
- UInt8 Command = ((!Master) ? 0xE0 : 0xF0);
+ Lba /= SectorSz;
- Lba /= SectorSz;
+ UInt8 Command = ((!Master) ? 0xE0 : 0xF0);
drv_std_wait_io(IO);
drv_std_select(IO);
@@ -124,11 +124,12 @@ Void drv_std_read(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT SectorSz
Out8(IO + ATA_REG_HDDEVSEL, (Command) | (((Lba) >> 24) & 0x0F));
/// Compute sector count.
- Out8(IO + ATA_REG_SEC_COUNT0, SectorSz / (SectorSz / 2));
+ Out8(IO + ATA_REG_SEC_COUNT0, 2);
- Out8(IO + ATA_REG_LBA0, (Lba));
+ Out8(IO + ATA_REG_LBA0, (Lba) & 0xFF);
Out8(IO + ATA_REG_LBA1, (Lba) >> 8);
Out8(IO + ATA_REG_LBA2, (Lba) >> 16);
+ Out8(IO + ATA_REG_LBA3, (Lba) >> 24);
Out8(IO + ATA_REG_COMMAND, ATA_CMD_READ_PIO);
@@ -146,9 +147,9 @@ Void drv_std_read(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT SectorSz
Void drv_std_write(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT SectorSz, SizeT Size)
{
- UInt8 Command = ((!Master) ? 0xE0 : 0xF0);
+ Lba /= SectorSz;
- Lba /= SectorSz;
+ UInt8 Command = ((!Master) ? 0xE0 : 0xF0);
drv_std_wait_io(IO);
drv_std_select(IO);
@@ -156,11 +157,12 @@ Void drv_std_write(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT SectorS
/// Compute sector count.
Out8(IO + ATA_REG_HDDEVSEL, (Command) | (((Lba) >> 24) & 0x0F));
- Out8(IO + ATA_REG_SEC_COUNT0, SectorSz / (SectorSz / 2));
+ Out8(IO + ATA_REG_SEC_COUNT0, 2);
- Out8(IO + ATA_REG_LBA0, (Lba));
+ Out8(IO + ATA_REG_LBA0, (Lba) & 0xFF);
Out8(IO + ATA_REG_LBA1, (Lba) >> 8);
Out8(IO + ATA_REG_LBA2, (Lba) >> 16);
+ Out8(IO + ATA_REG_LBA3, (Lba) >> 24);
Out8(IO + ATA_REG_COMMAND, ATA_CMD_WRITE_PIO);
diff --git a/dev/ZKA/KernelKit/FileManager.hxx b/dev/ZKA/KernelKit/FileManager.hxx
index 0efb55a4..7f222c4a 100644
--- a/dev/ZKA/KernelKit/FileManager.hxx
+++ b/dev/ZKA/KernelKit/FileManager.hxx
@@ -64,13 +64,7 @@ namespace Kernel
cFileFlagData = 105,
};
- /// @brief filesystem node generic type.
- struct PACKED FMNode final
- {
- VoidPtr _Unused;
- };
-
- typedef FMNode* NodePtr;
+ typedef VoidPtr NodePtr;
/**
@brief Filesystem Manager Interface class
diff --git a/dev/ZKA/KernelKit/User.hxx b/dev/ZKA/KernelKit/User.hxx
index c1d2dd58..55e93d9a 100644
--- a/dev/ZKA/KernelKit/User.hxx
+++ b/dev/ZKA/KernelKit/User.hxx
@@ -16,7 +16,7 @@
#define kSuperUser "\\Local\\Super"
#define kGuestUser "\\Local\\Guest"
-#define kUsersFile "\\Users\\$MANIFEST"
+#define kUsersFile "\\Users\\UsrRcrd"
#define kMaxUserNameLen (255)
#define kMaxUserTokenLen (255)
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);