diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-08-26 05:02:55 +0200 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-08-26 05:02:55 +0200 |
| commit | 9076aff05349093c2c6280287ee3257d9c07c014 (patch) | |
| tree | 9c415985dabaa37c7effc93306ca51e90c496e17 /dev | |
| parent | ff94ce367f7f23e3a78f157f9420c480a4d7f9aa (diff) | |
[IMP] Add page file inside \System\ (syspage.sys)
[FIX] Fix ATA support in bootloader and kernel.
[IMP] Add sector count macro in DriveManager.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev')
| -rw-r--r-- | dev/ZBA/Sources/HEL/AMD64/BootATA.cxx | 4 | ||||
| -rw-r--r-- | dev/ZBA/Sources/HEL/AMD64/BootMain.cxx | 3 | ||||
| -rw-r--r-- | dev/ZKA/FSKit/NewFS.hxx | 1 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx | 6 | ||||
| -rw-r--r-- | dev/ZKA/KernelKit/DriveManager.hxx | 2 | ||||
| -rw-r--r-- | dev/ZKA/KernelKit/PE.hxx | 1 | ||||
| -rw-r--r-- | dev/ZKA/Sources/DLLMain.cxx | 27 | ||||
| -rw-r--r-- | dev/ZKA/Sources/FS/NewFS.cxx | 33 |
8 files changed, 29 insertions, 48 deletions
diff --git a/dev/ZBA/Sources/HEL/AMD64/BootATA.cxx b/dev/ZBA/Sources/HEL/AMD64/BootATA.cxx index 714e552d..0c59ef8c 100644 --- a/dev/ZBA/Sources/HEL/AMD64/BootATA.cxx +++ b/dev/ZBA/Sources/HEL/AMD64/BootATA.cxx @@ -120,7 +120,7 @@ Void boot_ata_read(UInt64 Lba, UInt16 IO, UInt8 Master, CharacterTypeUTF8* Buf, Out8(IO + ATA_REG_HDDEVSEL, (Command) | (((Lba) >> 24) & 0x0F)); - Out8(IO + ATA_REG_SEC_COUNT0, 2); + Out8(IO + ATA_REG_SEC_COUNT0, ((Size + SectorSz) / SectorSz)); Out8(IO + ATA_REG_LBA0, (Lba) & 0xFF); Out8(IO + ATA_REG_LBA1, (Lba) >> 8); @@ -150,7 +150,7 @@ Void boot_ata_write(UInt64 Lba, UInt16 IO, UInt8 Master, CharacterTypeUTF8* Buf, Out8(IO + ATA_REG_HDDEVSEL, (Command) | (((Lba) >> 24) & 0x0F)); - Out8(IO + ATA_REG_SEC_COUNT0, 2); + Out8(IO + ATA_REG_SEC_COUNT0, ((Size + (SectorSz)) / SectorSz)); Out8(IO + ATA_REG_LBA0, (Lba) & 0xFF); Out8(IO + ATA_REG_LBA1, (Lba) >> 8); diff --git a/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx b/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx index cd18d34a..9cdaf603 100644 --- a/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx +++ b/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx @@ -253,9 +253,6 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, // If we succeed in reading the blob, then execute it. // ------------------------------------------ // - handoverHdrPtr->f_HardwareTables.f_ImagePtr = readerKernel.Blob(); - handoverHdrPtr->f_HardwareTables.f_ImageSz = readerKernel.Size(); - if (readerKernel.Blob()) { loader = new Boot::BThread(readerKernel.Blob()); diff --git a/dev/ZKA/FSKit/NewFS.hxx b/dev/ZKA/FSKit/NewFS.hxx index 53e1470e..4912c96e 100644 --- a/dev/ZKA/FSKit/NewFS.hxx +++ b/dev/ZKA/FSKit/NewFS.hxx @@ -31,6 +31,7 @@ default. #define kNewFSNodeNameLen (256) #define kNewFSSectorSz (512) +#define kNewFSForkSz (8192) #define kNewFSIdentLen (8) #define kNewFSIdent " NewFS" diff --git a/dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx b/dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx index cf739cb8..74869dc3 100644 --- a/dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx +++ b/dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx @@ -123,8 +123,7 @@ 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, 2); + Out8(IO + ATA_REG_SEC_COUNT0, ((Size + SectorSz) / SectorSz)); Out8(IO + ATA_REG_LBA0, (Lba) & 0xFF); Out8(IO + ATA_REG_LBA1, (Lba) >> 8); @@ -154,10 +153,9 @@ Void drv_std_write(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf, SizeT SectorS drv_std_wait_io(IO); drv_std_select(IO); - /// Compute sector count. Out8(IO + ATA_REG_HDDEVSEL, (Command) | (((Lba) >> 24) & 0x0F)); - Out8(IO + ATA_REG_SEC_COUNT0, 2); + Out8(IO + ATA_REG_SEC_COUNT0, ((Size + (SectorSz)) / SectorSz)); Out8(IO + ATA_REG_LBA0, (Lba) & 0xFF); Out8(IO + ATA_REG_LBA1, (Lba) >> 8); diff --git a/dev/ZKA/KernelKit/DriveManager.hxx b/dev/ZKA/KernelKit/DriveManager.hxx index 6df3d3b0..04a0ded5 100644 --- a/dev/ZKA/KernelKit/DriveManager.hxx +++ b/dev/ZKA/KernelKit/DriveManager.hxx @@ -20,6 +20,8 @@ #define kDriveInvalidID (-1) #define kDriveNameLen (32) +#define drv_get_sector_count(SIZE, SECTOR_SZ) (((SIZE) + (SECTOR_SZ)) / (SECTOR_SZ)) + namespace Kernel { enum diff --git a/dev/ZKA/KernelKit/PE.hxx b/dev/ZKA/KernelKit/PE.hxx index d17bf840..bbf9f8d4 100644 --- a/dev/ZKA/KernelKit/PE.hxx +++ b/dev/ZKA/KernelKit/PE.hxx @@ -132,6 +132,7 @@ typedef struct LDR_IMAGE_HEADER { enum { eUserSection = 0x00000020, + cPEResourceId = 0xFFaadd00, }; #endif /* ifndef __KERNELKIT_INC_PE_HXX__ */ diff --git a/dev/ZKA/Sources/DLLMain.cxx b/dev/ZKA/Sources/DLLMain.cxx index 997fed52..3e62bc54 100644 --- a/dev/ZKA/Sources/DLLMain.cxx +++ b/dev/ZKA/Sources/DLLMain.cxx @@ -7,6 +7,7 @@ ------------------------------------------- */ +#include <KernelKit/PE.hxx> #include <ArchKit/ArchKit.hxx> #include <CompilerKit/Detail.hxx> #include <FirmwareKit/Handover.hxx> @@ -100,8 +101,6 @@ namespace Kernel::Detail theFork.CatalogName, Kernel::rt_string_len(catalogDir->Name)); - delete catalogDir; - theFork.DataSize = kNewFSForkSize; theFork.ResourceId = 0; theFork.ResourceKind = Kernel::kNewFSRsrcForkKind; @@ -119,22 +118,20 @@ namespace Kernel::Detail const Kernel::SizeT metadataSz = kNewFSSectorSz; - auto catalogSystem = fNewFS->GetParser()->GetCatalog(cDirStr[dirIndx]); - - fNewFS->GetParser()->CreateFork(catalogSystem, theFork); + fNewFS->GetParser()->CreateFork(catalogDir, theFork); fNewFS->GetParser()->WriteCatalog( - catalogSystem, true, (Kernel::VoidPtr)(metadataFolder.CData()), + catalogDir, true, (Kernel::VoidPtr)(metadataFolder.CData()), metadataSz, cFolderInfo); - delete catalogSystem; + delete catalogDir; } } NFS_CATALOG_STRUCT* catalogDisk = - this->fNewFS->GetParser()->GetCatalog("\\System\\newoskrnl.dll"); + this->fNewFS->GetParser()->GetCatalog("\\System\\syspage.sys"); - const Kernel::Char* cSrcName = "KERNEL_EXEC"; + const Kernel::Char* cSrcName = "8K_SYS_PAGE_KERNEL"; if (catalogDisk) { @@ -143,7 +140,7 @@ namespace Kernel::Detail else { catalogDisk = - (NFS_CATALOG_STRUCT*)this->Leak()->CreateAlias("\\System\\newoskrnl.dll"); + (NFS_CATALOG_STRUCT*)this->Leak()->CreateAlias("\\System\\syspage.sys"); NFS_FORK_STRUCT theDiskFork{0}; @@ -154,16 +151,14 @@ namespace Kernel::Detail theDiskFork.CatalogName, Kernel::rt_string_len(catalogDisk->Name)); - theDiskFork.DataSize = kHandoverHeader->f_HardwareTables.f_ImageSz; - theDiskFork.ResourceId = Kernel::kPefKindExec | 0xFFFF000; + Kernel::Size sz_hdr = kNewFSForkSz; + + theDiskFork.DataSize =sz_hdr; + theDiskFork.ResourceId = kNewFSCatalogKindExecutable | kNewFSCatalogKindPage; theDiskFork.ResourceKind = Kernel::kNewFSDataForkKind; theDiskFork.Kind = Kernel::kNewFSDataForkKind; fNewFS->GetParser()->CreateFork(catalogDisk, theDiskFork); - fNewFS->GetParser()->WriteCatalog(catalogDisk, - false, - kHandoverHeader->f_HardwareTables.f_ImagePtr, - kHandoverHeader->f_HardwareTables.f_ImageSz, cSrcName); delete catalogDisk; } diff --git a/dev/ZKA/Sources/FS/NewFS.cxx b/dev/ZKA/Sources/FS/NewFS.cxx index e55939f7..cdf9d6a4 100644 --- a/dev/ZKA/Sources/FS/NewFS.cxx +++ b/dev/ZKA/Sources/FS/NewFS.cxx @@ -62,7 +62,8 @@ STATIC MountpointInterface sMountpointInterface; _Output NFS_FORK_STRUCT* NewFSParser::CreateFork(_Input NFS_CATALOG_STRUCT* catalog, _Input NFS_FORK_STRUCT& theFork) { - if (catalog && theFork.ForkName[0] != 0) + if (catalog && theFork.ForkName[0] != 0 && + theFork.DataSize <= kNewFSForkSz) { Lba lba = (theFork.Kind == kNewFSDataForkKind) ? catalog->DataFork : catalog->ResourceFork; @@ -641,6 +642,7 @@ bool NewFSParser::WriteCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, Bool : catalog->ResourceFork; NFS_FORK_STRUCT* forkDataIn = new NFS_FORK_STRUCT(); + NFS_FORK_STRUCT prevFork{}; // sanity check of the fork position as the condition to run the loop. while (startFork >= kNewFSCatalogStartAddress) @@ -666,25 +668,6 @@ bool NewFSParser::WriteCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, Bool StringBuilder::Equals(forkDataIn->ForkName, forkName) && StringBuilder::Equals(forkDataIn->CatalogName, catalog->Name)) { - if (forkDataIn->DataSize < sizeOfData && - forkDataIn->DataSize < 1) - { - startFork = forkDataIn->NextSibling; - continue; - } - - drive.fPacket.fPacketContent = data; - drive.fPacket.fPacketSize = sizeOfData; - drive.fPacket.fLba = forkDataIn->DataOffset; - - kcout << "newoskrnl: data offset: " << hex_number(forkDataIn->DataOffset) << endl; - - drive.fOutput(&drive.fPacket); - - return true; - } - else - { // ===================================================== // // Store size of blob now. // ===================================================== // @@ -692,13 +675,13 @@ bool NewFSParser::WriteCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, Bool if (forkDataIn->DataSize < sizeOfData && forkDataIn->DataSize < 1) { - startFork = forkDataIn->NextSibling + sizeof(NFS_FORK_STRUCT); + startFork = forkDataIn->NextSibling; continue; } - forkDataIn->Flags = kNewFSFlagCreated; + forkDataIn->Flags = kNewFSFlagCreated; forkDataIn->DataOffset = startFork + sizeof(NFS_FORK_STRUCT); - forkDataIn->DataSize = sizeOfData; + forkDataIn->DataSize = sizeOfData; drive.fPacket.fPacketContent = data; drive.fPacket.fPacketSize = sizeOfData; @@ -721,6 +704,10 @@ bool NewFSParser::WriteCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, Bool return true; } + // stumble upon a fork, store it. + + prevFork = *forkDataIn; + startFork = forkDataIn->NextSibling + forkDataIn->DataSize; } |
