summaryrefslogtreecommitdiffhomepage
path: root/Boot/Source
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-05-09 00:42:44 +0200
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-05-09 00:42:44 +0200
commitaf8a516fc22865abd80d6e26f1541fa3d6bebfdc (patch)
tree96d42a10945fc03df022389aef54708383c1d616 /Boot/Source
parenta874e9cc98df994178d55996943fe81799c61d2f (diff)
MHR-23: :boom:, refactors.
- Move NewBoot to /Boot, thus making Kernel directory only containing the kernel. Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'Boot/Source')
-rw-r--r--Boot/Source/.gitkeep0
-rw-r--r--Boot/Source/BootloaderRsrc.rsrc27
-rw-r--r--Boot/Source/HEL/AMD64/.gitkeep0
-rw-r--r--Boot/Source/HEL/AMD64/BootAHCI.cxx20
-rw-r--r--Boot/Source/HEL/AMD64/BootATA.cxx276
-rw-r--r--Boot/Source/HEL/AMD64/BootFileReader.cxx173
-rw-r--r--Boot/Source/HEL/AMD64/BootJump.S9
-rw-r--r--Boot/Source/HEL/AMD64/BootMain.cxx244
-rw-r--r--Boot/Source/HEL/AMD64/BootPlatform.cxx102
-rw-r--r--Boot/Source/HEL/AMD64/BootString.cxx92
-rw-r--r--Boot/Source/HEL/AMD64/BootTextWriter.cxx140
-rw-r--r--Boot/Source/HEL/AMD64/New+Delete.cxx51
-rw-r--r--Boot/Source/HEL/AMD64/Support.cxx62
-rw-r--r--Boot/Source/HEL/AMD64/compile_flags.txt3
-rw-r--r--Boot/Source/HEL/ARM64/.gitkeep0
-rw-r--r--Boot/Source/HEL/POWER/.gitkeep0
-rw-r--r--Boot/Source/HEL/POWER/CoreBootStartup.S34
-rw-r--r--Boot/Source/HEL/RISCV/.gitkeep0
-rw-r--r--Boot/Source/HEL/RISCV/BootRISCV.S22
-rw-r--r--Boot/Source/Root/EFI/STARTUP.NSH2
-rw-r--r--Boot/Source/Root/SplashScreen.fmt7
-rw-r--r--Boot/Source/compile_flags.txt4
-rw-r--r--Boot/Source/makefile106
-rw-r--r--Boot/Source/ovmf.ps14
24 files changed, 1378 insertions, 0 deletions
diff --git a/Boot/Source/.gitkeep b/Boot/Source/.gitkeep
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/Boot/Source/.gitkeep
diff --git a/Boot/Source/BootloaderRsrc.rsrc b/Boot/Source/BootloaderRsrc.rsrc
new file mode 100644
index 00000000..d79211e7
--- /dev/null
+++ b/Boot/Source/BootloaderRsrc.rsrc
@@ -0,0 +1,27 @@
+#include "../../Kernel/CompilerKit/Version.hxx"
+
+1 ICON "../../Kernel/Root/Boot/Icons/boot-logo.ico"
+
+1 VERSIONINFO
+FILEVERSION 1,0,0,0
+PRODUCTVERSION 1,0,0,0
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "080904E4"
+ BEGIN
+ VALUE "CompanyName", "SoftwareLabs"
+ VALUE "FileDescription", "New OS multi-platform bootloader."
+ VALUE "FileVersion", BOOTLOADER_VERSION
+ VALUE "InternalName", "NewBoot"
+ VALUE "LegalCopyright", "Copyright SoftwareLabs, all rights reserved."
+ VALUE "OriginalFilename", "NewBoot.exe"
+ VALUE "ProductName", "NewBoot"
+ VALUE "ProductVersion", BOOTLOADER_VERSION
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x809, 1252
+ END
+END
diff --git a/Boot/Source/HEL/AMD64/.gitkeep b/Boot/Source/HEL/AMD64/.gitkeep
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/Boot/Source/HEL/AMD64/.gitkeep
diff --git a/Boot/Source/HEL/AMD64/BootAHCI.cxx b/Boot/Source/HEL/AMD64/BootAHCI.cxx
new file mode 100644
index 00000000..6676f660
--- /dev/null
+++ b/Boot/Source/HEL/AMD64/BootAHCI.cxx
@@ -0,0 +1,20 @@
+/* -------------------------------------------
+
+ Copyright SoftwareLabs
+
+------------------------------------------- */
+
+/**
+ * @file AHCI.cxx
+ * @author Amlal El Mahrouss (amlalelmahrouss@icloud.com)
+ * @brief AHCI driver.
+ * @version 0.1
+ * @date 2024-02-02
+ *
+ * @copyright Copyright (c) SoftwareLabs
+ *
+ */
+
+#include <BootKit/Platform.hxx>
+#include <BootKit/Protocol.hxx>
+#include <BootKit/HW/SATA.hxx>
diff --git a/Boot/Source/HEL/AMD64/BootATA.cxx b/Boot/Source/HEL/AMD64/BootATA.cxx
new file mode 100644
index 00000000..499596ca
--- /dev/null
+++ b/Boot/Source/HEL/AMD64/BootATA.cxx
@@ -0,0 +1,276 @@
+/* -------------------------------------------
+
+ Copyright SoftwareLabs
+
+------------------------------------------- */
+
+/**
+ * @file ATA.cxx
+ * @author Amlal El Mahrouss (amlalelmahrouss@icloud.com)
+ * @brief ATA driver.
+ * @version 0.1
+ * @date 2024-02-02
+ *
+ * @copyright Copyright (c) SoftwareLabs
+ *
+ */
+
+#include <FirmwareKit/EFI.hxx>
+#include <BootKit/BootKit.hxx>
+#include <BootKit/HW/ATA.hxx>
+
+/// bugs: 0
+
+#define kATADataLen 256
+
+static Boolean kATADetected = false;
+static Int32 kATADeviceType = kATADeviceCount;
+static UInt16 kATAData[kATADataLen] = {0};
+
+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:
+ auto statRdy = In8(IO + ATA_REG_STATUS);
+
+ if ((statRdy & ATA_SR_BSY))
+ goto ATAWaitForIO_Retry;
+
+ATAWaitForIO_Retry2:
+ statRdy = In8(IO + ATA_REG_STATUS);
+
+ if (statRdy & ATA_SR_ERR)
+ return false;
+
+ if (!(statRdy & ATA_SR_DRDY))
+ goto ATAWaitForIO_Retry2;
+
+ return true;
+}
+
+Void boot_ata_select(UInt16 Bus)
+{
+ if (Bus == ATA_PRIMARY_IO)
+ Out8(Bus + ATA_REG_HDDEVSEL, ATA_PRIMARY_SEL);
+ else
+ Out8(Bus + ATA_REG_HDDEVSEL, ATA_SECONDARY_SEL);
+}
+
+Boolean boot_ata_init(UInt16 Bus, UInt8 Drive, UInt16& OutBus, UInt8& OutMaster)
+{
+ if (boot_ata_detected())
+ return true;
+
+ BTextWriter writer;
+
+ UInt16 IO = Bus;
+
+ boot_ata_select(IO);
+
+ // Bus init, NEIN bit.
+ Out8(IO + ATA_REG_NEIN, 1);
+
+ // identify until it's good.
+ATAInit_Retry:
+ auto statRdy = In8(IO + ATA_REG_STATUS);
+
+ if (statRdy & ATA_SR_ERR)
+ {
+ writer.Write(
+ L"New Boot: ATA: Select error, not an IDE based hard-drive.\r");
+
+ return false;
+ }
+
+ if ((statRdy & ATA_SR_BSY))
+ goto ATAInit_Retry;
+
+ Out8(IO + ATA_REG_COMMAND, ATA_CMD_IDENTIFY);
+
+ /// fetch serial info
+ /// model, speed, number of sectors...
+
+ boot_ata_wait_io(IO);
+
+ for (SizeT indexData = 0ul; indexData < kATADataLen; ++indexData)
+ {
+ kATAData[indexData] = In16(IO + ATA_REG_DATA);
+ }
+
+ OutBus =
+ (Bus == ATA_PRIMARY_IO) ? BootDeviceATA::kPrimary : BootDeviceATA::kSecondary;
+
+ OutMaster = (Bus == ATA_PRIMARY_IO) ? ATA_MASTER : ATA_SLAVE;
+
+ return true;
+}
+
+Void boot_ata_read(UInt64 Lba, UInt16 IO, UInt8 Master, CharacterTypeUTF8* Buf, SizeT SectorSz, SizeT Size)
+{
+ UInt8 Command = ((!Master) ? 0xE0 : 0xF0);
+
+ boot_ata_wait_io(IO);
+ boot_ata_select(IO);
+
+ Out8(IO + ATA_REG_HDDEVSEL, (Command) | (((Lba) >> 24) & 0x0F));
+
+ Out8(IO + ATA_REG_SEC_COUNT0, 2);
+
+ Out8(IO + ATA_REG_LBA0, (Lba));
+ Out8(IO + ATA_REG_LBA1, (Lba) >> 8);
+ Out8(IO + ATA_REG_LBA2, (Lba) >> 16);
+ Out8(IO + ATA_REG_LBA3, (Lba) >> 24);
+
+ Out8(IO + ATA_REG_COMMAND, ATA_CMD_READ_PIO);
+
+ boot_ata_wait_io(IO);
+
+ for (SizeT IndexOff = 0; IndexOff < Size; ++IndexOff)
+ {
+ boot_ata_wait_io(IO);
+ Buf[IndexOff] = In16(IO + ATA_REG_DATA);
+ boot_ata_wait_io(IO);
+ }
+}
+
+Void boot_ata_write(UInt64 Lba, UInt16 IO, UInt8 Master, CharacterTypeUTF8* Buf, SizeT SectorSz, SizeT Size)
+{
+ UInt8 Command = ((!Master) ? 0xE0 : 0xF0);
+
+ boot_ata_wait_io(IO);
+ boot_ata_select(IO);
+
+ Out8(IO + ATA_REG_HDDEVSEL, (Command) | (((Lba) >> 24) & 0x0F));
+
+ Out8(IO + ATA_REG_SEC_COUNT0, 2);
+
+ Out8(IO + ATA_REG_LBA0, (Lba));
+ Out8(IO + ATA_REG_LBA1, (Lba) >> 8);
+ Out8(IO + ATA_REG_LBA2, (Lba) >> 16);
+ Out8(IO + ATA_REG_LBA3, (Lba) >> 24);
+
+ Out8(IO + ATA_REG_COMMAND, ATA_CMD_WRITE_PIO);
+
+ boot_ata_wait_io(IO);
+
+ for (SizeT IndexOff = 0; IndexOff < Size; ++IndexOff)
+ {
+ boot_ata_wait_io(IO);
+ Out16(IO + ATA_REG_DATA, Buf[IndexOff]);
+ boot_ata_wait_io(IO);
+ }
+}
+
+/// @check is ATA detected?
+Boolean boot_ata_detected(Void)
+{
+ return kATADetected;
+}
+
+/***
+ *
+ *
+ * @brief ATA Device class.
+ *
+ *
+ */
+
+/**
+ * @brief ATA Device constructor.
+ * @param void none.
+ */
+BootDeviceATA::BootDeviceATA() noexcept
+{
+ if (boot_ata_init(ATA_PRIMARY_IO, true, this->Leak().mBus,
+ this->Leak().mMaster) ||
+ boot_ata_init(ATA_SECONDARY_IO, true, this->Leak().mBus,
+ this->Leak().mMaster))
+ {
+ kATADetected = true;
+ }
+}
+/**
+ * @brief Is ATA detected?
+ */
+BootDeviceATA::operator bool()
+{
+ return boot_ata_detected();
+}
+
+/**
+ @brief Read Buf from disk
+ @param Sz Sector size
+ @param Buf buffer
+*/
+BootDeviceATA& BootDeviceATA::Read(CharacterTypeUTF8* Buf, const SizeT& SectorSz)
+{
+ if (!boot_ata_detected())
+ {
+ Leak().mErr = true;
+ return *this;
+ }
+
+ this->Leak().mErr = false;
+
+ if (!Buf || SectorSz < 1)
+ return *this;
+
+ auto lba = this->Leak().mBase / SectorSz;
+
+ boot_ata_read(lba, this->Leak().mBus, this->Leak().mMaster,
+ Buf, SectorSz, this->Leak().mSize);
+
+ return *this;
+}
+
+/**
+ @brief Write Buf into disk
+ @param Sz Sector size
+ @param Buf buffer
+*/
+BootDeviceATA& BootDeviceATA::Write(CharacterTypeUTF8* Buf, const SizeT& SectorSz)
+{
+ if (!boot_ata_detected())
+ {
+ Leak().mErr = true;
+ return *this;
+ }
+
+ Leak().mErr = false;
+
+ if (!Buf || SectorSz < 1)
+ return *this;
+
+ auto lba = this->Leak().mBase / SectorSz;
+
+ boot_ata_write(lba, this->Leak().mBus, this->Leak().mMaster,
+ Buf, SectorSz, this->Leak().mSize);
+
+ return *this;
+}
+
+/**
+ * @brief ATA trait getter.
+ * @return BootDeviceATA::ATATrait& the drive config.
+ */
+BootDeviceATA::ATATrait& BootDeviceATA::Leak()
+{
+ return mTrait;
+}
+
+/***
+ @brief Getter, gets the number of sectors inside the drive.
+*/
+SizeT BootDeviceATA::GetSectorsCount() noexcept
+{
+ return (kATAData[61] << 16) | kATAData[60];
+}
+
+SizeT BootDeviceATA::GetDiskSize() noexcept
+{
+ return this->GetSectorsCount() * BootDeviceATA::kSectorSize;
+}
diff --git a/Boot/Source/HEL/AMD64/BootFileReader.cxx b/Boot/Source/HEL/AMD64/BootFileReader.cxx
new file mode 100644
index 00000000..61adc4f3
--- /dev/null
+++ b/Boot/Source/HEL/AMD64/BootFileReader.cxx
@@ -0,0 +1,173 @@
+/* -------------------------------------------
+
+ Copyright SoftwareLabs
+
+ File: FileReader.cxx
+ Purpose: New Boot FileReader,
+ Read complete file and store it in a buffer.
+
+------------------------------------------- */
+
+#include <BootKit/Platform.hxx>
+#include <BootKit/Protocol.hxx>
+#include <BootKit/BootKit.hxx>
+#include <FirmwareKit/Handover.hxx>
+#include <FirmwareKit/EFI/API.hxx>
+#include <cstddef>
+
+/// @file BootFileReader
+/// @brief Bootloader File reader.
+/// BUGS: 0
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+///
+///
+/// @name BFileReader class
+/// @brief Reads the file as a blob.
+///
+///
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/***
+ @brief File Reader constructor.
+*/
+BFileReader::BFileReader(const CharacterTypeUTF16* path,
+ EfiHandlePtr ImageHandle)
+{
+ if (path != nullptr)
+ {
+ SizeT index = 0UL;
+ for (; path[index] != L'\0'; ++index)
+ {
+ mPath[index] = path[index];
+ }
+
+ mPath[index] = 0;
+ }
+
+ /// Load protocols with their GUIDs.
+
+ EfiGUID guidEfp = EfiGUID(EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID);
+
+ EfiSimpleFilesystemProtocol* efp = nullptr;
+ EfiFileProtocol* rootFs = nullptr;
+
+ EfiLoadImageProtocol* img = nullptr;
+ EfiGUID guidImg = EfiGUID(EFI_LOADED_IMAGE_PROTOCOL_GUID);
+
+ if (BS->HandleProtocol(ImageHandle, &guidImg, (void**)&img) != kEfiOk)
+ {
+ mWriter.Write(L"New Boot: Fetch-Protocol: No-Such-Protocol").Write(L"\r");
+ this->mErrorCode = kNotSupported;
+ }
+
+ if (BS->HandleProtocol(img->DeviceHandle, &guidEfp, (void**)&efp) != kEfiOk)
+ {
+ mWriter.Write(L"New Boot: Fetch-Protocol: No-Such-Protocol").Write(L"\r");
+ this->mErrorCode = kNotSupported;
+ return;
+ }
+
+ /// Start doing disk I/O
+
+ if (efp->OpenVolume(efp, &rootFs) != kEfiOk)
+ {
+ mWriter.Write(L"New Boot: Fetch-Protocol: No-Such-Volume").Write(L"\r");
+ this->mErrorCode = kNotSupported;
+ return;
+ }
+
+ EfiFileProtocol* kernelFile = nullptr;
+
+ if (rootFs->Open(rootFs, &kernelFile, mPath, kEFIFileRead, kEFIReadOnly) !=
+ kEfiOk)
+ {
+ mWriter.Write(L"New Boot: Fetch-Protocol: No-Such-Path: ")
+ .Write(mPath)
+ .Write(L"\r");
+ this->mErrorCode = kNotSupported;
+ return;
+ }
+
+ rootFs->Close(rootFs);
+
+ mSizeFile = 0;
+ mFile = kernelFile;
+ mErrorCode = kOperationOkay;
+}
+
+BFileReader::~BFileReader()
+{
+ if (this->mFile)
+ {
+ this->mFile->Close(this->mFile);
+ this->mFile = nullptr;
+ }
+
+ if (this->mBlob)
+ BS->FreePool(mBlob);
+
+ BSetMem(this->mPath, 0, kPathLen);
+}
+
+/**
+ @brief this reads all of the buffer.
+ @param until read until size is reached.
+*/
+Void BFileReader::ReadAll(SizeT until, SizeT chunk)
+{
+ if (mBlob == nullptr)
+ {
+ if (auto err = BS->AllocatePool(EfiLoaderCode, until, (VoidPtr*)&mBlob) !=
+ kEfiOk)
+ {
+ mWriter.Write(L"*** EFI-Code: ").Write(err).Write(L" ***\r");
+ EFI::ThrowError(L"OutOfMemory", L"Out of memory.");
+ }
+ }
+
+ mErrorCode = kNotSupported;
+
+ UInt64 bufSize = chunk;
+ UInt64 szCnt = 0;
+ UInt64 curSz = 0;
+
+ while (szCnt < until)
+ {
+ if (mFile->Read(mFile, &bufSize, (VoidPtr)((UIntPtr)mBlob + curSz)) !=
+ kEfiOk)
+ {
+ break;
+ }
+
+ szCnt += bufSize;
+ curSz += bufSize;
+
+ if (bufSize == 0)
+ break;
+ }
+
+ mSizeFile = curSz;
+ mErrorCode = kOperationOkay;
+}
+
+/// @brief error code getter.
+/// @return the error code.
+Int32& BFileReader::Error()
+{
+ return mErrorCode;
+}
+
+/// @brief blob getter.
+/// @return the blob.
+VoidPtr BFileReader::Blob()
+{
+ return mBlob;
+}
+
+/// @breif Size getter.
+/// @return the size of the file.
+UInt64& BFileReader::Size()
+{
+ return mSizeFile;
+}
diff --git a/Boot/Source/HEL/AMD64/BootJump.S b/Boot/Source/HEL/AMD64/BootJump.S
new file mode 100644
index 00000000..af278cc7
--- /dev/null
+++ b/Boot/Source/HEL/AMD64/BootJump.S
@@ -0,0 +1,9 @@
+.global rt_jump_to_address
+.text
+
+.code64
+.intel_syntax noprefix
+
+rt_jump_to_address:
+ jmp rcx
+ ret
diff --git a/Boot/Source/HEL/AMD64/BootMain.cxx b/Boot/Source/HEL/AMD64/BootMain.cxx
new file mode 100644
index 00000000..f422b661
--- /dev/null
+++ b/Boot/Source/HEL/AMD64/BootMain.cxx
@@ -0,0 +1,244 @@
+/* -------------------------------------------
+
+ Copyright SoftwareLabs
+
+------------------------------------------- */
+
+#include <BootKit/BootKit.hxx>
+#include <BootKit/Rsrc/NewBoot.rsrc>
+#include <Builtins/Toolbox/Toolbox.hxx>
+#include <FirmwareKit/EFI.hxx>
+#include <FirmwareKit/EFI/API.hxx>
+#include <FirmwareKit/Handover.hxx>
+#include <KernelKit/MSDOS.hpp>
+#include <KernelKit/PE.hxx>
+#include <KernelKit/PEF.hpp>
+#include <NewKit/Macros.hpp>
+#include <NewKit/Ref.hpp>
+#include <cstring>
+
+/// make the compiler shut up.
+#ifndef kMachineModel
+#define kMachineModel "NeWS HD"
+#endif // !kMachineModel
+
+/** Graphics related. */
+
+STATIC EfiGraphicsOutputProtocol* kGop = nullptr;
+STATIC UInt16 kStride = 0U;
+STATIC EfiGUID kGopGuid;
+
+EXTERN_C Void hal_init_platform(HEL::HandoverInformationHeader* HIH);
+
+/**
+ @brief Finds and stores the GOP.
+*/
+
+STATIC Void CheckAndFindFramebuffer() noexcept
+{
+ kGopGuid = EfiGUID(EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID);
+ kGop = nullptr;
+
+ extern EfiBootServices* BS;
+
+ BS->LocateProtocol(&kGopGuid, nullptr, (VoidPtr*)&kGop);
+
+ kStride = 4;
+}
+
+/// @brief check the BootDevice if suitable.
+STATIC Bool CheckBootDevice(BootDeviceATA& ataDev)
+{
+ if (ataDev.Leak().mErr)
+ return false;
+ return true;
+}
+
+/// @brief Main EFI entrypoint.
+/// @param ImageHandle Handle of this image.
+/// @param SystemTable The system table of it.
+/// @return
+EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle,
+ EfiSystemTable* SystemTable)
+{
+ InitEFI(SystemTable); ///! Init the EFI library.
+ CheckAndFindFramebuffer(); ///! Init the GOP.
+
+ BTextWriter writer;
+
+ /// Splash screen stuff
+
+ writer.Write(L"SoftwareLabs (R) New Boot: ")
+ .Write(BVersionString::Shared());
+
+ writer.Write(L"\rNew Boot: Firmware Vendor: ")
+ .Write(SystemTable->FirmwareVendor)
+ .Write(L"\r");
+
+ UInt32* MapKey = new UInt32();
+ UInt32* SizePtr = new UInt32();
+ EfiMemoryDescriptor* Descriptor = nullptr;
+ UInt32* SzDesc = new UInt32();
+ UInt32* RevDesc = new UInt32();
+
+ *MapKey = 0;
+ *SizePtr = 0;
+
+ HEL::HandoverInformationHeader* handoverHdrPtr =
+ new HEL::HandoverInformationHeader();
+
+ for (SizeT indexVT = 0; indexVT < SystemTable->NumberOfTableEntries;
+ ++indexVT)
+ {
+ volatile Char* vendorTable = reinterpret_cast<volatile Char*>(
+ SystemTable->ConfigurationTable[indexVT].VendorTable);
+
+ /// ACPI's 'RSD PTR', which contains hardware tables (MADT, FACP...)
+ if (vendorTable[0] == 'R' && vendorTable[1] == 'S' &&
+ vendorTable[2] == 'D' && vendorTable[3] == ' ' &&
+ vendorTable[4] == 'P' && vendorTable[5] == 'T' &&
+ vendorTable[6] == 'R' && vendorTable[7] == ' ')
+ {
+ handoverHdrPtr->f_HardwareTables.f_RsdPtr = (VoidPtr)vendorTable;
+
+ break;
+ }
+ }
+
+ handoverHdrPtr->f_Magic = kHandoverMagic;
+ handoverHdrPtr->f_Version = kHandoverVersion;
+
+ BCopyMem(handoverHdrPtr->f_FirmwareVendorName, SystemTable->FirmwareVendor,
+ handoverHdrPtr->f_FirmwareVendorLen);
+
+ handoverHdrPtr->f_GOP.f_The = kGop->Mode->FrameBufferBase;
+ handoverHdrPtr->f_GOP.f_Width = kGop->Mode->Info->VerticalResolution;
+ handoverHdrPtr->f_GOP.f_Height = kGop->Mode->Info->HorizontalResolution;
+ handoverHdrPtr->f_GOP.f_PixelPerLine = kGop->Mode->Info->PixelsPerScanLine;
+ handoverHdrPtr->f_GOP.f_PixelFormat = kGop->Mode->Info->PixelFormat;
+ handoverHdrPtr->f_GOP.f_Size = kGop->Mode->FrameBufferSize;
+
+ ///! Finally draw bootloader screen.
+
+ kHandoverHeader = handoverHdrPtr;
+
+ ToolboxInitRsrc();
+
+ ToolboxDrawZone(RGB(9d, 9d, 9d), handoverHdrPtr->f_GOP.f_Height,
+ handoverHdrPtr->f_GOP.f_Width, 0, 0);
+
+ ToolboxClearRsrc();
+
+ ToolboxDrawRsrc(NewBoot, NEWBOOT_HEIGHT, NEWBOOT_WIDTH,
+ (handoverHdrPtr->f_GOP.f_Width - NEWBOOT_WIDTH) / 2,
+ (handoverHdrPtr->f_GOP.f_Height - NEWBOOT_HEIGHT) / 2);
+
+ ToolboxClearRsrc();
+
+ BS->GetMemoryMap(SizePtr, Descriptor, MapKey, SzDesc, RevDesc);
+
+ Descriptor = new EfiMemoryDescriptor[*SzDesc];
+ BS->GetMemoryMap(SizePtr, Descriptor, MapKey, SzDesc, RevDesc);
+
+ writer.Write(L"Kernel-Desc-Count: ");
+ writer.Write(*SzDesc);
+ writer.Write(L"\r");
+
+ auto cDefaultMemoryMap = 0; /// The sixth entry.
+
+ /// A simple loop which finds a usable memory region for us.
+ SizeT i = 0UL;
+ for (; Descriptor[i].Kind != EfiMemoryType::EfiConventionalMemory; ++i)
+ {
+ ;
+ }
+
+ cDefaultMemoryMap = i;
+
+ writer.Write(L"Number-Of-Pages: ")
+ .Write(Descriptor[cDefaultMemoryMap].NumberOfPages)
+ .Write(L"\r");
+ writer.Write(L"Virtual-Address: ")
+ .Write(Descriptor[cDefaultMemoryMap].VirtualStart)
+ .Write(L"\r");
+ writer.Write(L"Phyiscal-Address: ")
+ .Write(Descriptor[cDefaultMemoryMap].PhysicalStart)
+ .Write(L"\r");
+ writer.Write(L"Page-Kind: ")
+ .Write(Descriptor[cDefaultMemoryMap].Kind)
+ .Write(L"\r");
+ writer.Write(L"Page-Attribute: ")
+ .Write(Descriptor[cDefaultMemoryMap].Attribute)
+ .Write(L"\r");
+
+ handoverHdrPtr->f_PhysicalStart =
+ (VoidPtr)Descriptor[cDefaultMemoryMap].PhysicalStart;
+
+ handoverHdrPtr->f_FirmwareSpecific[HEL::kHandoverSpecificAttrib] =
+ Descriptor[cDefaultMemoryMap].Attribute;
+ handoverHdrPtr->f_FirmwareSpecific[HEL::kHandoverSpecificKind] =
+ Descriptor[cDefaultMemoryMap].Kind;
+ handoverHdrPtr->f_FirmwareSpecific[HEL::kHandoverSpecificMemoryEfi] =
+ (UIntPtr)Descriptor;
+
+ handoverHdrPtr->f_VirtualStart =
+ (VoidPtr)Descriptor[cDefaultMemoryMap].VirtualStart;
+ handoverHdrPtr->f_VirtualSize =
+ Descriptor[cDefaultMemoryMap].NumberOfPages; /* # of pages */
+
+ handoverHdrPtr->f_FirmwareVendorLen = BStrLen(SystemTable->FirmwareVendor);
+
+ BFileReader reader(L"SplashScreen.fmt", ImageHandle);
+ reader.ReadAll(512, 16);
+
+ if (reader.Blob())
+ {
+ Char* buf = (Char*)reader.Blob();
+
+ for (SizeT i = 0; i < reader.Size(); ++i)
+ {
+ if (buf[i] != '\n' && buf[i] != '\r')
+ {
+ if (buf[i] == '*')
+ {
+ writer.WriteCharacter('\t');
+ }
+ else
+ {
+ writer.WriteCharacter(buf[i]);
+ }
+ }
+ else
+ writer.Write(L"\r");
+ }
+ }
+
+ ///
+ /// The following checks for an exisiting partition
+ /// inside the disk, if it doesn't have one,
+ /// format the disk.
+ //
+
+ BDiskFormatFactory<BootDeviceATA> diskFormatter;
+
+ /// if not formated yet, then format it with the following folders:
+ /// /, /Boot, /Applications.
+ if (!diskFormatter.IsPartitionValid())
+ {
+ BDiskFormatFactory<BootDeviceATA>::BFileDescriptor rootDesc{0};
+
+ CopyMem(rootDesc.fFileName, kNewFSRoot, StrLen(kNewFSRoot));
+ rootDesc.fKind = kNewFSCatalogKindDir;
+
+ diskFormatter.Format(kMachineModel, &rootDesc, 1);
+ }
+
+ EFI::ExitBootServices(*MapKey, ImageHandle);
+
+ /// Fallback to builtin kernel.
+ hal_init_platform(handoverHdrPtr);
+
+ EFI::Stop();
+
+ CANT_REACH();
+}
diff --git a/Boot/Source/HEL/AMD64/BootPlatform.cxx b/Boot/Source/HEL/AMD64/BootPlatform.cxx
new file mode 100644
index 00000000..9d125ec6
--- /dev/null
+++ b/Boot/Source/HEL/AMD64/BootPlatform.cxx
@@ -0,0 +1,102 @@
+/* -------------------------------------------
+
+ Copyright SoftwareLabs
+
+------------------------------------------- */
+
+#include <BootKit/Platform.hxx>
+#include <BootKit/Protocol.hxx>
+#include <BootKit/BootKit.hxx>
+#include "HALKit/AMD64/Processor.hpp"
+
+#ifdef __STANDALONE__
+
+EXTERN_C void rt_hlt()
+{
+ asm volatile("hlt");
+}
+
+EXTERN_C void rt_cli()
+{
+ asm volatile("cli");
+}
+
+EXTERN_C void rt_sti()
+{
+ asm volatile("sti");
+}
+
+EXTERN_C void rt_cld()
+{
+ asm volatile("cld");
+}
+
+EXTERN_C void rt_std()
+{
+ asm volatile("std");
+}
+
+EXTERN_C void Out8(UInt16 port, UInt8 value)
+{
+ asm volatile("outb %%al, %1"
+ :
+ : "a"(value), "Nd"(port)
+ : "memory");
+}
+
+EXTERN_C void Out16(UInt16 port, UInt16 value)
+{
+ asm volatile("outw %%ax, %1"
+ :
+ : "a"(value), "Nd"(port)
+ : "memory");
+}
+
+EXTERN_C void Out32(UInt16 port, UInt32 value)
+{
+ asm volatile("outl %%eax, %1"
+ :
+ : "a"(value), "Nd"(port)
+ : "memory");
+}
+
+EXTERN_C UInt8 In8(UInt16 port)
+{
+ UInt8 value;
+ asm volatile("inb %1, %%al"
+ : "=a"(value)
+ : "Nd"(port)
+ : "memory");
+
+ return value;
+}
+
+EXTERN_C UInt16 In16(UInt16 port)
+{
+ UInt16 value;
+ asm volatile("inw %%dx, %%ax"
+ : "=a"(value)
+ : "d"(port));
+
+ return value;
+}
+
+EXTERN_C UInt32 In32(UInt16 port)
+{
+ UInt32 value;
+ asm volatile("inl %1, %%eax"
+ : "=a"(value)
+ : "Nd"(port)
+ : "memory");
+
+ return value;
+}
+
+#else
+
+void rt_hlt()
+{
+ NewOS::HAL::rt_halt();
+}
+
+#endif // 0
diff --git a/Boot/Source/HEL/AMD64/BootString.cxx b/Boot/Source/HEL/AMD64/BootString.cxx
new file mode 100644
index 00000000..a93943cf
--- /dev/null
+++ b/Boot/Source/HEL/AMD64/BootString.cxx
@@ -0,0 +1,92 @@
+/* -------------------------------------------
+
+ Copyright SoftwareLabs
+
+ File: String.cxx
+ Purpose: NewBoot string library
+
+ Revision History:
+
+
+
+------------------------------------------- */
+
+#include <BootKit/Platform.hxx>
+#include <BootKit/Protocol.hxx>
+#include <BootKit/BootKit.hxx>
+
+/// bugs 0
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+NewOS::SizeT BCopyMem(CharacterTypeUTF16* dest, CharacterTypeUTF16* src, const NewOS::SizeT len)
+{
+ if (!dest || !src)
+ return 0;
+
+ SizeT index = 0UL;
+ for (; index < len; ++index)
+ {
+ dest[index] = src[index];
+ }
+
+ return index;
+}
+
+NewOS::SizeT BStrLen(const CharacterTypeUTF16* ptr)
+{
+ if (!ptr)
+ return 0;
+
+ NewOS::SizeT cnt = 0;
+
+ while (*ptr != (CharacterTypeUTF16)0)
+ {
+ ++ptr;
+ ++cnt;
+ }
+
+ return cnt;
+}
+
+NewOS::SizeT BSetMem(CharacterTypeUTF16* src, const CharacterTypeUTF16 byte, const NewOS::SizeT len)
+{
+ if (!src)
+ return 0;
+
+ NewOS::SizeT cnt = 0UL;
+
+ while (*src != 0)
+ {
+ if (cnt > len)
+ break;
+
+ *src = byte;
+ ++src;
+
+ ++cnt;
+ }
+
+ return cnt;
+}
+
+NewOS::SizeT BSetMem(CharacterTypeUTF8* src, const CharacterTypeUTF8 byte, const NewOS::SizeT len)
+{
+ if (!src)
+ return 0;
+
+ NewOS::SizeT cnt = 0UL;
+
+ while (*src != 0)
+ {
+ if (cnt > len)
+ break;
+
+ *src = byte;
+ ++src;
+
+ ++cnt;
+ }
+
+ return cnt;
+}
diff --git a/Boot/Source/HEL/AMD64/BootTextWriter.cxx b/Boot/Source/HEL/AMD64/BootTextWriter.cxx
new file mode 100644
index 00000000..30c328ad
--- /dev/null
+++ b/Boot/Source/HEL/AMD64/BootTextWriter.cxx
@@ -0,0 +1,140 @@
+/* -------------------------------------------
+
+ Copyright SoftwareLabs
+
+ File: String.cxx
+ Purpose: NewBoot string library
+
+ Revision History:
+
+
+
+------------------------------------------- */
+
+#include <FirmwareKit/EFI/API.hxx>
+#include <BootKit/Platform.hxx>
+#include <BootKit/Protocol.hxx>
+#include <BootKit/BootKit.hxx>
+
+/// BUGS: 0
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+@brief puts wrapper over EFI ConOut.
+*/
+BTextWriter& BTextWriter::Write(const CharacterTypeUTF16* str)
+{
+#ifdef __DEBUG__
+ if (!str || *str == 0)
+ return *this;
+
+ CharacterTypeUTF16 strTmp[2];
+ strTmp[1] = 0;
+
+ for (size_t i = 0; str[i] != 0; i++)
+ {
+ if (str[i] == '\r')
+ {
+ strTmp[0] = str[i];
+ ST->ConOut->OutputString(ST->ConOut, strTmp);
+
+ strTmp[0] = '\n';
+ ST->ConOut->OutputString(ST->ConOut, strTmp);
+ }
+ else
+ {
+ strTmp[0] = str[i];
+ ST->ConOut->OutputString(ST->ConOut, strTmp);
+ }
+ }
+#endif // ifdef __DEBUG__
+
+ return *this;
+}
+
+/// @brief UTF-8 equivalent of Write (UTF-16).
+/// @param str the input string.
+BTextWriter& BTextWriter::Write(const Char* str)
+{
+#ifdef __DEBUG__
+ if (!str || *str == 0)
+ return *this;
+
+ CharacterTypeUTF16 strTmp[2];
+ strTmp[1] = 0;
+
+ for (size_t i = 0; str[i] != 0; i++)
+ {
+ if (str[i] == '\r')
+ {
+ strTmp[0] = str[i];
+ ST->ConOut->OutputString(ST->ConOut, strTmp);
+
+ strTmp[0] = '\n';
+ ST->ConOut->OutputString(ST->ConOut, strTmp);
+ }
+ else
+ {
+ strTmp[0] = str[i];
+ ST->ConOut->OutputString(ST->ConOut, strTmp);
+ }
+ }
+#endif // ifdef __DEBUG__
+
+ return *this;
+}
+
+/**
+@brief putc wrapper over EFI ConOut.
+*/
+BTextWriter& BTextWriter::WriteCharacter(CharacterTypeUTF16 c)
+{
+#ifdef __DEBUG__
+ EfiCharType str[2];
+
+ str[0] = c;
+ str[1] = 0;
+ ST->ConOut->OutputString(ST->ConOut, str);
+#endif // ifdef __DEBUG__
+
+ return *this;
+}
+
+BTextWriter& BTextWriter::Write(const Long& x)
+{
+#ifdef __DEBUG__
+ this->Write(L"0x");
+ this->_Write(x);
+
+#endif // ifdef __DEBUG__
+
+ return *this;
+}
+
+BTextWriter& BTextWriter::_Write(const Long& x)
+{
+#ifdef __DEBUG__
+ UInt64 y = (x > 0 ? x : -x) / 16;
+ UInt64 h = (x > 0 ? x : -x) % 16;
+
+ if (y)
+ this->_Write(y);
+
+ /* fail if the hex number is not base-16 */
+ if (h > 15)
+ {
+ this->WriteCharacter('?');
+ return *this;
+ }
+
+ if (y < 0)
+ y = -y;
+
+ const char NUMBERS[17] = "0123456789ABCDEF";
+
+ this->WriteCharacter(NUMBERS[h]);
+#endif // ifdef __DEBUG__
+
+ return *this;
+}
diff --git a/Boot/Source/HEL/AMD64/New+Delete.cxx b/Boot/Source/HEL/AMD64/New+Delete.cxx
new file mode 100644
index 00000000..3316ac1d
--- /dev/null
+++ b/Boot/Source/HEL/AMD64/New+Delete.cxx
@@ -0,0 +1,51 @@
+/* -------------------------------------------
+
+ Copyright SoftwareLabs
+
+------------------------------------------- */
+
+#include <BootKit/Platform.hxx>
+#include <BootKit/Protocol.hxx>
+#include <BootKit/BootKit.hxx>
+#include <cstddef> /* Since we're using GCC for this EFI program. */
+
+#ifdef __STANDALONE__
+
+/// @brief Allocates a new object.
+/// @param sz the size.
+/// @return
+void* operator new(size_t sz)
+{
+ void* buf = nullptr;
+ BS->AllocatePool(EfiMemoryType::EfiLoaderData, sz, &buf);
+
+ return buf;
+}
+
+/// @brief Allocates a new object.
+/// @param sz the size.
+/// @return
+void* operator new[](size_t sz)
+{
+ void* buf = nullptr;
+ BS->AllocatePool(EfiMemoryType::EfiLoaderData, sz, &buf);
+
+ return buf;
+}
+
+/// @brief Deletes the object.
+/// @param buf the object.
+void operator delete(void* buf)
+{
+ BS->FreePool(buf);
+}
+
+/// @brief Deletes the object (array specific).
+/// @param buf the object.
+/// @param size it's size.
+void operator delete(void* buf, size_t size)
+{
+ BS->FreePool(buf);
+}
+
+#endif // Inactive
diff --git a/Boot/Source/HEL/AMD64/Support.cxx b/Boot/Source/HEL/AMD64/Support.cxx
new file mode 100644
index 00000000..12c136f8
--- /dev/null
+++ b/Boot/Source/HEL/AMD64/Support.cxx
@@ -0,0 +1,62 @@
+/* -------------------------------------------
+
+ Copyright SoftwareLabs
+
+------------------------------------------- */
+
+#include <FirmwareKit/EFI/EFI.hxx>
+#include <FirmwareKit/Handover.hxx>
+#include <BootKit/Vendor/Support.hxx>
+
+#ifdef __STANDALONE__
+
+/// @brief memset definition in C++.
+/// @param dst destination pointer.
+/// @param byte value to fill in.
+/// @param len length of of src.
+EXTERN_C VoidPtr memset(void* dst, int byte, long long unsigned int len)
+{
+ for (size_t i = 0UL; i < len; ++i)
+ {
+ ((int*)dst)[i] = byte;
+ }
+
+ return dst;
+}
+
+/// @brief memcpy definition in C++.
+/// @param dst destination pointer.
+/// @param src source pointer.
+/// @param len length of of src.
+EXTERN_C VoidPtr memcpy(void* dst, const void* src, long long unsigned int len)
+{
+ for (size_t i = 0UL; i < len; ++i)
+ {
+ ((int*)dst)[i] = ((int*)src)[i];
+ }
+
+ return dst;
+}
+
+/// @brief strlen definition in C++.
+EXTERN_C size_t strlen(const char* whatToCheck)
+{
+ if (!whatToCheck || *whatToCheck == 0)
+ return 0;
+
+ SizeT len = 0;
+
+ while (whatToCheck[len] != 0)
+ {
+ ++len;
+ }
+
+ return len;
+}
+
+/// @brief somthing specific to the microsoft ABI, regarding checking the stack.
+EXTERN_C void ___chkstk_ms(void)
+{
+}
+
+#endif
diff --git a/Boot/Source/HEL/AMD64/compile_flags.txt b/Boot/Source/HEL/AMD64/compile_flags.txt
new file mode 100644
index 00000000..e4515efe
--- /dev/null
+++ b/Boot/Source/HEL/AMD64/compile_flags.txt
@@ -0,0 +1,3 @@
+-std=c++20
+-I../../../
+-I../../../../
diff --git a/Boot/Source/HEL/ARM64/.gitkeep b/Boot/Source/HEL/ARM64/.gitkeep
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/Boot/Source/HEL/ARM64/.gitkeep
diff --git a/Boot/Source/HEL/POWER/.gitkeep b/Boot/Source/HEL/POWER/.gitkeep
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/Boot/Source/HEL/POWER/.gitkeep
diff --git a/Boot/Source/HEL/POWER/CoreBootStartup.S b/Boot/Source/HEL/POWER/CoreBootStartup.S
new file mode 100644
index 00000000..f8ff99d7
--- /dev/null
+++ b/Boot/Source/HEL/POWER/CoreBootStartup.S
@@ -0,0 +1,34 @@
+/* -------------------------------------------
+
+ Copyright SoftwareLabs
+
+------------------------------------------- */
+
+.section .boot_hdr
+.align 4
+
+/* NewBoot boot header begin */
+
+boot_hdr_mag:
+ .ascii "CB"
+boot_hdr_name:
+ // it has to match ten bytes.
+ .asciz "NewBoot\0\0\0"
+boot_hdr_ver:
+ .word 0x104
+boot_hdr_proc:
+ .long bootloader_start
+
+/* NewOS boot header end */
+
+.extern bootloader_main
+.extern bootloader_stack
+
+.globl bootloader_start
+bootloader_start:
+ mflr 4 /* real address of .Laddr */
+ lwz 0,(bootloader_stack-bootloader_start)(4) /* stack address location */
+ mr 1,0 /* use user defined stack */
+
+ bl bootloader_main
+ blr
diff --git a/Boot/Source/HEL/RISCV/.gitkeep b/Boot/Source/HEL/RISCV/.gitkeep
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/Boot/Source/HEL/RISCV/.gitkeep
diff --git a/Boot/Source/HEL/RISCV/BootRISCV.S b/Boot/Source/HEL/RISCV/BootRISCV.S
new file mode 100644
index 00000000..7a7e7db0
--- /dev/null
+++ b/Boot/Source/HEL/RISCV/BootRISCV.S
@@ -0,0 +1,22 @@
+/* -------------------------------------------
+
+ Copyright SoftwareLabs
+
+------------------------------------------- */
+
+.section .init
+.align 4
+
+/* NewOS kernel header begin */
+
+k_hdr_mag:
+ .ascii "LX"
+k_hdr_name:
+ // it has to match ten bytes.
+ .asciz "New OS\0\0\0\0"
+k_hdr_ver:
+ .word 0x104
+k_hdr_proc:
+ .long __bootloader_start
+
+/* end */ \ No newline at end of file
diff --git a/Boot/Source/Root/EFI/STARTUP.NSH b/Boot/Source/Root/EFI/STARTUP.NSH
new file mode 100644
index 00000000..d29ba8fd
--- /dev/null
+++ b/Boot/Source/Root/EFI/STARTUP.NSH
@@ -0,0 +1,2 @@
+fs0:
+BOOT\BOOTX64.EFI
diff --git a/Boot/Source/Root/SplashScreen.fmt b/Boot/Source/Root/SplashScreen.fmt
new file mode 100644
index 00000000..863d7b62
--- /dev/null
+++ b/Boot/Source/Root/SplashScreen.fmt
@@ -0,0 +1,7 @@
+==================================================================
+Welcome to NeWS.
+Brought to you by: Amlal EL Mahrouss.
+* NewBoot, NewKernel: Amlal EL Mahrouss.
+This copy can boot directly to NewKernel (Unified System).
+Copyright SoftwareLabs, all rights reserved.
+==================================================================
diff --git a/Boot/Source/compile_flags.txt b/Boot/Source/compile_flags.txt
new file mode 100644
index 00000000..c74d22b2
--- /dev/null
+++ b/Boot/Source/compile_flags.txt
@@ -0,0 +1,4 @@
+-std=c++20
+-I../
+-I../../
+-D__NEWOS_AMD64__
diff --git a/Boot/Source/makefile b/Boot/Source/makefile
new file mode 100644
index 00000000..70fa7232
--- /dev/null
+++ b/Boot/Source/makefile
@@ -0,0 +1,106 @@
+##################################################
+# (C) SoftwareLabs, all rights reserved.
+# This is the bootloader makefile.
+##################################################
+
+CC_GNU=x86_64-w64-mingw32-g++
+LD_GNU=x86_64-w64-mingw32-ld
+
+WINDRES=x86_64-w64-mingw32-windres
+
+ADD_FILE=touch
+COPY=cp
+HTTP_GET=wget
+
+ifeq ($(shell uname), Windows_NT)
+EMU=qemu-system-x86_64w
+else
+EMU=qemu-system-x86_64
+endif
+
+ifeq ($(NEWS_MODEL), )
+NEWOS_MODEL=-DkMachineModel="\"Generic NeWS HD\""
+endif
+
+IMG=epm.img
+IMG_2=epm-slave.img
+
+EMU_FLAGS=-net none -smp 4 -m 8G -M q35 \
+ -bios OVMF.fd -device piix3-ide,id=ide \
+ -drive id=disk,file=$(IMG),format=raw,if=none \
+ -device ide-hd,drive=disk,bus=ide.0 -drive \
+ file=fat:rw:Root,index=2,format=raw -d int -hdd epm-slave.img
+
+LD_FLAGS=-e Main --subsystem=10
+
+ifeq ($(NEWS_STANDLONE), )
+OBJ=*.o ../../Kernel/Objects/*.obj
+else
+RESCMD=$(WINDRES) BootloaderRsrc.rsrc -O coff -o BootloaderRsrc.o
+STANDALONE_MACRO=-D__STANDALONE__
+OBJ=*.o
+endif
+
+REM=rm
+REM_FLAG=-f
+
+FLAG_ASM=-f win64
+FLAG_GNU=-fshort-wchar -D__EFI_x86_64__ -mno-red-zone -D__KERNEL__ -D__NEWBOOT__ \
+ -DEFI_FUNCTION_WRAPPER -I../ -I../../Kernel -I./ -c -nostdlib -fno-rtti -fno-exceptions \
+ -std=c++20 -D__HAVE_MAHROUSS_APIS__ -D__MAHROUSS__ -D__BOOTLOADER__ -I./
+
+BOOT_LOADER=NewBoot.exe
+KERNEL=NewKernel.exe
+
+.PHONY: invalid-recipe
+invalid-recipe:
+ @echo "invalid-recipe: Use make compile-<arch> instead."
+
+.PHONY: all
+all: compile-amd64
+ mkdir -p Root/EFI/BOOT
+ $(LD_GNU) $(OBJ) $(LD_FLAGS) -o $(BOOT_LOADER)
+ $(COPY) $(BOOT_LOADER) Root/EFI/BOOT/BOOTX64.EFI
+ $(COPY) $(BOOT_LOADER) Root/EFI/BOOT/NEWBOOT.EFI
+ $(COPY) ../../Kernel/$(KERNEL) Root/$(KERNEL)
+
+ifneq ($(DEBUG_SUPPORT), )
+DEBUG = -D__DEBUG__
+endif
+
+.PHONY: compile-amd64
+compile-amd64:
+ $(RESCMD)
+ $(CC_GNU) $(NEWOS_MODEL) $(STANDALONE_MACRO) $(FLAG_GNU) $(DEBUG) $(wildcard HEL/AMD64/*.cxx) $(wildcard HEL/AMD64/*.S) $(wildcard *.cxx)
+
+.PHONY: run-efi-amd64
+run-efi-amd64:
+ $(EMU) $(EMU_FLAGS)
+
+# img_2 is the rescue disk. img is the bootable disk, as provided by the NeWS.
+.PHONY: epm-img
+epm-img:
+ qemu-img create -f raw $(IMG) 10G
+ qemu-img create -f raw $(IMG_2) 512M
+
+.PHONY: download-edk
+download-edk:
+ $(HTTP_GET) https://retrage.github.io/edk2-nightly/bin/DEBUGX64_OVMF.fd -O OVMF.fd
+
+BINS=*.bin
+EXECUTABLES=NewBoot.exe NewKernel.exe OVMF.fd
+
+TARGETS=$(REM_FLAG) $(OBJ) $(BIN) $(IMG) $(IMG_2) $(EXECUTABLES)
+
+.PHONY: clean
+clean:
+ $(REM) $(TARGETS)
+
+.PHONY: help
+help:
+ @echo "=== HELP ==="
+ @echo "epm-img: Format a disk using the Explicit Partition Map."
+ @echo "gpt-img: Format a disk using the Explicit Partition Map."
+ @echo "clean: clean bootloader."
+ @echo "bootloader-amd64: Build bootloader. (PC AMD64)"
+ @echo "run-efi-amd64: Run bootloader. (PC AMD64)"
diff --git a/Boot/Source/ovmf.ps1 b/Boot/Source/ovmf.ps1
new file mode 100644
index 00000000..5a2c5f0e
--- /dev/null
+++ b/Boot/Source/ovmf.ps1
@@ -0,0 +1,4 @@
+$client = new-object System.Net.WebClient
+$output = "$PSScriptRoot\OVMF.fd"
+
+$client.DownloadFile("https://retrage.github.io/edk2-nightly/bin/DEBUGX64_OVMF.fd", $output)