From 0c211cca4d7a4d836f4cb685345e44f3f2814fd1 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Tue, 21 May 2024 09:10:57 +0200 Subject: MHR-23: New CoreSystem calls and refactors. Signed-off-by: Amlal El Mahrouss --- Boot/Source/.gitkeep | 0 Boot/Source/BootloaderRsrc.rsrc | 27 --- Boot/Source/HEL/AMD64/.gitkeep | 0 Boot/Source/HEL/AMD64/BootAHCI.cxx | 20 --- Boot/Source/HEL/AMD64/BootATA.cxx | 276 ------------------------------ Boot/Source/HEL/AMD64/BootFileReader.cxx | 173 ------------------- Boot/Source/HEL/AMD64/BootJump.S | 9 - Boot/Source/HEL/AMD64/BootMain.cxx | 245 -------------------------- Boot/Source/HEL/AMD64/BootPlatform.cxx | 102 ----------- Boot/Source/HEL/AMD64/BootString.cxx | 92 ---------- Boot/Source/HEL/AMD64/BootTextWriter.cxx | 140 --------------- Boot/Source/HEL/AMD64/New+Delete.cxx | 51 ------ Boot/Source/HEL/AMD64/Support.cxx | 62 ------- Boot/Source/HEL/AMD64/compile_flags.txt | 3 - Boot/Source/HEL/ARM64/.gitkeep | 0 Boot/Source/HEL/POWER/.gitkeep | 0 Boot/Source/HEL/POWER/CoreBootStartup.S | 34 ---- Boot/Source/HEL/RISCV/.gitkeep | 0 Boot/Source/HEL/RISCV/BootRISCV.S | 22 --- Boot/Source/Root/EFI/STARTUP.NSH | 2 - Boot/Source/Root/SplashScreen.fmt | 7 - Boot/Source/compile_flags.txt | 4 - Boot/Source/ovmf.ps1 | 4 - Boot/Sources/.gitkeep | 0 Boot/Sources/BootloaderRsrc.rsrc | 27 +++ Boot/Sources/HEL/AMD64/.gitkeep | 0 Boot/Sources/HEL/AMD64/BootAHCI.cxx | 20 +++ Boot/Sources/HEL/AMD64/BootATA.cxx | 276 ++++++++++++++++++++++++++++++ Boot/Sources/HEL/AMD64/BootFileReader.cxx | 173 +++++++++++++++++++ Boot/Sources/HEL/AMD64/BootJump.S | 9 + Boot/Sources/HEL/AMD64/BootMain.cxx | 245 ++++++++++++++++++++++++++ Boot/Sources/HEL/AMD64/BootPlatform.cxx | 102 +++++++++++ Boot/Sources/HEL/AMD64/BootString.cxx | 92 ++++++++++ Boot/Sources/HEL/AMD64/BootTextWriter.cxx | 140 +++++++++++++++ Boot/Sources/HEL/AMD64/New+Delete.cxx | 51 ++++++ Boot/Sources/HEL/AMD64/Support.cxx | 62 +++++++ Boot/Sources/HEL/AMD64/compile_flags.txt | 3 + Boot/Sources/HEL/ARM64/.gitkeep | 0 Boot/Sources/HEL/POWER/.gitkeep | 0 Boot/Sources/HEL/POWER/CoreBootStartup.S | 34 ++++ Boot/Sources/HEL/RISCV/.gitkeep | 0 Boot/Sources/HEL/RISCV/BootRISCV.S | 22 +++ Boot/Sources/Root/EFI/STARTUP.NSH | 2 + Boot/Sources/Root/SplashScreen.fmt | 7 + Boot/Sources/compile_flags.txt | 4 + Boot/Sources/ovmf.ps1 | 4 + Boot/makefile | 20 +-- 47 files changed, 1283 insertions(+), 1283 deletions(-) delete mode 100644 Boot/Source/.gitkeep delete mode 100644 Boot/Source/BootloaderRsrc.rsrc delete mode 100644 Boot/Source/HEL/AMD64/.gitkeep delete mode 100644 Boot/Source/HEL/AMD64/BootAHCI.cxx delete mode 100644 Boot/Source/HEL/AMD64/BootATA.cxx delete mode 100644 Boot/Source/HEL/AMD64/BootFileReader.cxx delete mode 100644 Boot/Source/HEL/AMD64/BootJump.S delete mode 100644 Boot/Source/HEL/AMD64/BootMain.cxx delete mode 100644 Boot/Source/HEL/AMD64/BootPlatform.cxx delete mode 100644 Boot/Source/HEL/AMD64/BootString.cxx delete mode 100644 Boot/Source/HEL/AMD64/BootTextWriter.cxx delete mode 100644 Boot/Source/HEL/AMD64/New+Delete.cxx delete mode 100644 Boot/Source/HEL/AMD64/Support.cxx delete mode 100644 Boot/Source/HEL/AMD64/compile_flags.txt delete mode 100644 Boot/Source/HEL/ARM64/.gitkeep delete mode 100644 Boot/Source/HEL/POWER/.gitkeep delete mode 100644 Boot/Source/HEL/POWER/CoreBootStartup.S delete mode 100644 Boot/Source/HEL/RISCV/.gitkeep delete mode 100644 Boot/Source/HEL/RISCV/BootRISCV.S delete mode 100644 Boot/Source/Root/EFI/STARTUP.NSH delete mode 100644 Boot/Source/Root/SplashScreen.fmt delete mode 100644 Boot/Source/compile_flags.txt delete mode 100644 Boot/Source/ovmf.ps1 create mode 100644 Boot/Sources/.gitkeep create mode 100644 Boot/Sources/BootloaderRsrc.rsrc create mode 100644 Boot/Sources/HEL/AMD64/.gitkeep create mode 100644 Boot/Sources/HEL/AMD64/BootAHCI.cxx create mode 100644 Boot/Sources/HEL/AMD64/BootATA.cxx create mode 100644 Boot/Sources/HEL/AMD64/BootFileReader.cxx create mode 100644 Boot/Sources/HEL/AMD64/BootJump.S create mode 100644 Boot/Sources/HEL/AMD64/BootMain.cxx create mode 100644 Boot/Sources/HEL/AMD64/BootPlatform.cxx create mode 100644 Boot/Sources/HEL/AMD64/BootString.cxx create mode 100644 Boot/Sources/HEL/AMD64/BootTextWriter.cxx create mode 100644 Boot/Sources/HEL/AMD64/New+Delete.cxx create mode 100644 Boot/Sources/HEL/AMD64/Support.cxx create mode 100644 Boot/Sources/HEL/AMD64/compile_flags.txt create mode 100644 Boot/Sources/HEL/ARM64/.gitkeep create mode 100644 Boot/Sources/HEL/POWER/.gitkeep create mode 100644 Boot/Sources/HEL/POWER/CoreBootStartup.S create mode 100644 Boot/Sources/HEL/RISCV/.gitkeep create mode 100644 Boot/Sources/HEL/RISCV/BootRISCV.S create mode 100644 Boot/Sources/Root/EFI/STARTUP.NSH create mode 100644 Boot/Sources/Root/SplashScreen.fmt create mode 100644 Boot/Sources/compile_flags.txt create mode 100644 Boot/Sources/ovmf.ps1 (limited to 'Boot') diff --git a/Boot/Source/.gitkeep b/Boot/Source/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/Boot/Source/BootloaderRsrc.rsrc b/Boot/Source/BootloaderRsrc.rsrc deleted file mode 100644 index 0282192b..00000000 --- a/Boot/Source/BootloaderRsrc.rsrc +++ /dev/null @@ -1,27 +0,0 @@ -#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", "NewOSLdr.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 deleted file mode 100644 index e69de29b..00000000 diff --git a/Boot/Source/HEL/AMD64/BootAHCI.cxx b/Boot/Source/HEL/AMD64/BootAHCI.cxx deleted file mode 100644 index d60b91fd..00000000 --- a/Boot/Source/HEL/AMD64/BootAHCI.cxx +++ /dev/null @@ -1,20 +0,0 @@ -/* ------------------------------------------- - - 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 -#include -#include diff --git a/Boot/Source/HEL/AMD64/BootATA.cxx b/Boot/Source/HEL/AMD64/BootATA.cxx deleted file mode 100644 index c82cb2ea..00000000 --- a/Boot/Source/HEL/AMD64/BootATA.cxx +++ /dev/null @@ -1,276 +0,0 @@ -/* ------------------------------------------- - - 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 -#include -#include - -/// 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 deleted file mode 100644 index 7ec6b7ab..00000000 --- a/Boot/Source/HEL/AMD64/BootFileReader.cxx +++ /dev/null @@ -1,173 +0,0 @@ -/* ------------------------------------------- - - Copyright SoftwareLabs - - File: FileReader.cxx - Purpose: New Boot FileReader, - Read complete file and store it in a buffer. - -------------------------------------------- */ - -#include -#include -#include -#include -#include -#include - -/// @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 deleted file mode 100644 index af278cc7..00000000 --- a/Boot/Source/HEL/AMD64/BootJump.S +++ /dev/null @@ -1,9 +0,0 @@ -.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 deleted file mode 100644 index f58709be..00000000 --- a/Boot/Source/HEL/AMD64/BootMain.cxx +++ /dev/null @@ -1,245 +0,0 @@ -/* ------------------------------------------- - - Copyright SoftwareLabs - -------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/// 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) - { - Char* vendorTable = reinterpret_cast( - 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] == ' ') - { - writer.Write(L"New Boot: Found ACPI RSD PTR!\r"); - 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 diskFormatter; - - /// if not formated yet, then format it with the following folders: - /// /, /Boot, /Applications. - if (!diskFormatter.IsPartitionValid()) - { - BDiskFormatFactory::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 deleted file mode 100644 index 866c4839..00000000 --- a/Boot/Source/HEL/AMD64/BootPlatform.cxx +++ /dev/null @@ -1,102 +0,0 @@ -/* ------------------------------------------- - - Copyright SoftwareLabs - -------------------------------------------- */ - -#include -#include -#include -#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 deleted file mode 100644 index 54ab2c64..00000000 --- a/Boot/Source/HEL/AMD64/BootString.cxx +++ /dev/null @@ -1,92 +0,0 @@ -/* ------------------------------------------- - - Copyright SoftwareLabs - - File: String.cxx - Purpose: NewBoot string library - - Revision History: - - - -------------------------------------------- */ - -#include -#include -#include - -/// 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 deleted file mode 100644 index 90d12f3d..00000000 --- a/Boot/Source/HEL/AMD64/BootTextWriter.cxx +++ /dev/null @@ -1,140 +0,0 @@ -/* ------------------------------------------- - - Copyright SoftwareLabs - - File: String.cxx - Purpose: NewBoot string library - - Revision History: - - - -------------------------------------------- */ - -#include -#include -#include -#include - -/// 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 deleted file mode 100644 index 6c025646..00000000 --- a/Boot/Source/HEL/AMD64/New+Delete.cxx +++ /dev/null @@ -1,51 +0,0 @@ -/* ------------------------------------------- - - Copyright SoftwareLabs - -------------------------------------------- */ - -#include -#include -#include -#include /* 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 deleted file mode 100644 index 22b01280..00000000 --- a/Boot/Source/HEL/AMD64/Support.cxx +++ /dev/null @@ -1,62 +0,0 @@ -/* ------------------------------------------- - - Copyright SoftwareLabs - -------------------------------------------- */ - -#include -#include -#include - -#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 deleted file mode 100644 index e4515efe..00000000 --- a/Boot/Source/HEL/AMD64/compile_flags.txt +++ /dev/null @@ -1,3 +0,0 @@ --std=c++20 --I../../../ --I../../../../ diff --git a/Boot/Source/HEL/ARM64/.gitkeep b/Boot/Source/HEL/ARM64/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/Boot/Source/HEL/POWER/.gitkeep b/Boot/Source/HEL/POWER/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/Boot/Source/HEL/POWER/CoreBootStartup.S b/Boot/Source/HEL/POWER/CoreBootStartup.S deleted file mode 100644 index f8ff99d7..00000000 --- a/Boot/Source/HEL/POWER/CoreBootStartup.S +++ /dev/null @@ -1,34 +0,0 @@ -/* ------------------------------------------- - - 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 deleted file mode 100644 index e69de29b..00000000 diff --git a/Boot/Source/HEL/RISCV/BootRISCV.S b/Boot/Source/HEL/RISCV/BootRISCV.S deleted file mode 100644 index 7a7e7db0..00000000 --- a/Boot/Source/HEL/RISCV/BootRISCV.S +++ /dev/null @@ -1,22 +0,0 @@ -/* ------------------------------------------- - - 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 deleted file mode 100644 index d29ba8fd..00000000 --- a/Boot/Source/Root/EFI/STARTUP.NSH +++ /dev/null @@ -1,2 +0,0 @@ -fs0: -BOOT\BOOTX64.EFI diff --git a/Boot/Source/Root/SplashScreen.fmt b/Boot/Source/Root/SplashScreen.fmt deleted file mode 100644 index 863d7b62..00000000 --- a/Boot/Source/Root/SplashScreen.fmt +++ /dev/null @@ -1,7 +0,0 @@ -================================================================== -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 deleted file mode 100644 index c74d22b2..00000000 --- a/Boot/Source/compile_flags.txt +++ /dev/null @@ -1,4 +0,0 @@ --std=c++20 --I../ --I../../ --D__NEWOS_AMD64__ diff --git a/Boot/Source/ovmf.ps1 b/Boot/Source/ovmf.ps1 deleted file mode 100644 index 5a2c5f0e..00000000 --- a/Boot/Source/ovmf.ps1 +++ /dev/null @@ -1,4 +0,0 @@ -$client = new-object System.Net.WebClient -$output = "$PSScriptRoot\OVMF.fd" - -$client.DownloadFile("https://retrage.github.io/edk2-nightly/bin/DEBUGX64_OVMF.fd", $output) diff --git a/Boot/Sources/.gitkeep b/Boot/Sources/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Boot/Sources/BootloaderRsrc.rsrc b/Boot/Sources/BootloaderRsrc.rsrc new file mode 100644 index 00000000..0282192b --- /dev/null +++ b/Boot/Sources/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", "NewOSLdr.exe" + VALUE "ProductName", "NewBoot" + VALUE "ProductVersion", BOOTLOADER_VERSION + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x809, 1252 + END +END diff --git a/Boot/Sources/HEL/AMD64/.gitkeep b/Boot/Sources/HEL/AMD64/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Boot/Sources/HEL/AMD64/BootAHCI.cxx b/Boot/Sources/HEL/AMD64/BootAHCI.cxx new file mode 100644 index 00000000..d60b91fd --- /dev/null +++ b/Boot/Sources/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 +#include +#include diff --git a/Boot/Sources/HEL/AMD64/BootATA.cxx b/Boot/Sources/HEL/AMD64/BootATA.cxx new file mode 100644 index 00000000..c82cb2ea --- /dev/null +++ b/Boot/Sources/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 +#include +#include + +/// 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/Sources/HEL/AMD64/BootFileReader.cxx b/Boot/Sources/HEL/AMD64/BootFileReader.cxx new file mode 100644 index 00000000..7ec6b7ab --- /dev/null +++ b/Boot/Sources/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 +#include +#include +#include +#include +#include + +/// @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/Sources/HEL/AMD64/BootJump.S b/Boot/Sources/HEL/AMD64/BootJump.S new file mode 100644 index 00000000..af278cc7 --- /dev/null +++ b/Boot/Sources/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/Sources/HEL/AMD64/BootMain.cxx b/Boot/Sources/HEL/AMD64/BootMain.cxx new file mode 100644 index 00000000..f58709be --- /dev/null +++ b/Boot/Sources/HEL/AMD64/BootMain.cxx @@ -0,0 +1,245 @@ +/* ------------------------------------------- + + Copyright SoftwareLabs + +------------------------------------------- */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/// 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) + { + Char* vendorTable = reinterpret_cast( + 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] == ' ') + { + writer.Write(L"New Boot: Found ACPI RSD PTR!\r"); + 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 diskFormatter; + + /// if not formated yet, then format it with the following folders: + /// /, /Boot, /Applications. + if (!diskFormatter.IsPartitionValid()) + { + BDiskFormatFactory::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/Sources/HEL/AMD64/BootPlatform.cxx b/Boot/Sources/HEL/AMD64/BootPlatform.cxx new file mode 100644 index 00000000..866c4839 --- /dev/null +++ b/Boot/Sources/HEL/AMD64/BootPlatform.cxx @@ -0,0 +1,102 @@ +/* ------------------------------------------- + + Copyright SoftwareLabs + +------------------------------------------- */ + +#include +#include +#include +#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/Sources/HEL/AMD64/BootString.cxx b/Boot/Sources/HEL/AMD64/BootString.cxx new file mode 100644 index 00000000..54ab2c64 --- /dev/null +++ b/Boot/Sources/HEL/AMD64/BootString.cxx @@ -0,0 +1,92 @@ +/* ------------------------------------------- + + Copyright SoftwareLabs + + File: String.cxx + Purpose: NewBoot string library + + Revision History: + + + +------------------------------------------- */ + +#include +#include +#include + +/// 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/Sources/HEL/AMD64/BootTextWriter.cxx b/Boot/Sources/HEL/AMD64/BootTextWriter.cxx new file mode 100644 index 00000000..90d12f3d --- /dev/null +++ b/Boot/Sources/HEL/AMD64/BootTextWriter.cxx @@ -0,0 +1,140 @@ +/* ------------------------------------------- + + Copyright SoftwareLabs + + File: String.cxx + Purpose: NewBoot string library + + Revision History: + + + +------------------------------------------- */ + +#include +#include +#include +#include + +/// 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/Sources/HEL/AMD64/New+Delete.cxx b/Boot/Sources/HEL/AMD64/New+Delete.cxx new file mode 100644 index 00000000..6c025646 --- /dev/null +++ b/Boot/Sources/HEL/AMD64/New+Delete.cxx @@ -0,0 +1,51 @@ +/* ------------------------------------------- + + Copyright SoftwareLabs + +------------------------------------------- */ + +#include +#include +#include +#include /* 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/Sources/HEL/AMD64/Support.cxx b/Boot/Sources/HEL/AMD64/Support.cxx new file mode 100644 index 00000000..22b01280 --- /dev/null +++ b/Boot/Sources/HEL/AMD64/Support.cxx @@ -0,0 +1,62 @@ +/* ------------------------------------------- + + Copyright SoftwareLabs + +------------------------------------------- */ + +#include +#include +#include + +#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/Sources/HEL/AMD64/compile_flags.txt b/Boot/Sources/HEL/AMD64/compile_flags.txt new file mode 100644 index 00000000..e4515efe --- /dev/null +++ b/Boot/Sources/HEL/AMD64/compile_flags.txt @@ -0,0 +1,3 @@ +-std=c++20 +-I../../../ +-I../../../../ diff --git a/Boot/Sources/HEL/ARM64/.gitkeep b/Boot/Sources/HEL/ARM64/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Boot/Sources/HEL/POWER/.gitkeep b/Boot/Sources/HEL/POWER/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Boot/Sources/HEL/POWER/CoreBootStartup.S b/Boot/Sources/HEL/POWER/CoreBootStartup.S new file mode 100644 index 00000000..f8ff99d7 --- /dev/null +++ b/Boot/Sources/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/Sources/HEL/RISCV/.gitkeep b/Boot/Sources/HEL/RISCV/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Boot/Sources/HEL/RISCV/BootRISCV.S b/Boot/Sources/HEL/RISCV/BootRISCV.S new file mode 100644 index 00000000..7a7e7db0 --- /dev/null +++ b/Boot/Sources/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/Sources/Root/EFI/STARTUP.NSH b/Boot/Sources/Root/EFI/STARTUP.NSH new file mode 100644 index 00000000..d29ba8fd --- /dev/null +++ b/Boot/Sources/Root/EFI/STARTUP.NSH @@ -0,0 +1,2 @@ +fs0: +BOOT\BOOTX64.EFI diff --git a/Boot/Sources/Root/SplashScreen.fmt b/Boot/Sources/Root/SplashScreen.fmt new file mode 100644 index 00000000..863d7b62 --- /dev/null +++ b/Boot/Sources/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/Sources/compile_flags.txt b/Boot/Sources/compile_flags.txt new file mode 100644 index 00000000..c74d22b2 --- /dev/null +++ b/Boot/Sources/compile_flags.txt @@ -0,0 +1,4 @@ +-std=c++20 +-I../ +-I../../ +-D__NEWOS_AMD64__ diff --git a/Boot/Sources/ovmf.ps1 b/Boot/Sources/ovmf.ps1 new file mode 100644 index 00000000..5a2c5f0e --- /dev/null +++ b/Boot/Sources/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) diff --git a/Boot/makefile b/Boot/makefile index 4b4ca293..63883321 100644 --- a/Boot/makefile +++ b/Boot/makefile @@ -27,10 +27,10 @@ IMG=epm.img IMG_2=epm-slave.img EMU_FLAGS=-net none -smp 4,sockets=1,cores=4,threads=1 -m 4G -M q35 \ - -bios Source/$(BIOS) -device piix3-ide,id=ide \ + -bios Sources/$(BIOS) -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:Source/Root,index=2,format=raw -d int -hdd $(IMG_2) + file=fat:rw:Sources/Root,index=2,format=raw -d int -hdd $(IMG_2) LD_FLAGS=-e Main --subsystem=10 @@ -59,11 +59,11 @@ invalid-recipe: .PHONY: all all: compile-amd64 - mkdir -p Source/Root/EFI/BOOT - $(LD_GNU) $(OBJ) $(LD_FLAGS) -o Source/$(BOOT_LOADER) - $(COPY) Source/$(BOOT_LOADER) Source/Root/EFI/BOOT/BOOTX64.EFI - $(COPY) Source/$(BOOT_LOADER) Source/Root/EFI/BOOT/NEWBOOT.EFI - $(COPY) ../Kernel/$(KERNEL) Source/Root/$(KERNEL) + mkdir -p Sources/Root/EFI/BOOT + $(LD_GNU) $(OBJ) $(LD_FLAGS) -o Sources/$(BOOT_LOADER) + $(COPY) Sources/$(BOOT_LOADER) Sources/Root/EFI/BOOT/BOOTX64.EFI + $(COPY) Sources/$(BOOT_LOADER) Sources/Root/EFI/BOOT/NEWBOOT.EFI + $(COPY) ../Kernel/$(KERNEL) Sources/Root/$(KERNEL) ifneq ($(DEBUG_SUPPORT), ) DEBUG = -D__DEBUG__ @@ -73,9 +73,9 @@ endif compile-amd64: $(RESCMD) $(CC_GNU) $(NEWOS_MODEL) $(STANDALONE_MACRO) $(FLAG_GNU) $(DEBUG) \ - $(wildcard Source/HEL/AMD64/*.cxx) \ - $(wildcard Source/HEL/AMD64/*.S) - $(wildcard Source/*.cxx) + $(wildcard Sources/HEL/AMD64/*.cxx) \ + $(wildcard Sources/HEL/AMD64/*.S) + $(wildcard Sources/*.cxx) .PHONY: run-efi-amd64 run-efi-amd64: -- cgit v1.2.3