diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2025-01-11 13:52:54 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2025-01-11 14:20:24 +0100 |
| commit | 6c7d60a690aa3358b3240ebdfdf1feb62956d747 (patch) | |
| tree | 26ea032a2beff8e4d5a5d3f96a59141f5aaec072 /dev | |
| parent | d4211b210e3e63f69bc3b86555b563a323f8d865 (diff) | |
ADD: Fully implement final patent.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev')
| -rw-r--r-- | dev/Boot/BootKit/BootKit.h | 3 | ||||
| -rw-r--r-- | dev/Boot/amd64-desktop.make | 4 | ||||
| -rw-r--r-- | dev/Kernel/HALKit/AMD64/HalApplicationProcessor.cc | 1 | ||||
| -rw-r--r-- | dev/Kernel/KernelKit/DriveMgr.h | 4 | ||||
| -rw-r--r-- | dev/Kernel/src/DriveMgr.cc | 89 | ||||
| -rw-r--r-- | dev/Kernel/src/FS/NeFS.cc | 3 |
6 files changed, 83 insertions, 21 deletions
diff --git a/dev/Boot/BootKit/BootKit.h b/dev/Boot/BootKit/BootKit.h index db21ba30..050d5929 100644 --- a/dev/Boot/BootKit/BootKit.h +++ b/dev/Boot/BootKit/BootKit.h @@ -345,7 +345,7 @@ namespace Boot part.Version = kNeFSVersionInteger; part.CatalogCount = blob_cnt; part.Kind = kNeFSHardDrive; - part.SectorSize = sizeof(NFS_ROOT_PARTITION_BLOCK); + part.SectorSize = 512; part.FreeCatalog = fDiskDev.GetSectorsCount() / sizeof(NFS_CATALOG_STRUCT); part.SectorCount = fDiskDev.GetSectorsCount(); part.FreeSectors = fDiskDev.GetSectorsCount(); @@ -377,6 +377,7 @@ namespace Boot epm_boot.FsVersion = kNeFSVersionInteger; epm_boot.LbaStart = kNeFSRootCatalogStartAddress; + epm_boot.LbaEnd = fDiskDev.GetDiskSize(); epm_boot.SectorSz = part.SectorSize; epm_boot.Kind = kEPMZkaOS; epm_boot.NumBlocks = part.CatalogCount; diff --git a/dev/Boot/amd64-desktop.make b/dev/Boot/amd64-desktop.make index 395b4e86..3fc704b6 100644 --- a/dev/Boot/amd64-desktop.make +++ b/dev/Boot/amd64-desktop.make @@ -31,7 +31,7 @@ IMG_2=epm-master-2.img EMU_FLAGS=-net none -smp 4 -m 8G -M q35 \ -bios $(BIOS) -drive \ file=fat:rw:src/Root/,index=2,format=raw \ - -monitor stdio + -serial stdio LD_FLAGS=-e Main --subsystem=10 @@ -44,7 +44,7 @@ REM_FLAG=-f FLAG_ASM=-f win64 FLAG_GNU=-fshort-wchar -D__EFI_x86_64__ -mno-red-zone -D__MINOSKRNL__ -D__ZBAOSLDR__ \ -DEFI_FUNCTION_WRAPPER -I./ -I../Kernel -I../ -c -nostdlib -fno-rtti -fno-exceptions \ - -std=c++20 -DBOOTZ_GPT_SUPPORT -D__HAVE_ZKA_APIS__ -DZBA_USE_FB -D__ZKA_AMD64__ -D__ZKA__ -DZKA_AUTO_FORMAT + -std=c++20 -DBOOTZ_GPT_SUPPORT -DBOOTZ_EPM_SUPPORT -D__HAVE_ZKA_APIS__ -DZBA_USE_FB -D__ZKA_AMD64__ -D__ZKA__ -DZKA_AUTO_FORMAT BOOTLOADER=zbaosldr.exe KERNEL=minoskrnl.exe diff --git a/dev/Kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/Kernel/HALKit/AMD64/HalApplicationProcessor.cc index 20d512f4..7929d5a8 100644 --- a/dev/Kernel/HALKit/AMD64/HalApplicationProcessor.cc +++ b/dev/Kernel/HALKit/AMD64/HalApplicationProcessor.cc @@ -4,7 +4,6 @@ ------------------------------------------- */ -#include "NewKit/Defines.h" #include <Mod/ACPI/ACPIFactoryInterface.h> #include <KernelKit/UserProcessScheduler.h> #include <HALKit/AMD64/Processor.h> diff --git a/dev/Kernel/KernelKit/DriveMgr.h b/dev/Kernel/KernelKit/DriveMgr.h index 4c879ab5..dfe4e665 100644 --- a/dev/Kernel/KernelKit/DriveMgr.h +++ b/dev/Kernel/KernelKit/DriveMgr.h @@ -52,7 +52,8 @@ namespace Kernel Char fName[kDriveNameLen]; // /System, /Boot, //./Devices/USB... Int32 fKind; // fMassStorage, fFloppy, fOpticalDisc. Int32 fFlags; // fReadOnly, fXPMDrive, fXPTDrive - + UInt64 fLbaEnd, fLbaStart; + UInt64 fSectorSz; /// @brief Packet drive (StorageKit compilant.) struct DrivePacket final { @@ -63,6 +64,7 @@ namespace Kernel Boolean fPacketGood{YES}; Lba fPacketLba{0UL}; Boolean fPacketReadOnly{NO}; + DriveTrait* fPacketDrive{nullptr}; } fPacket; Void (*fInput)(DrivePacket* packet_ptr); diff --git a/dev/Kernel/src/DriveMgr.cc b/dev/Kernel/src/DriveMgr.cc index 18ff9e5d..d1a6adbf 100644 --- a/dev/Kernel/src/DriveMgr.cc +++ b/dev/Kernel/src/DriveMgr.cc @@ -27,15 +27,47 @@ namespace Kernel /// @return Void io_drv_input(DriveTrait::DrivePacket* pckt) { - if (!pckt) + if (!pckt || !pckt->fPacketDrive) { return; } + if (pckt->fPacketDrive->fSectorSz == 0) + { +#ifdef __ATA_PIO__ + pckt->fPacketDrive->fSectorSz = kATASectorSize; +#elif defined(__AHCI__) + pckt->fPacketDrive->fSectorSz = kAHCISectorSize; +#else + pckt->fPacketDrive->fSectorSz = 512; +#endif + } + + if (!StringBuilder::Equals("fs/detect-packet", pckt->fPacketMime) && + pckt->fPacketDrive->fLbaStart > 0 && pckt->fPacketDrive->fLbaEnd > 0) + { + kcout << "LBA END: " << number(pckt->fPacketDrive->fLbaEnd) << endl; + kcout << "LBA: " << number(pckt->fPacketLba) << endl; + kcout << "LBA START: " << number(pckt->fPacketDrive->fLbaStart) << endl; + kcout << "SECTOR SZ: " << number(pckt->fPacketDrive->fLbaStart) << endl; + + if (pckt->fPacketLba < pckt->fPacketDrive->fLbaStart) + { + pckt->fPacketGood = NO; + return; + } + + if (pckt->fPacketLba > pckt->fPacketDrive->fLbaEnd) + { + pckt->fPacketGood = NO; + return; + } + } + #ifdef __AHCI__ - drv_std_read(pckt->fPacketLba, (Char*)pckt->fPacketContent, kAHCISectorSize, pckt->fPacketSize); + drv_std_read(pckt->fPacketLba, (Char*)pckt->fPacketContent, pckt->fPacketDrive->fSectorSz, pckt->fPacketSize); #elif defined(__ATA_PIO__) || defined(__ATA_DMA__) - drv_std_read(pckt->fPacketLba, kATAIO, kATAMaster, (Char*)pckt->fPacketContent, kATASectorSize, pckt->fPacketSize); + drv_std_read(pckt->fPacketLba, kATAIO, kATAMaster, (Char*)pckt->fPacketContent, pckt->fPacketDrive->fSectorSz, pckt->fPacketSize); #endif } @@ -44,15 +76,24 @@ namespace Kernel /// @return Void io_drv_output(DriveTrait::DrivePacket* pckt) { - if (!pckt) + if (!pckt || !pckt->fPacketDrive) { return; } + if (!StringBuilder::Equals("fs/detect-packet", pckt->fPacketMime)) + { + if (pckt->fPacketLba < pckt->fPacketDrive->fLbaStart) + return; + + if (pckt->fPacketLba > pckt->fPacketDrive->fLbaEnd) + return; + } + #ifdef __AHCI__ - drv_std_write(pckt->fPacketLba, (Char*)pckt->fPacketContent, kAHCISectorSize, pckt->fPacketSize); + drv_std_write(pckt->fPacketLba, (Char*)pckt->fPacketContent, pckt->fPacketDrive->fSectorSz, pckt->fPacketSize); #elif defined(__ATA_PIO__) || defined(__ATA_DMA__) - drv_std_write(pckt->fPacketLba, kATAIO, kATAMaster, (Char*)pckt->fPacketContent, kATASectorSize, pckt->fPacketSize); + drv_std_write(pckt->fPacketLba, kATAIO, kATAMaster, (Char*)pckt->fPacketContent, pckt->fPacketDrive->fSectorSz, pckt->fPacketSize); #endif } @@ -160,8 +201,17 @@ namespace Kernel { EPM_PART_BLOCK block_struct; - trait.fPacket.fPacketLba = kEPMBootBlockLba; - trait.fPacket.fPacketSize = sizeof(EPM_PART_BLOCK); + trait.fPacket.fPacketDrive = &trait; + +#ifdef __ATA_PIO__ + trait.fSectorSz = kATASectorSize; +#elif defined(__AHCI__) + trait.fSectorSz = kAHCISectorSize; +#else + trait.fSectorSz = 512; +#endif + trait.fPacket.fPacketLba = kEPMBootBlockLba; + trait.fPacket.fPacketSize = sizeof(EPM_PART_BLOCK); trait.fPacket.fPacketContent = &block_struct; rt_copy_memory((VoidPtr) "fs/detect-packet", trait.fPacket.fPacketMime, @@ -174,14 +224,23 @@ namespace Kernel if (rt_string_cmp(((BOOT_BLOCK_STRUCT*)trait.fPacket.fPacketContent)->Magic, kEPMMagic, kEPMMagicLength) == 0) { trait.fPacket.fPacketReadOnly = NO; - trait.fKind = kMassStorageDisc | kEPMDrive; + trait.fKind = kMassStorageDisc | kEPMDrive; kcout << "Formatted Disk is EPM (Mass Storage)\r"; + + trait.fSectorSz = block_struct.SectorSz; + trait.fLbaEnd = block_struct.LbaEnd; + trait.fLbaStart = block_struct.LbaStart; + + if (trait.fSectorSz == 0) + { + ke_panic(RUNTIME_CHECK_FAILED, "Invalid EPM partition!"); + } } else { trait.fPacket.fPacketReadOnly = YES; - trait.fKind = kMassStorageDisc | kUnformattedDrive | kReadOnlyDrive; + trait.fKind = kMassStorageDisc | kUnformattedDrive | kReadOnlyDrive; kcout << "Scheme Found: " << block_struct.Name << endl; @@ -192,11 +251,11 @@ namespace Kernel rt_copy_memory((VoidPtr) "*/*", trait.fPacket.fPacketMime, rt_string_len("*/*")); - trait.fPacket.fPacketLba = 0; - trait.fPacket.fPacketSize = 0UL; + trait.fPacket.fPacketLba = 0; + trait.fPacket.fPacketSize = 0UL; trait.fPacket.fPacketContent = nullptr; } - } // namespace Detail + } // namespace Detect /// @brief Fetches the main drive. /// @return the new drive. (returns kEPMDrive if EPM formatted) @@ -216,10 +275,10 @@ namespace Kernel trait.fInit = io_drv_init; trait.fDriveKind = io_drv_kind; - Detect::io_detect_drive(trait); - kcout << "Detecting partition scheme of: " << trait.fName << ".\r"; + Detect::io_detect_drive(trait); + return trait; } } // namespace Kernel diff --git a/dev/Kernel/src/FS/NeFS.cc b/dev/Kernel/src/FS/NeFS.cc index 6f4c43b9..2c6369ce 100644 --- a/dev/Kernel/src/FS/NeFS.cc +++ b/dev/Kernel/src/FS/NeFS.cc @@ -360,7 +360,7 @@ _Output NFS_CATALOG_STRUCT* NeFileSystemParser::CreateCatalog(_Input const Char* return nullptr; } - child_catalog->DataFork = part_block->DiskSize - kNeFSRootCatalogStartAddress - start_free; + child_catalog->DataFork = part_block->DiskSize - kNeFSRootCatalogStartAddress; child_catalog->ResourceFork = child_catalog->DataFork; // Write the new catalog next sibling, if we don't know this parent. // @@ -1028,6 +1028,7 @@ namespace Kernel::Detail kcout << "Creating A:\r"; kDiskMountpoint.A() = io_construct_main_drive(); + kDiskMountpoint.A().fPacket.fPacketDrive = &kDiskMountpoint.A(); kcout << "Creating A: [ OK ]\r"; |
