From 46ec13f846a25dffaac0525d45003e7ee2a101ff Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sun, 4 Feb 2024 12:52:03 +0100 Subject: Fix: EFI implementation of FileProtocol was buggy, fixed it. Signed-off-by: Amlal El Mahrouss --- Private/NewBoot/Source/Entrypoint.cxx | 8 ++++-- Private/NewBoot/Source/FileReader.cxx | 34 +++++++++++++++++--------- Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx | 3 ++- 3 files changed, 31 insertions(+), 14 deletions(-) (limited to 'Private/NewBoot/Source') diff --git a/Private/NewBoot/Source/Entrypoint.cxx b/Private/NewBoot/Source/Entrypoint.cxx index 4839ee1f..2b1e5c35 100644 --- a/Private/NewBoot/Source/Entrypoint.cxx +++ b/Private/NewBoot/Source/Entrypoint.cxx @@ -14,7 +14,7 @@ #include #include -STATIC Void DrawBackground() { +STATIC Void InitGfx() noexcept { EfiGUID gopGuid = EfiGUID(EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID); EfiGraphicsOutputProtocol* gop = nullptr; @@ -32,10 +32,14 @@ STATIC Void DrawBackground() { EFI_EXTERN_C Int EfiMain(EfiHandlePtr ImageHandle, EfiSystemTable* SystemTable) { InitEFI(SystemTable); - DrawBackground(); + InitGfx(); BTextWriter writer; + writer.WriteString(L"HCoreLdr: ") + .WriteString(L"Copyright Mahrouss-Logic Corporation.") + .WriteString(L"\r\n"); + writer.WriteString(L"HCoreLdr: Firmware: ") .WriteString(SystemTable->FirmwareVendor) .WriteString(L"\r\n"); diff --git a/Private/NewBoot/Source/FileReader.cxx b/Private/NewBoot/Source/FileReader.cxx index 3edacb5a..7bcccc10 100644 --- a/Private/NewBoot/Source/FileReader.cxx +++ b/Private/NewBoot/Source/FileReader.cxx @@ -16,6 +16,7 @@ #include #include "EFIKit/EFI.hxx" +#include "NewKit/Defines.hpp" //////////////////////////////////////////////////////////////////////////////////////////////////// // @@ -64,17 +65,13 @@ HCore::VoidPtr BFileReader::Fetch(EfiHandlePtr ImageHandle) { EfiLoadImageProtocol* img = nullptr; EfiGUID guidImg = EfiGUID(EFI_LOADED_IMAGE_PROTOCOL_GUID); - if (BS->OpenProtocol(ImageHandle, &guidImg, (void**)&img, ImageHandle, - nullptr, - EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL) != kEfiOk) { + if (BS->HandleProtocol(ImageHandle, &guidImg, (void**)&img) != kEfiOk) { mWriter.WriteString(L"HCoreLdr: Fetch-Protocol: No-Such-Protocol") .WriteString(L"\r\n"); this->mErrorCode = kNotSupported; } - if (BS->OpenProtocol(img->DeviceHandle, &guidEfp, (void**)&efp, ImageHandle, - nullptr, - EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL) != kEfiOk) { + if (BS->HandleProtocol(img->DeviceHandle, &guidEfp, (void**)&efp) != kEfiOk) { mWriter.WriteString(L"HCoreLdr: Fetch-Protocol: No-Such-Protocol") .WriteString(L"\r\n"); this->mErrorCode = kNotSupported; @@ -122,13 +119,28 @@ HCore::VoidPtr BFileReader::Fetch(EfiHandlePtr ImageHandle) { mWriter.WriteString(L"HCoreLdr: Fetch-Info: In-Progress...") .WriteString(L"\r\n"); - UInt8* blob = nullptr; + VoidPtr blob = nullptr; mWriter.WriteString(L"HCoreLdr: Fetch-Info: OK...").WriteString(L"\r\n"); - UInt64 sz = info.FileSize; + UInt32* sz = nullptr; - if (BS->AllocatePool(EfiBootServicesData, sz, (VoidPtr*)&blob) != kEfiOk) { + if (BS->AllocatePool(EfiLoaderData, sizeof(UInt32), (VoidPtr*)&sz) != + kEfiOk) { + mWriter + .WriteString( + L"HCoreLdr: Fetch: Failed to call AllocatePool " + L"correctly!") + .WriteString(L"\r\n"); + + kernelFile->Close(kernelFile); + + return nullptr; + } + + *sz = info.FileSize; + + if (BS->AllocatePool(EfiLoaderData, *sz, (VoidPtr*)&blob) != kEfiOk) { mWriter .WriteString( L"HCoreLdr: Fetch: Failed to call AllocatePool " @@ -140,12 +152,12 @@ HCore::VoidPtr BFileReader::Fetch(EfiHandlePtr ImageHandle) { return nullptr; } - BSetMem((CharacterType*)blob, 0, sz); + BSetMem((CharacterType*)blob, 0, *sz); mWriter.WriteString(L"HCoreLdr: Fetch-File: In-Progress...") .WriteString(L"\r\n"); - kernelFile->Read(kernelFile, &sz, blob); + kernelFile->Read(kernelFile, sz, blob); mWriter.WriteString(L"HCoreLdr: Fetch-File: OK").WriteString(L"\r\n"); diff --git a/Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx b/Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx index 46bec94c..2ef2189c 100644 --- a/Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx +++ b/Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx @@ -71,7 +71,8 @@ ATAInit_Retry: auto statRdy = In8(IO + ATA_REG_STATUS); if (statRdy & ATA_SR_ERR) { - writer.WriteString(L"HCoreLdr: Probe error.\r\n"); + writer.WriteString( + L"HCoreLdr: ATA: Hard-drive error, not an IDE drive.\r\n"); return false; } if ((statRdy & ATA_SR_BSY)) goto ATAInit_Retry; -- cgit v1.2.3