From a3d92ea68a74ef3cc3d3c9a34540754869e4d014 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sun, 4 Feb 2024 13:36:19 +0100 Subject: NewBoot: Fix NewBoot EFI implementation. Signed-off-by: Amlal El Mahrouss --- Private/EFIKit/EFI.hxx | 14 +++++++++++++- Private/NewBoot/BootKit/BootKit.hxx | 2 +- Private/NewBoot/Source/Entrypoint.cxx | 6 ++++-- Private/NewBoot/Source/FileReader.cxx | 21 ++++++++++++++++----- Private/NewBoot/Source/makefile | 2 +- 5 files changed, 35 insertions(+), 10 deletions(-) diff --git a/Private/EFIKit/EFI.hxx b/Private/EFIKit/EFI.hxx index 46deaf9b..f0c87a62 100644 --- a/Private/EFIKit/EFI.hxx +++ b/Private/EFIKit/EFI.hxx @@ -613,12 +613,20 @@ struct EfiFileProtocol final { EfiStatusType (*Read)(struct EfiFileProtocol *This, UInt32 *BufSize, VoidPtr BufOut); + EfiStatusType (*Write)(struct EfiFileProtocol *This, UInt32 *BufSize, + VoidPtr BufOut); + EfiStatusType (*GetPosition)(EfiFileProtocol *This, UInt64 *Position); EfiStatusType (*SetPosition)(EfiFileProtocol *This, UInt64 *Position); EfiStatusType (*GetInfo)(struct EfiFileProtocol *, struct EfiGUID *, UInt32 *, void *); + + EfiStatusType (*SetInfo)(struct EfiFileProtocol *, struct EfiGUID *, UInt32 *, + void *); + + EfiStatusType (*Flush)(EfiFileProtocol *); }; typedef struct EfiTime { @@ -651,7 +659,11 @@ struct EfiFileInfo final { EfiTime EditTime; UInt64 Attribute; // Do not touch that, it's EFI specific. - WideChar FileName[]; + WideChar FileName[255]; }; +#define EFI_FILE_PROTOCOL_REVISION 0x00010000 +#define EFI_FILE_PROTOCOL_REVISION2 0x00020000 +#define EFI_FILE_PROTOCOL_LATEST_REVISION EFI_FILE_PROTOCOL_REVISION2 + #endif // __EFI__ diff --git a/Private/NewBoot/BootKit/BootKit.hxx b/Private/NewBoot/BootKit/BootKit.hxx index 6fec1724..05780c53 100644 --- a/Private/NewBoot/BootKit/BootKit.hxx +++ b/Private/NewBoot/BootKit/BootKit.hxx @@ -64,7 +64,7 @@ class BFileReader final { explicit BFileReader(const CharacterType *path); ~BFileReader(); - HCore::VoidPtr Fetch(EfiHandlePtr ImageHandle); + HCore::VoidPtr Fetch(EfiHandlePtr ImageHandle, SizeT &Sz); enum { kOperationOkay, diff --git a/Private/NewBoot/Source/Entrypoint.cxx b/Private/NewBoot/Source/Entrypoint.cxx index 2b1e5c35..7026da4d 100644 --- a/Private/NewBoot/Source/Entrypoint.cxx +++ b/Private/NewBoot/Source/Entrypoint.cxx @@ -46,9 +46,11 @@ EFI_EXTERN_C Int EfiMain(EfiHandlePtr ImageHandle, UInt64 mapKey = 0; - BFileReader img(L"\\EFI\\BOOT\\HCoreKrnl.exe"); + BFileReader img(L"\\EFI\\BOOT\\HCOREKRNL.EXE"); - PEImagePtr blob = (PEImagePtr)img.Fetch(ImageHandle); + SizeT imageSz = 0; + + PEImagePtr blob = (PEImagePtr)img.Fetch(ImageHandle, imageSz); if (!blob) EFI::RaiseHardError(L"HCoreLdr_NoSuchKernel", diff --git a/Private/NewBoot/Source/FileReader.cxx b/Private/NewBoot/Source/FileReader.cxx index 7bcccc10..8602114f 100644 --- a/Private/NewBoot/Source/FileReader.cxx +++ b/Private/NewBoot/Source/FileReader.cxx @@ -50,7 +50,7 @@ BFileReader::~BFileReader() { @brief this reads all of the buffer. @param ImageHandle used internally. */ -HCore::VoidPtr BFileReader::Fetch(EfiHandlePtr ImageHandle) { +HCore::VoidPtr BFileReader::Fetch(EfiHandlePtr ImageHandle, SizeT& imageSz) { mWriter.WriteString(L"HCoreLdr: Fetch-File: ") .WriteString(mPath) .WriteString(L"\r\n"); @@ -100,6 +100,13 @@ HCore::VoidPtr BFileReader::Fetch(EfiHandlePtr ImageHandle) { return nullptr; } + if (kernelFile->Revision < EFI_FILE_PROTOCOL_REVISION2) { + mWriter.WriteString(L"HCoreLdr: Fetch-Protocol: Invalid-Revision: ") + .WriteString(mPath) + .WriteString(L"\r\n"); + return nullptr; + } + /// File FAT info. UInt32 szInfo = sizeof(EfiFileInfo); @@ -139,6 +146,7 @@ HCore::VoidPtr BFileReader::Fetch(EfiHandlePtr ImageHandle) { } *sz = info.FileSize; + imageSz = *sz; if (BS->AllocatePool(EfiLoaderData, *sz, (VoidPtr*)&blob) != kEfiOk) { mWriter @@ -155,14 +163,17 @@ HCore::VoidPtr BFileReader::Fetch(EfiHandlePtr ImageHandle) { BSetMem((CharacterType*)blob, 0, *sz); mWriter.WriteString(L"HCoreLdr: Fetch-File: In-Progress...") + .WriteString(info.FileName) .WriteString(L"\r\n"); - kernelFile->Read(kernelFile, sz, blob); - - mWriter.WriteString(L"HCoreLdr: Fetch-File: OK").WriteString(L"\r\n"); - + auto resultEfiRead = kernelFile->Read(kernelFile, sz, blob); kernelFile->Close(kernelFile); + if (resultEfiRead == kEfiOk) + mWriter.WriteString(L"HCoreLdr: Fetch-File: OK").WriteString(L"\r\n"); + else + return nullptr; + this->mCached = true; this->mErrorCode = kOperationOkay; diff --git a/Private/NewBoot/Source/makefile b/Private/NewBoot/Source/makefile index 3deef8f4..05d6a9ab 100644 --- a/Private/NewBoot/Source/makefile +++ b/Private/NewBoot/Source/makefile @@ -19,7 +19,7 @@ bootloader-amd64: $(CC_GNU) $(FLAG_GNU) HEL/AMD64/*.cxx *.cxx $(LD_GNU) *.o HEL/AMD64/*.obj -e efi_main -filealign:16 -shared --subsystem=10 -ffreestanding -o HCoreLdr.exe cp HCoreLdr.exe CDROM/EFI/BOOT/BOOTX64.EFI - cp ../../HCoreKrnl.exe CDROM/EFI/BOOT/HCoreKrnl.exe + cp ../../HCoreKrnl.exe CDROM/EFI/BOOT/HCOREKRNL.EXE .PHONY: make-disk make-disk: -- cgit v1.2.3