summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-04-26 10:20:01 +0200
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-04-26 10:20:01 +0200
commitba80f513dd5cd82feae0b8f794b3367caf9ce8bb (patch)
tree7c41759e590047c60cec4c571f3e3b3819cb5797
parent4afe2bd4c6e95f2ca4a5b9bdacf51ef5f91fd0d7 (diff)
MHR-16: a lot of fixes. Regarding the disk driver and the filesystem
class BDiskFormatFactory. Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
-rw-r--r--Private/Builtins/ATA/ATA.hxx3
-rw-r--r--Private/HALKit/AMD64/Storage/ATA-PIO.cxx6
-rw-r--r--Private/NewBoot/BootKit/BootKit.hxx110
-rw-r--r--Private/NewBoot/BootKit/HW/ATA.hxx1
-rw-r--r--Private/NewBoot/Source/HEL/AMD64/BootATA.cxx67
-rw-r--r--Private/NewBoot/Source/HEL/AMD64/BootMain.cxx13
-rw-r--r--Private/NewBoot/Source/makefile2
7 files changed, 110 insertions, 92 deletions
diff --git a/Private/Builtins/ATA/ATA.hxx b/Private/Builtins/ATA/ATA.hxx
index 66856d8a..a2ce79ba 100644
--- a/Private/Builtins/ATA/ATA.hxx
+++ b/Private/Builtins/ATA/ATA.hxx
@@ -102,7 +102,8 @@
#define ATA_PRIMARY 0x00
#define ATA_SECONDARY 0x01
-#define ATA_CYL_LOW 4
+#define ATA_CYL_LOW 3
+#define ATA_CYL_MID 4
#define ATA_CYL_HIGH 5
///! IO Direction
diff --git a/Private/HALKit/AMD64/Storage/ATA-PIO.cxx b/Private/HALKit/AMD64/Storage/ATA-PIO.cxx
index f2ae01a4..beb113d3 100644
--- a/Private/HALKit/AMD64/Storage/ATA-PIO.cxx
+++ b/Private/HALKit/AMD64/Storage/ATA-PIO.cxx
@@ -134,12 +134,13 @@ Void drv_std_read(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf,
SizeT SectorSz, SizeT Size) {
UInt8 Command = ((!Master )? 0xE0 : 0xF0);
- Out8(IO + ATA_REG_HDDEVSEL, (Command) | (((Lba) >> 24) & 0xF));
+ Out8(IO + ATA_REG_HDDEVSEL, (Command) | (((Lba) >> 24) & 0x0F));
Out8(IO + ATA_REG_SEC_COUNT0, 1);
Out8(IO + ATA_REG_LBA0, (Lba));
Out8(IO + ATA_REG_LBA1, (Lba) >> 8);
Out8(IO + ATA_REG_LBA2, (Lba) >> 16);
+ Out8(IO + ATA_REG_LBA4, (Lba) >> 24);
Out8(IO + ATA_REG_COMMAND, ATA_CMD_READ_PIO);
@@ -156,12 +157,13 @@ Void drv_std_write(UInt64 Lba, UInt16 IO, UInt8 Master, Char* Buf,
SizeT SectorSz, SizeT Size) {
UInt8 Command = ((!Master) ? 0xE0 : 0xF0);
- Out8(IO + ATA_REG_HDDEVSEL, (Command) | (((Lba) >> 24) & 0xF));
+ Out8(IO + ATA_REG_HDDEVSEL, (Command) | (((Lba) >> 24) & 0x0F));
Out8(IO + ATA_REG_SEC_COUNT0, 1);
Out8(IO + ATA_REG_LBA0, (Lba));
Out8(IO + ATA_REG_LBA1, (Lba) >> 8);
Out8(IO + ATA_REG_LBA2, (Lba) >> 16);
+ Out8(IO + ATA_REG_LBA4, (Lba) >> 24);
Out8(IO + ATA_REG_COMMAND, ATA_CMD_WRITE_PIO);
diff --git a/Private/NewBoot/BootKit/BootKit.hxx b/Private/NewBoot/BootKit/BootKit.hxx
index ffa3af15..b3a81160 100644
--- a/Private/NewBoot/BootKit/BootKit.hxx
+++ b/Private/NewBoot/BootKit/BootKit.hxx
@@ -214,14 +214,25 @@ public:
Boolean Format(const char* partName, BFileDescriptor* fileBlobs, SizeT blobCount);
operator bool() noexcept {
- fDiskDev.Leak().mBase = (kNewFSAddressAsLba / BootDev::kSectorSize);
+ fDiskDev.Leak().mBase = (kNewFSAddressAsLba);
fDiskDev.Leak().mSize = BootDev::kSectorSize;
Char buf[BootDev::kSectorSize] = { 0 };
fDiskDev.Read(buf, BootDev::kSectorSize);
- return buf[0] == kNewFSIdent[0];
+ NewPartitionBlock* blockPart = reinterpret_cast<NewPartitionBlock*>(buf);
+
+ for (SizeT indexMag = 0UL; indexMag < kNewFSIdentLen; ++indexMag) {
+ if (blockPart->Ident[indexMag] != kNewFSIdent[indexMag])
+ return false;
+ }
+
+ BTextWriter writer;
+
+ writer.Write(L"Disk Partition: ").Write(blockPart->PartitionName).Write(L" is okay.\r\n");
+
+ return true;
}
private:
@@ -231,43 +242,55 @@ private:
if (sectorSz != BootDev::kSectorSize) return false;
BFileDescriptor* blob = fileBlobs;
- Lba startLba = partBlock.FreeCatalog;
-
+ Lba startLba = partBlock.StartCatalog;
BTextWriter writer;
+
while (blob) {
- NewCatalog catalogKind{ 0 };
+ NewCatalog* catalogKind = new NewCatalog();
+ memset(catalogKind, 0, sizeof(NewCatalog));
/// Fill catalog kind.
- catalogKind.Kind = blob->fKind;
+ catalogKind->Kind = blob->fKind;
/// Allocate fork for blob.
- catalogKind.FirstFork = (startLba + sizeof(NewCatalog));
- catalogKind.LastFork = catalogKind.FirstFork;
+ catalogKind->FirstFork = (startLba + sizeof(NewCatalog));
+ catalogKind->LastFork = catalogKind->FirstFork;
- NewFork forkKind{ 0 };
+ NewFork* forkKind = new NewFork();
+ memset(forkKind, 0, sizeof(NewFork));
- memcpy(forkKind.Name, blob->fForkName, strlen(blob->fForkName));
- forkKind.Kind = (forkKind.Name[0] == kNewFSDataFork[0]) ? kNewFSDataForkKind : kNewFSRsrcForkKind;
- forkKind.Flags = kNewFSFlagCreated;
+ memcpy(forkKind->Name, blob->fForkName, strlen(blob->fForkName));
+ forkKind->Kind = (forkKind->Name[0] == kNewFSDataFork[0]) ? kNewFSDataForkKind : kNewFSRsrcForkKind;
+ forkKind->Flags = kNewFSFlagCreated;
/// We don't know.
- forkKind.ResourceFlags = 0;
- forkKind.ResourceId = 0;
- forkKind.ResourceKind = 0;
+ forkKind->ResourceFlags = 0;
+ forkKind->ResourceId = 0;
+ forkKind->ResourceKind = 0;
/// We're the only fork here.
- forkKind.NextSibling = catalogKind.FirstFork;
- forkKind.PreviousSibling = catalogKind.FirstFork;
+ forkKind->NextSibling = catalogKind->FirstFork;
+ forkKind->PreviousSibling = catalogKind->FirstFork;
- forkKind.DataOffset = (startLba + sizeof(NewCatalog) + sizeof(NewFork));
- forkKind.DataSize = blob->fBlobSz;
+ forkKind->DataOffset = (startLba + sizeof(NewCatalog) + sizeof(NewFork));
+ forkKind->DataSize = blob->fBlobSz;
- Lba lbaStart = forkKind.DataOffset;
+ Lba lbaStart = forkKind->DataOffset;
SizeT cur = 0UL;
- while (cur < forkKind.DataSize) {
+ writer.Write((catalogKind->Kind == kNewFSCatalogKindFile) ? L"New Boot: Write-File: " :
+ L"New Boot: Write-Directory: " ).Write(blob->fFileName).Write(L"\r\n");
+
+ /// Set disk cursor here.
+
+ fDiskDev.Leak().mBase = startLba + sizeof(NewCatalog);
+ fDiskDev.Leak().mSize = sizeof(NewFork);
+
+ fDiskDev.Write((Char*)forkKind, sizeof(NewFork));
+
+ while (cur < forkKind->DataSize) {
this->fDiskDev.Leak().mSize = BootDev::kSectorSize;
- this->fDiskDev.Leak().mBase = forkKind.DataOffset / BootDev::kSectorSize;
+ this->fDiskDev.Leak().mBase = (forkKind->DataOffset + cur);
this->fDiskDev.Write((Char*)(blob->fBlob) + cur, BootDev::kSectorSize);
@@ -275,48 +298,40 @@ private:
lbaStart += BootDev::kSectorSize;
}
- writer.Write((catalogKind.Kind == kNewFSCatalogKindFile) ? L"New Boot: Write-File: " :
- L"New Boot: Write-Directory: " ).Write(blob->fFileName).Write(L"\r\n");
-
- /// Set disk cursor here.
-
- fDiskDev.Leak().mBase = startLba + sizeof(NewCatalog) / sectorSz;
- fDiskDev.Leak().mSize = sizeof(NewFork);
-
- fDiskDev.Write((Char*)&forkKind, 1);
/// Fork is done.
- catalogKind.Kind = blob->fKind;
- catalogKind.Flags |= kNewFSFlagCreated;
+ catalogKind->Kind = blob->fKind;
+ catalogKind->Flags |= kNewFSFlagCreated;
Lba catalogLba = (sizeof(NewCatalog) - startLba);
//// Now write catalog as well..
- catalogKind.PrevSibling = startLba;
- catalogKind.NextSibling = (sizeof(NewCatalog) + blob->fBlobSz);
+ catalogKind->PrevSibling = startLba;
+ catalogKind->NextSibling = (sizeof(NewCatalog) + blob->fBlobSz);
/// this mime only applies to file.
- if (catalogKind.Kind == kNewFSCatalogKindFile) {
- memcpy(catalogKind.Mime, kBKBootFileMime, strlen(kBKBootFileMime));
+ if (catalogKind->Kind == kNewFSCatalogKindFile) {
+ memcpy(catalogKind->Mime, kBKBootFileMime, strlen(kBKBootFileMime));
} else {
- memcpy(catalogKind.Mime, kBKBootDirMime, strlen(kBKBootDirMime));
+ memcpy(catalogKind->Mime, kBKBootDirMime, strlen(kBKBootDirMime));
}
- memcpy(catalogKind.Name, blob->fFileName, strlen(blob->fFileName));
+ memcpy(catalogKind->Name, blob->fFileName, strlen(blob->fFileName));
- fDiskDev.Leak().mBase = startLba / sectorSz;
+ fDiskDev.Leak().mBase = startLba;
fDiskDev.Leak().mSize = sizeof(NewCatalog);
- fDiskDev.Write((Char*)&catalogKind, sectorSz);
+ fDiskDev.Write((Char*)catalogKind, sizeof(NewCatalog));
- startLba += (sizeof(NewCatalog) + blob->fBlobSz);
+ startLba += (sizeof(NewCatalog) + sizeof(NewFork) + blob->fBlobSz);
--partBlock.FreeCatalog;
--partBlock.FreeSectors;
- ++partBlock.CatalogCount;
+ delete forkKind;
+ delete catalogKind;
blob = blob->fNext;
}
@@ -346,22 +361,23 @@ inline Boolean BDiskFormatFactory<BootDev>::Format(const char* partName,
NewPartitionBlock* partBlock = reinterpret_cast<NewPartitionBlock*>(buf);
- memcpy(partBlock->Ident, kNewFSIdent, kNewFSIdentLen-1);
+ memcpy(partBlock->Ident, kNewFSIdent, kNewFSIdentLen - 1);
memcpy(partBlock->PartitionName, partName, strlen(partName));
/// @note A catalog roughly equal to a sector.
- partBlock->CatalogCount = 0UL;
+ partBlock->CatalogCount = blobCount;
partBlock->Kind = kNewFSHardDrive;
partBlock->SectorSize = sectorSz;
partBlock->FreeCatalog = fDiskDev.GetSectorsCount() - partBlock->CatalogCount;
partBlock->SectorCount = fDiskDev.GetSectorsCount();
partBlock->FreeSectors = fDiskDev.GetSectorsCount() - partBlock->CatalogCount;
partBlock->StartCatalog = kNewFSCatalogStartAddress;
+ partBlock->DiskSize = fDiskDev.GetDiskSize();
if (this->WriteContent(fileBlobs, blobCount, sectorSz, *partBlock)) {
- fDiskDev.Leak().mBase = (kNewFSAddressAsLba / sectorSz);
- fDiskDev.Leak().mSize = BootDev::kSectorSize;
+ fDiskDev.Leak().mBase = (kNewFSAddressAsLba);
+ fDiskDev.Leak().mSize = sectorSz;
fDiskDev.Write(buf, sectorSz);
diff --git a/Private/NewBoot/BootKit/HW/ATA.hxx b/Private/NewBoot/BootKit/HW/ATA.hxx
index 4b96e9fa..5bdcec56 100644
--- a/Private/NewBoot/BootKit/HW/ATA.hxx
+++ b/Private/NewBoot/BootKit/HW/ATA.hxx
@@ -37,6 +37,7 @@ class BootDeviceATA final : public Device {
operator bool();
SizeT GetSectorsCount() noexcept;
+ SizeT GetDiskSize() noexcept;
BootDeviceATA& Read(Char* Buf, const SizeT& SecCount) override;
BootDeviceATA& Write(Char* Buf, const SizeT& SecCount) override;
diff --git a/Private/NewBoot/Source/HEL/AMD64/BootATA.cxx b/Private/NewBoot/Source/HEL/AMD64/BootATA.cxx
index bb634fbf..41ea04ac 100644
--- a/Private/NewBoot/Source/HEL/AMD64/BootATA.cxx
+++ b/Private/NewBoot/Source/HEL/AMD64/BootATA.cxx
@@ -88,44 +88,13 @@ ATAInit_Retry:
boot_ata_wait_io(IO);
for (SizeT indexData = 0ul; indexData < kATADataLen; ++indexData) {
- kATAData[indexData] = In16(IO + ATA_REG_DATA);
+ kATAData[indexData] = In8(IO + ATA_REG_DATA);
}
OutBus =
(Bus == ATA_PRIMARY_IO) ? BootDeviceATA::kPrimary : BootDeviceATA::kSecondary;
- OutMaster = (Bus == ATA_PRIMARY_IO) ? ATA_MASTER : ATA_SLAVE;
-
- Out8(Bus + ATA_REG_HDDEVSEL, 0xA0 | ATA_MASTER << 4);
-
- In8(Bus + ATA_REG_CONTROL);
- In8(Bus + ATA_REG_CONTROL);
- In8(Bus + ATA_REG_CONTROL);
- In8(Bus + ATA_REG_CONTROL);
-
- unsigned cl = In8(Bus + ATA_CYL_LOW); /* get the "signature bytes" */
- unsigned ch = In8(Bus + ATA_CYL_HIGH);
-
- /* differentiate ATA, ATAPI, SATA and SATAPI */
- if (cl == 0x14 && ch == 0xEB) {
- writer.Write(L"New Boot: PATAPI drive detected.\r\n");
- kATADeviceType = kATADevicePATA_PI;
- }
- if (cl == 0x69 && ch == 0x96) {
- writer.Write(L"New Boot: SATAPI drive detected.\r\n");
- kATADeviceType = kATADeviceSATA_PI;
- }
-
- if (cl == 0x0 && ch == 0x0) {
- writer.Write(L"New Boot: PATA drive detected.\r\n");
- kATADeviceType = kATADevicePATA;
- }
-
- if (cl == 0x3c && ch == 0xc3) {
- writer.Write(L"New Boot: SATA drive detected.\r\n");
- kATADeviceType = kATADeviceSATA;
- }
- Out8(IO + ATA_REG_CONTROL, 0x02);
+ OutMaster = (Bus == ATA_PRIMARY_IO) ? ATA_MASTER : ATA_SLAVE;
return true;
}
@@ -137,12 +106,13 @@ Void boot_ata_read(UInt64 Lba, UInt16 IO, UInt8 Master, CharacterTypeUTF8* Buf,
boot_ata_wait_io(IO);
boot_ata_select(IO);
- Out8(IO + ATA_REG_HDDEVSEL, (Command) | (((Lba) >> 24) & 0xF));
+ Out8(IO + ATA_REG_HDDEVSEL, (Command) | (((Lba) >> 24) & 0x0F));
Out8(IO + ATA_REG_SEC_COUNT0, 1);
Out8(IO + ATA_REG_LBA0, (Lba));
Out8(IO + ATA_REG_LBA1, (Lba) >> 8);
Out8(IO + ATA_REG_LBA2, (Lba) >> 16);
+ Out8(IO + ATA_REG_LBA4, (Lba) >> 24);
Out8(IO + ATA_REG_COMMAND, ATA_CMD_READ_PIO);
@@ -159,12 +129,13 @@ Void boot_ata_write(UInt64 Lba, UInt16 IO, UInt8 Master, CharacterTypeUTF8* Buf,
boot_ata_wait_io(IO);
boot_ata_select(IO);
- Out8(IO + ATA_REG_HDDEVSEL, (Command) | (((Lba) >> 24) & 0xF));
+ Out8(IO + ATA_REG_HDDEVSEL, (Command) | (((Lba) >> 24) & 0x0F));
Out8(IO + ATA_REG_SEC_COUNT0, 1);
Out8(IO + ATA_REG_LBA0, (Lba));
Out8(IO + ATA_REG_LBA1, (Lba) >> 8);
Out8(IO + ATA_REG_LBA2, (Lba) >> 16);
+ Out8(IO + ATA_REG_LBA4, (Lba) >> 24);
Out8(IO + ATA_REG_COMMAND, ATA_CMD_WRITE_PIO);
@@ -217,7 +188,9 @@ BootDeviceATA& BootDeviceATA::Read(CharacterTypeUTF8* Buf, const SizeT& SectorSz
if (!Buf || SectorSz < 1) return *this;
- boot_ata_read(this->Leak().mBase, this->Leak().mBus, this->Leak().mMaster,
+ auto lba = this->Leak().mBase / BootDeviceATA::kSectorSize;
+
+ boot_ata_read(lba, this->Leak().mBus, this->Leak().mMaster,
Buf, SectorSz, this->Leak().mSize);
return *this;
@@ -238,7 +211,9 @@ BootDeviceATA& BootDeviceATA::Write(CharacterTypeUTF8* Buf, const SizeT& SectorS
if (!Buf || SectorSz < 1) return *this;
- boot_ata_write(this->Leak().mBase, this->Leak().mBus, this->Leak().mMaster,
+ auto lba = this->Leak().mBase / BootDeviceATA::kSectorSize;
+
+ boot_ata_write(lba, this->Leak().mBus, this->Leak().mMaster,
Buf, SectorSz, this->Leak().mSize);
return *this;
@@ -256,3 +231,21 @@ BootDeviceATA::ATATrait& BootDeviceATA::Leak() { return mTrait; }
SizeT BootDeviceATA::GetSectorsCount() noexcept {
return kATAData[60] + kATAData[61];
}
+
+SizeT BootDeviceATA::GetDiskSize() noexcept {
+ Out8(this->Leak().mBus + ATA_REG_COMMAND, 0xF8);
+
+ boot_ata_wait_io(this->Leak().mBus);
+
+ SizeT result = 0;
+
+ result += In8(this->Leak().mBus + ATA_CYL_LOW);
+ result += In8(this->Leak().mBus + ATA_CYL_MID) << 8;
+ result += In8(this->Leak().mBus + ATA_CYL_HIGH) << 16;
+ result += In8(this->Leak().mBus + ATA_CYL_HIGH) << 24;
+
+ BTextWriter writer;
+ writer.Write(L"Disk-Size: ").Write(result).Write(L"\r\n");
+
+ return result;
+}
diff --git a/Private/NewBoot/Source/HEL/AMD64/BootMain.cxx b/Private/NewBoot/Source/HEL/AMD64/BootMain.cxx
index 5e9e2355..a928a41a 100644
--- a/Private/NewBoot/Source/HEL/AMD64/BootMain.cxx
+++ b/Private/NewBoot/Source/HEL/AMD64/BootMain.cxx
@@ -193,9 +193,11 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle,
memcpy(rootDesc.fFileName, "/", strlen("/"));
memcpy(rootDesc.fForkName, kNewFSResourceFork, strlen(kNewFSResourceFork));
- rootDesc.fBlobSz = strlen(kMachineModel " startup disk.");
+ rootDesc.fBlobSz = BootDeviceATA::kSectorSize;
rootDesc.fBlob = new Char[rootDesc.fBlobSz];
+ memset(rootDesc.fBlob, 0, rootDesc.fBlobSz);
+
memcpy(rootDesc.fBlob, kMachineModel " startup disk.",
strlen(kMachineModel " startup disk."));
@@ -207,12 +209,15 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle,
memcpy(bootDesc.fFileName, "/Boot", strlen("/Boot"));
memcpy(bootDesc.fForkName, kNewFSResourceFork, strlen(kNewFSResourceFork));
+
+ bootDesc.fBlobSz = BootDeviceATA::kSectorSize;
+ bootDesc.fBlob = new Char[rootDesc.fBlobSz];
+
+ memset(bootDesc.fBlob, 0, bootDesc.fBlobSz);
+
memcpy(bootDesc.fBlob, kMachineModel " startup folder.",
strlen(kMachineModel " startup folder."));
- bootDesc.fBlobSz = strlen(kMachineModel " startup folder.");
- bootDesc.fBlob = new Char[bootDesc.fBlobSz];
-
BDiskFormatFactory<BootDeviceATA>::BFileDescriptor kernelDesc{0};
kernelDesc.fKind = kNewFSCatalogKindFile;
diff --git a/Private/NewBoot/Source/makefile b/Private/NewBoot/Source/makefile
index 92128b02..4d8e1100 100644
--- a/Private/NewBoot/Source/makefile
+++ b/Private/NewBoot/Source/makefile
@@ -70,7 +70,7 @@ run-efi-amd64:
.PHONY: epm-img
epm-img:
- qemu-img create -f qcow2 $(IMG) 512M
+ qemu-img create -f qcow2 $(IMG) 1G
qemu-img create -f qcow2 $(IMG_2) 512M
.PHONY: download-edk