diff options
| -rw-r--r-- | dev/ZBA/BootKit/BootKit.hxx | 99 | ||||
| -rw-r--r-- | dev/ZBA/Sources/HEL/AMD64/BootATA.cxx | 16 | ||||
| -rw-r--r-- | dev/ZBA/Sources/HEL/AMD64/BootMain.cxx | 3 | ||||
| -rw-r--r-- | dev/ZBA/Sources/HEL/AMD64/New+Delete.cxx | 4 | ||||
| -rw-r--r-- | dev/ZBA/amd64-efi.make | 2 | ||||
| -rw-r--r-- | dev/ZKA/FSKit/NewFS.hxx | 6 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalKernelMain.cxx | 15 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx | 20 | ||||
| -rw-r--r-- | dev/ZKA/KernelKit/FileManager.hxx | 8 | ||||
| -rw-r--r-- | dev/ZKA/KernelKit/User.hxx | 2 | ||||
| -rw-r--r-- | dev/ZKA/Sources/DriveManager.cxx | 8 | ||||
| -rw-r--r-- | dev/ZKA/Sources/FS/NewFS.cxx | 175 | ||||
| -rw-r--r-- | dev/ZKA/Sources/ProcessScheduler.cxx | 4 |
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 = §orBuf; 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*)§orBuf; 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); |
