summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-08-26 05:02:55 +0200
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-08-26 05:02:55 +0200
commit9076aff05349093c2c6280287ee3257d9c07c014 (patch)
tree9c415985dabaa37c7effc93306ca51e90c496e17 /dev
parentff94ce367f7f23e3a78f157f9420c480a4d7f9aa (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.cxx4
-rw-r--r--dev/ZBA/Sources/HEL/AMD64/BootMain.cxx3
-rw-r--r--dev/ZKA/FSKit/NewFS.hxx1
-rw-r--r--dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx6
-rw-r--r--dev/ZKA/KernelKit/DriveManager.hxx2
-rw-r--r--dev/ZKA/KernelKit/PE.hxx1
-rw-r--r--dev/ZKA/Sources/DLLMain.cxx27
-rw-r--r--dev/ZKA/Sources/FS/NewFS.cxx33
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;
}