diff options
Diffstat (limited to 'dev/boot/BootKit/BootKit.h')
| -rw-r--r-- | dev/boot/BootKit/BootKit.h | 335 |
1 files changed, 0 insertions, 335 deletions
diff --git a/dev/boot/BootKit/BootKit.h b/dev/boot/BootKit/BootKit.h deleted file mode 100644 index e1a2b628..00000000 --- a/dev/boot/BootKit/BootKit.h +++ /dev/null @@ -1,335 +0,0 @@ -/* ======================================== - - Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license. - -======================================== */ - -/***********************************************************************************/ -/// @file BootKit.h -/// @brief Bootloader Application Programming Interface. -/***********************************************************************************/ - -#pragma once - -#include <BootKit/HW/ATA.h> -#include <CompilerKit/Version.h> -#include <modules/CoreGfx/CoreGfx.h> - -/// include NeFS header and Support header as well. - -#include <BootKit/Support.h> -#include <FSKit/NeFS.h> - -/***********************************************************************************/ -/// Include other APIs. -/***********************************************************************************/ - -#include <NeKit/Defines.h> -#include <modules/ATA/ATA.h> - -#include <FirmwareKit/EFI.h> -#include <FirmwareKit/EPM.h> -#include <FirmwareKit/GPT.h> -#include <FirmwareKit/VEPM.h> - -#define kBKBootFileMime "boot-x/file" -#define kBKBootDirMime "boot-x/dir" - -/***********************************************************************************/ -/// Framebuffer helpers. -/***********************************************************************************/ - -namespace Boot { -void ThrowError(const WideChar* errorCode, const WideChar* reason) noexcept; - -class BootTextWriter; -class BootFileReader; -class BootThread; -class BVersionString; - -typedef Char* PEFImagePtr; -typedef Char* PEImagePtr; - -typedef WideChar CharacterTypeUTF16; -typedef Char CharacterTypeASCII; -typedef char8_t CharacterTypeUTF8; - -using namespace Kernel; - -/** - * @brief BootKit Text Writer class - * Writes to UEFI StdOut. - */ -class BootTextWriter final { - BootTextWriter& _Write(const UInt64& num); - - public: - BootTextWriter& Write(const UInt64& num); - BootTextWriter& Write(const Char* str); - BootTextWriter& Write(const CharacterTypeUTF16* str); - BootTextWriter& WriteCharacter(CharacterTypeUTF16 c); - BootTextWriter& Write(const UChar* str); - - template <typename T> - BootTextWriter& operator<<(T elem) { - this->Write(elem); - return *this; - } - - public: - explicit BootTextWriter() = default; - ~BootTextWriter() = default; - - public: - BootTextWriter& operator=(const BootTextWriter&) = default; - BootTextWriter(const BootTextWriter&) = default; -}; - -Kernel::SizeT BCopyMem(CharacterTypeUTF16* dest, CharacterTypeUTF16* src, const Kernel::SizeT len); - -Kernel::SizeT BSetMem(CharacterTypeASCII* src, const CharacterTypeASCII byte, - const Kernel::SizeT len); - -/// String length functions. - -/// @brief get string length. -Kernel::SizeT BStrLen(const CharacterTypeUTF16* ptr); - -/// @brief set memory with custom value. -Kernel::SizeT BSetMem(CharacterTypeUTF16* src, const CharacterTypeUTF16 byte, - const Kernel::SizeT len); - -/** - * @brief BootKit File Reader class - * Reads the Firmware Boot partition and filesystem. - */ -class BootFileReader final { - public: - explicit BootFileReader(const CharacterTypeUTF16* path, EfiHandlePtr ImageHandle); - ~BootFileReader(); - - public: - Void ReadAll(SizeT until, SizeT chunk = kib_cast(4), UIntPtr out_address = 0UL); - - enum { - kOperationOkay, - kNotSupported, - kEmptyDirectory, - kNoSuchEntry, - kIsDirectory, - kTooSmall, - kCount, - }; - - /// @brief error code getter. - /// @return the error code. - Int32& Error(); - - /// @brief blob getter. - /// @return the blob. - VoidPtr Blob(); - - /// @breif Size getter. - /// @return the size of the file. - UInt64& Size(); - - public: - BootFileReader& operator=(const BootFileReader&) = default; - BootFileReader(const BootFileReader&) = default; - - private: - Int32 mErrorCode{kOperationOkay}; - VoidPtr mBlob{nullptr}; - CharacterTypeUTF16 mPath[kPathLen]; - BootTextWriter mWriter; - EfiFileProtocol* mFile{nullptr}; - UInt64 mSizeFile{0}; - EfiFileProtocol* mRootFs; -}; - -typedef UInt8* BlobType; - -/// @brief Bootloader Version String. -class BVersionString final { - public: - static const CharacterTypeASCII* The() { return BOOTLOADER_VERSION; } -}; - -/***********************************************************************************/ -/// Provide some useful processor features. -/***********************************************************************************/ - -#ifdef __EFI_x86_64__ - -/*** - * Common processor instructions. - */ - -EXTERN_C void rt_out8(UInt16 port, UInt8 value); -EXTERN_C void rt_out16(UInt16 port, UInt16 value); -EXTERN_C void rt_out32(UInt16 port, UInt32 value); -EXTERN_C UInt8 rt_in8(UInt16 port); -EXTERN_C UInt16 rt_in16(UInt16 port); -EXTERN_C UInt32 rt_in32(UInt16 port); - -EXTERN_C void rt_halt(); -EXTERN_C void rt_cli(); -EXTERN_C void rt_sti(); -EXTERN_C void rt_cld(); -EXTERN_C void rt_std(); - -#endif // __EFI_x86_64__ - -/// @brief BootKit Drive Formatter. -template <typename BootDev> -class BDiskFormatFactory final { - public: - /// @brief File entry for **BDiskFormatFactory**. - struct BFileDescriptor final { - Char fFileName[kNeFSCatalogNameLen]; - Int32 fKind; - }; - - public: - explicit BDiskFormatFactory() = default; - ~BDiskFormatFactory() = default; - - NE_COPY_DELETE(BDiskFormatFactory) - - /// @brief Format disk using partition name and blob. - /// @param Partition part_name the target partition name. - /// @param blob blobs array. - /// @param blob_sz blobs array count. - /// @retval True disk has been formatted. - /// @retval False failed to format. - Boolean Format(const Char* part_name); - - /// @brief check if partition is good. - Bool IsPartitionValid() noexcept { -#if defined(BOOTZ_EPM_SUPPORT) - fDiskDev.Leak().mBase = (kEPMBootBlockLba); - fDiskDev.Leak().mSize = sizeof(EPM_PART_BLOCK); - - EPM_PART_BLOCK buf_epm = {}; - - fDiskDev.Read((Char*) &buf_epm, sizeof(EPM_PART_BLOCK)); - - if (StrCmp(buf_epm.Magic, kEPMMagic) > 0) { - return false; - } - - if (buf_epm.Version != kEPMRevisionBcd) { - return false; - } - - BootTextWriter writer; - writer.Write("BootZ: EPM Partition found.\r"); - - return true; -#else - GPT_PARTITION_TABLE* gpt_part = (GPT_PARTITION_TABLE*) RTL_ALLOCA(sizeof(GPT_PARTITION_TABLE)); - - fDiskDev.Leak().mBase = (kGPTPartitionTableLBA); - fDiskDev.Leak().mSize = sizeof(GPT_PARTITION_TABLE); - - fDiskDev.Read((Char*) gpt_part, sizeof(GPT_PARTITION_TABLE)); - - BootTextWriter writer; - - if (StrCmp(gpt_part->Signature, kMagicGPT) == 0) { - writer.Write("BootZ: GPT Partition found.\r"); - return true; - } - - writer.Write("BootZ: No Partition found.\r"); - - return false; -#endif - } - - private: - BootDev fDiskDev; -}; - -/// @brief Format disk with a specific partition scheme. -/// @param part_name partition Name -/// @retval True disk has been formatted. -/// @retval False failed to format. -template <typename BootDev> -inline Boolean BDiskFormatFactory<BootDev>::Format(const Char* part_name) { -#if defined(BOOTZ_EPM_SUPPORT) - EPM_PART_BLOCK* epm_boot = (EPM_PART_BLOCK*) RTL_ALLOCA(sizeof(EPM_PART_BLOCK)); - - const auto kFsName = "NeKernel"; - const auto kBlockName = " NeKernelOS"; - - epm_boot->FsVersion = 0; - epm_boot->LbaStart = sizeof(EPM_PART_BLOCK); - epm_boot->LbaEnd = fDiskDev.GetDiskSize() - 1; - epm_boot->SectorSz = BootDev::kSectorSize; - epm_boot->Kind = kEPMNeKernel; - epm_boot->NumBlocks = 1; - - epm_boot->Guid = kEPMNilGuid; - - CopyMem(epm_boot->Fs, reinterpret_cast<VoidPtr>(const_cast<Char*>(kFsName)), StrLen(kFsName)); - CopyMem(epm_boot->Name, reinterpret_cast<VoidPtr>(const_cast<Char*>(kBlockName)), - StrLen(kBlockName)); - CopyMem(epm_boot->Magic, reinterpret_cast<VoidPtr>(const_cast<Char*>(kEPMMagic)), - StrLen(kEPMMagic)); - - fDiskDev.Leak().mBase = kEPMBootBlockLba; // always always resies at zero block. - fDiskDev.Leak().mSize = sizeof(EPM_PART_BLOCK); - - fDiskDev.Write((Char*) epm_boot, sizeof(EPM_PART_BLOCK)); - - BootTextWriter writer; - writer.Write(L"BootZ: Drive is EPM formatted.\r"); -#elif defined(BOOTZ_GPT_SUPPORT) - NE_UNUSED(part_name); - - GPT_PARTITION_TABLE* gpt_part = (GPT_PARTITION_TABLE*) RTL_ALLOCA(sizeof(GPT_PARTITION_TABLE)); - - CopyMem(gpt_part->Signature, reinterpret_cast<VoidPtr>(const_cast<Char*>(kMagicGPT)), - StrLen(kMagicGPT)); - - gpt_part->Revision = 0x00010000; - gpt_part->HeaderSize = sizeof(GPT_PARTITION_TABLE); - - gpt_part->CRC32 = 0x00000000; - - gpt_part->Reserved1 = 0x00000000; - gpt_part->LBAHeader = 0x00000000; - gpt_part->LBAAltHeader = 0x00000000; - gpt_part->FirstGPTEntry = 0x00000000; - gpt_part->LastGPTEntry = 0x00000000; - - gpt_part->Guid.Data1 = 0x00000000; - gpt_part->Guid.Data2 = 0x0000; - gpt_part->Guid.Data3 = 0x0000; - - SetMem(gpt_part->Guid.Data4, 0, 8); - - gpt_part->Revision = 0x00010000; - - gpt_part->StartingLBA = 0x00000000; - gpt_part->NumPartitionEntries = 0x00000000; - gpt_part->SizeOfEntries = 0x00000000; - gpt_part->CRC32PartEntry = 0x00000000; - - SetMem(gpt_part->Reserved2, 0, kSectorAlignGPT_PartTbl); - - fDiskDev.Leak().mBase = kGPTPartitionTableLBA; // always always resies at zero block. - fDiskDev.Leak().mSize = sizeof(GPT_PARTITION_TABLE); - - fDiskDev.Write((Char*) gpt_part, sizeof(GPT_PARTITION_TABLE)); - - BootTextWriter writer; - writer.Write(L"BootZ: Drive is GPT formatted.\r"); -#else - NE_UNUSED(part_name); -#endif - - return YES; -} -} // namespace Boot |
