diff options
Diffstat (limited to 'Private/NewBoot/Source')
| -rw-r--r-- | Private/NewBoot/Source/BootMain.cxx | 38 | ||||
| -rw-r--r-- | Private/NewBoot/Source/HEL/AMD64/AMD64-AHCI.cxx | 2 | ||||
| -rw-r--r-- | Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx | 49 | ||||
| -rw-r--r-- | Private/NewBoot/Source/makefile | 2 |
4 files changed, 39 insertions, 52 deletions
diff --git a/Private/NewBoot/Source/BootMain.cxx b/Private/NewBoot/Source/BootMain.cxx index 829c98ad..650196f6 100644 --- a/Private/NewBoot/Source/BootMain.cxx +++ b/Private/NewBoot/Source/BootMain.cxx @@ -35,9 +35,8 @@ EFI_EXTERN_C EFI_API Int EfiMain(EfiHandlePtr ImageHandle, /// Splash screen stuff - writer.Write(L"MahroussLogic (R) HCoreLdr: "); - - writer.Write(BVersionString::Shared()).Write(L"\r\n"); + writer.Write(L"MahroussLogic (R) HCoreLdr: ") + .Write(BVersionString::Shared()).Write(L"\r\n"); const char strDate[] = __DATE__; @@ -98,34 +97,11 @@ EFI_EXTERN_C EFI_API Int EfiMain(EfiHandlePtr ImageHandle, .Write(ptrHdr->mNumberOfSections * sizeof(ExecSectionHeader)) .Write(L"\r\n"); - volatile ALIGN(kPTEAlign) ExecSectionHeader* blobKrnl = - (ExecSectionHeader*)(reinterpret_cast<DosHeaderPtr>(blob) + - reinterpret_cast<DosHeaderPtr>(blob)->eLfanew + - ptrHdr->mSizeOfOptionalHeader + - (sizeof(ExecHeader) + - sizeof(ExecOptionalHeader) + sizeof(UInt32))); - - while (blobKrnl->mCharacteristics != 0x00000020) { - blobKrnl = blobKrnl + sizeof(ExecSectionHeader); - } - - writer.Write(L"HCoreLdr: Exec Timestamp: ") - .Write(ptrHdr->mTimeDateStamp) - .Write(L"\r\n"); + ExecSectionHeader* blobKrnl = + (ExecSectionHeader*)(&optHdr + sizeof(ExecOptionalHeader) + sizeof(UInt32)); for (size_t i = 0; i < ptrHdr->mNumberOfSections; i++) { - writer.Write(L"HCoreLdr: Virtual-Size: ") - .Write(blobKrnl[i].mVirtualSize) - .Write(L"\r\n"); - writer.Write(L"HCoreLdr: Virtual-Address: ") - .Write(blobKrnl[i].mVirtualAddress) - .Write(L"\r\n"); - writer.Write(L"HCoreLdr: Raw-Address: ") - .Write(blobKrnl[i].mPointerToRawData) - .Write(L"\r\n"); - writer.Write(L"HCoreLdr: Raw-Size: ") - .Write(blobKrnl[i].mSizeOfRawData) - .Write(L"\r\n"); + // TODO: parse PE information here. } UInt32 MapKey = 0; @@ -143,7 +119,7 @@ EFI_EXTERN_C EFI_API Int EfiMain(EfiHandlePtr ImageHandle, /**** * - * LOAD KERNEL CODE + * Load kernel into memory. * */ @@ -158,7 +134,7 @@ EFI_EXTERN_C EFI_API Int EfiMain(EfiHandlePtr ImageHandle, /**** * - * GET MEMORY MAP OF COMPUTER. + * Get machine memory map. * */ diff --git a/Private/NewBoot/Source/HEL/AMD64/AMD64-AHCI.cxx b/Private/NewBoot/Source/HEL/AMD64/AMD64-AHCI.cxx index dbb0bde4..be7010a8 100644 --- a/Private/NewBoot/Source/HEL/AMD64/AMD64-AHCI.cxx +++ b/Private/NewBoot/Source/HEL/AMD64/AMD64-AHCI.cxx @@ -15,4 +15,4 @@ * */ -#include <BootKit/Arch/AHCI.hxx> +#include <BootKit/Arch/SATA.hxx> diff --git a/Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx b/Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx index 551b0200..145976c1 100644 --- a/Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx +++ b/Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx @@ -26,7 +26,9 @@ static Boolean kATADetected = false; static Int32 kATADeviceType = kATADeviceCount; static CharacterType kATAData[kATADataLen] = {0}; -STATIC Boolean ATAWaitForIO(UInt16 IO) { +Boolean boot_ata_detected(Void); + +STATIC Boolean boot_ata_wait_io(UInt16 IO) { for (int i = 0; i < 4; i++) In8(IO + ATA_REG_STATUS); ATAWaitForIO_Retry: @@ -51,9 +53,9 @@ Void ATASelect(UInt16 Bus) { Out8(Bus + ATA_REG_HDDEVSEL, ATA_SECONDARY_SEL); } -Boolean ATAInitDriver(UInt16 Bus, UInt8 Drive, UInt16& OutBus, +Boolean boot_ata_init(UInt16 Bus, UInt8 Drive, UInt16& OutBus, UInt8& OutMaster) { - if (IsATADetected()) return false; + if (boot_ata_detected()) return false; BTextWriter writer; @@ -135,7 +137,7 @@ ATAInit_Retry: return true; } -Void ATAReadLba(UInt32 Lba, UInt8 IO, UInt8 Master, CharacterType* Buf, +Void boot_ata_read(UInt32 Lba, UInt8 IO, UInt8 Master, CharacterType* Buf, SizeT Offset) { UInt8 Command = (Master ? 0xE0 : 0xF0); @@ -150,12 +152,12 @@ Void ATAReadLba(UInt32 Lba, UInt8 IO, UInt8 Master, CharacterType* Buf, Out8(IO + ATA_REG_COMMAND, ATA_CMD_READ_PIO); - for (SizeT i = 0; i < 256; ++i) { - Buf[Offset + i] = In16(IO + ATA_REG_DATA); + for (SizeT IndexOff = 0; IndexOff < 256; ++IndexOff) { + Buf[Offset + IndexOff] = In16(IO + ATA_REG_DATA); } } -Void ATAWriteLba(UInt32 Lba, UInt8 IO, UInt8 Master, wchar_t* Buf, +Void boot_ata_write(UInt32 Lba, UInt8 IO, UInt8 Master, CharacterType* Buf, SizeT Offset) { UInt8 Command = (Master ? 0xE0 : 0xF0); @@ -170,13 +172,13 @@ Void ATAWriteLba(UInt32 Lba, UInt8 IO, UInt8 Master, wchar_t* Buf, Out8(IO + ATA_REG_COMMAND, ATA_CMD_WRITE_PIO); - for (SizeT i = 0; i < 256; ++i) { - Out16(IO + ATA_REG_DATA, Buf[Offset + i]); + for (SizeT IndexOff = 0; IndexOff < 256; ++IndexOff) { + Out16(IO + ATA_REG_DATA, Buf[Offset + IndexOff]); } } /// @check is ATA detected? -Boolean IsATADetected(Void) { return kATADetected; } +Boolean boot_ata_detected(Void) { return kATADetected; } /*** * @@ -191,15 +193,15 @@ Boolean IsATADetected(Void) { return kATADetected; } * @param void none. */ BDeviceATA::BDeviceATA() noexcept { - if (IsATADetected()) return; + if (boot_ata_detected()) return; - if (ATAInitDriver(ATA_PRIMARY_IO, true, this->Leak().mBus, + if (boot_ata_init(ATA_PRIMARY_IO, true, this->Leak().mBus, this->Leak().mMaster) || - ATAInitDriver(ATA_PRIMARY_IO, false, this->Leak().mBus, + boot_ata_init(ATA_PRIMARY_IO, false, this->Leak().mBus, this->Leak().mMaster) || - ATAInitDriver(ATA_SECONDARY_IO, true, this->Leak().mBus, + boot_ata_init(ATA_SECONDARY_IO, true, this->Leak().mBus, this->Leak().mMaster) || - ATAInitDriver(ATA_SECONDARY_IO, false, this->Leak().mBus, + boot_ata_init(ATA_SECONDARY_IO, false, this->Leak().mBus, this->Leak().mMaster)) { kATADetected = true; @@ -207,6 +209,10 @@ BDeviceATA::BDeviceATA() noexcept { writer.Write(L"HCoreLdr: Driver: OnLine.\r\n"); } } +/** + * @brief Is ATA detected? +*/ +BDeviceATA::operator bool() { return boot_ata_detected(); } /** @brief Read Buf from disk @@ -214,7 +220,7 @@ BDeviceATA::BDeviceATA() noexcept { @param Buf buffer */ BDeviceATA& BDeviceATA::Read(CharacterType* Buf, const SizeT& SectorSz) { - if (!IsATADetected()) { + if (!boot_ata_detected()) { Leak().mErr = true; return *this; } @@ -224,8 +230,11 @@ BDeviceATA& BDeviceATA::Read(CharacterType* Buf, const SizeT& SectorSz) { if (!Buf || SectorSz < 1) return *this; for (SizeT i = 0UL; i < SectorSz; ++i) { - ATAReadLba(this->Leak().mBase + i, this->Leak().mBus, this->Leak().mMaster, + boot_ata_read(this->Leak().mBase + i, + this->Leak().mBus, this->Leak().mMaster, Buf, i); + + boot_ata_wait_io(this->Leak().mBus); } return *this; @@ -237,7 +246,7 @@ BDeviceATA& BDeviceATA::Read(CharacterType* Buf, const SizeT& SectorSz) { @param Buf buffer */ BDeviceATA& BDeviceATA::Write(CharacterType* Buf, const SizeT& SectorSz) { - if (!IsATADetected()) { + if (!boot_ata_detected()) { Leak().mErr = true; return *this; } @@ -249,10 +258,12 @@ BDeviceATA& BDeviceATA::Write(CharacterType* Buf, const SizeT& SectorSz) { SizeT Off = 0UL; for (SizeT i = 0UL; i < SectorSz; ++i) { - ATAWriteLba(this->Leak().mBase + i, this->Leak().mBus, this->Leak().mMaster, + boot_ata_write(this->Leak().mBase + i, this->Leak().mBus, this->Leak().mMaster, Buf, Off); Off += kATASectorSz; + + boot_ata_wait_io(this->Leak().mBus); } return *this; diff --git a/Private/NewBoot/Source/makefile b/Private/NewBoot/Source/makefile index 5e25496b..511a4894 100644 --- a/Private/NewBoot/Source/makefile +++ b/Private/NewBoot/Source/makefile @@ -35,7 +35,7 @@ bootloader-amd64: .PHONY: run-efi-amd64 run-efi-amd64: - $(EMU) -net none -smp 2 -m 4G -M pc -bios OVMF.fd -drive file=fat:rw:CDROM,index=1,format=raw -serial stdio + $(EMU) -net none -smp 2 -m 4G -M q35 -bios OVMF.fd -drive file=fat:rw:CDROM,index=1,format=raw -serial stdio .PHONY: download-edk download-edk: |
