diff options
| -rw-r--r-- | Private/EFIKit/Api.hxx | 6 | ||||
| -rw-r--r-- | Private/EFIKit/EFI.hxx | 17 | ||||
| -rw-r--r-- | Private/FSKit/NewFS.hxx | 27 | ||||
| -rw-r--r-- | Private/NewBoot/BootKit/Arch/ATA.hxx | 4 | ||||
| -rw-r--r-- | Private/NewBoot/BootKit/BootKit.hxx | 5 | ||||
| -rw-r--r-- | Private/NewBoot/Source/HEL/AMD64/ATA.cxx | 22 | ||||
| -rw-r--r-- | Private/NewBoot/Source/HEL/AMD64/BootKit.cxx | 40 | ||||
| -rw-r--r-- | Private/NewBoot/Source/HEL/AMD64/Entrypoint.cxx | 3 | ||||
| -rw-r--r-- | Private/NewBoot/Source/makefile | 1 |
9 files changed, 84 insertions, 41 deletions
diff --git a/Private/EFIKit/Api.hxx b/Private/EFIKit/Api.hxx index b08c2866..dea09425 100644 --- a/Private/EFIKit/Api.hxx +++ b/Private/EFIKit/Api.hxx @@ -7,8 +7,8 @@ * ======================================================== */ -#ifndef __EFI_LIB__ -#define __EFI_LIB__ +#ifndef __EFI_API__ +#define __EFI_API__ #include <EFIKit/EFI.hxx> @@ -72,4 +72,4 @@ enum { #include <BootKit/Platform.hxx> #endif // IF TARGET=BOOTLOADER -#endif /* ifndef __EFI_LIB__ */ +#endif /* ifndef __EFI_API__ */ diff --git a/Private/EFIKit/EFI.hxx b/Private/EFIKit/EFI.hxx index 529efe65..6ea95b0d 100644 --- a/Private/EFIKit/EFI.hxx +++ b/Private/EFIKit/EFI.hxx @@ -268,6 +268,13 @@ typedef struct EfiDevicePathProtocol { UInt8 LengthData[2]; } EfiDevicePathProtocol; +typedef struct EfiFileDevicePathProtocol { + UInt8 Type; + UInt8 SubType; + UInt8 LengthData[2]; + WideChar Path[kPathLen]; +} EfiFileDevicePathProtocol; + typedef UInt64 EfiPhysicalAddress; typedef UIntPtr EfiVirtualAddress; @@ -424,4 +431,14 @@ typedef struct EfiIPV6 { #define __EFI_x86_64__ 1 #endif // __x86_64 +enum { + kEFIHwDevicePath = 0x1, + kEFIAcpiDevicePath, + kEFIMessaingDevicePath, + kEFIMediaDevicePath, + kEFIBiosBootPath, + kEFIEndOfPath, + kEFICount, +}; + #endif // __EFI__ diff --git a/Private/FSKit/NewFS.hxx b/Private/FSKit/NewFS.hxx index 75f4e554..bfb6f7c5 100644 --- a/Private/FSKit/NewFS.hxx +++ b/Private/FSKit/NewFS.hxx @@ -21,18 +21,19 @@ #define kIdent "NewFS" #define kPadLen 16 -#define kFilesystemVersion 1 +#define kNewFSVersion 1 enum { - kHardDrive = 0xC0, // Hard Drive - kOpticalDrive = 0x0C, // Blu-Ray/DVD - kMassStorageDevice = 0xCC, // USB - kUnknowmn = 0xFF, // unknown device or unsupported (floppy) + kNewFSHardDrive = 0xC0, // Hard Drive + kNewFSOpticalDrive = 0x0C, // Blu-Ray/DVD + kNewFSMassStorageDevice = 0xCC, // USB + kNewFSUnknowmn = 0xFF, // unknown device or unsupported (floppy) + kNewFSDriveCount = 4, }; struct PACKED NewBootBlock final { - HCore::Char Ident[kIdentLen]; - HCore::Char Shell[kNameLen]; + HCore::WideChar Ident[kIdentLen]; + HCore::WideChar Shell[kNameLen]; HCore::Int64 NumParts; HCore::Int64 FreeSectors; @@ -45,7 +46,7 @@ struct PACKED NewBootBlock final { HCore::Lba FirstPartBlock; HCore::Lba LastPartBlock; - HCore::Char Pad[kPadLen]; + HCore::WideChar Pad[kPadLen]; }; #define kFlagDeleted 0xF0 @@ -55,9 +56,10 @@ struct PACKED NewBootBlock final { #define kKindCatalog 1 #define kKindDirectory 2 #define kKindSymlink 3 +#define kKindPartition 4 struct PACKED NewCatalog final { - HCore::Char Name[kNameLen]; + HCore::WideChar Name[kNameLen]; HCore::Int32 Flags; HCore::Int32 Kind; @@ -91,8 +93,8 @@ struct PACKED NewFork final { #define kPartLen 32 struct PACKED NewPartitionBlock final { - HCore::Char PartitionName[kPartLen]; - HCore::Char JsonPath[kConfigLen]; + HCore::WideChar Ident[kIdentLen]; + HCore::WideChar PartitionName[kPartLen]; HCore::Int32 Flags; HCore::Int32 Kind; @@ -184,8 +186,7 @@ class MeFilesystemHelper final { }; } // namespace HCore -#define kNewFSAddressAsLba 5 -#define kNewFSAddressAsCHS 6 +#define kNewFSAddressAsLba 1024 // FSControl() syscall // FSOpen, FSClose, FSWhereAt, FSSetCursor, FSNodeSize, FSWrite, FSRead syscalls diff --git a/Private/NewBoot/BootKit/Arch/ATA.hxx b/Private/NewBoot/BootKit/Arch/ATA.hxx index 5c42237a..8b25a125 100644 --- a/Private/NewBoot/BootKit/Arch/ATA.hxx +++ b/Private/NewBoot/BootKit/Arch/ATA.hxx @@ -133,7 +133,7 @@ class BATADevice final { struct ATATraits final { SizeT mBase{1024}; UInt16 mBus{kPrimary}; - Boolean mMaster{false}; + Boolean mMaster{true}; }; operator bool() { return ATAIsDetected(); } @@ -154,3 +154,5 @@ enum { kATADeviceSATA_PI, kATADeviceCount, }; + +#define kATASectorSz 512 diff --git a/Private/NewBoot/BootKit/BootKit.hxx b/Private/NewBoot/BootKit/BootKit.hxx index 70519aba..b0dbccd5 100644 --- a/Private/NewBoot/BootKit/BootKit.hxx +++ b/Private/NewBoot/BootKit/BootKit.hxx @@ -48,6 +48,8 @@ class BTextWriter final { BTextWriter(const BTextWriter &) = default; }; +HCore::SizeT BCopyMem(CharacterType *dest, CharacterType *src, + const HCore::SizeT len); HCore::SizeT BStrLen(const CharacterType *ptr); HCore::SizeT BSetMem(CharacterType *src, const CharacterType byte, const HCore::SizeT len); @@ -80,8 +82,7 @@ class BFileReader final { private: Int32 mErrorCode{kOperationOkay}; - CharacterType mPath[255]; - BATADevice mDevice; + CharacterType mPath[kPathLen]; }; /***********************************************************************************/ diff --git a/Private/NewBoot/Source/HEL/AMD64/ATA.cxx b/Private/NewBoot/Source/HEL/AMD64/ATA.cxx index 4f1b3171..c289bcf5 100644 --- a/Private/NewBoot/Source/HEL/AMD64/ATA.cxx +++ b/Private/NewBoot/Source/HEL/AMD64/ATA.cxx @@ -114,9 +114,7 @@ Void ATAReadLba(UInt32 Lba, UInt8 Bus, Boolean Master, CharacterType* Buf, ATAPoll(IO); - for (SizeT index = 0UL; index < 256; ++index) { - Buf[index + Offset] = In16(IO + ATA_REG_DATA); - } + Buf[Offset] = In16(IO + ATA_REG_DATA); ATAWait(IO); } @@ -140,13 +138,13 @@ Void ATAWriteLba(UInt32 Lba, UInt8 Bus, Boolean Master, wchar_t* Buf, ATAPoll(IO); - for (SizeT index = 0UL; index < 256; ++index) { - Out16(IO + ATA_REG_DATA, Buf[index + Offset]); - } + Out16(IO + ATA_REG_DATA, Buf[Offset]); ATAWait(IO); } +Boolean ATAIsDetected(Void) { return kATADetected; } + /*** * * @@ -155,10 +153,8 @@ Void ATAWriteLba(UInt32 Lba, UInt8 Bus, Boolean Master, wchar_t* Buf, * */ -Boolean ATAIsDetected(Void) { return kATADetected; } - /** - * @brief Init ATA driver. + * @brief ATA Device constructor. * @param void none. */ BATADevice::BATADevice() noexcept { @@ -189,13 +185,9 @@ BATADevice& BATADevice::Read(CharacterType* Buf, const SizeT& Sz) { if (!Buf || Sz < 1) return *this; - SizeT Off = 0; - for (SizeT i = 0UL; i < Sz; ++i) { ATAReadLba(this->Leak().mBase + i, this->Leak().mBus, this->Leak().mMaster, - Buf, Off); - - Off += 512; + Buf, i); } return *this; @@ -217,7 +209,7 @@ BATADevice& BATADevice::Write(CharacterType* Buf, const SizeT& Sz) { ATAWriteLba(this->Leak().mBase + i, this->Leak().mBus, this->Leak().mMaster, Buf, Off); - Off += 512; + Off += kATASectorSz; } return *this; diff --git a/Private/NewBoot/Source/HEL/AMD64/BootKit.cxx b/Private/NewBoot/Source/HEL/AMD64/BootKit.cxx index 99f8d41b..600a8fcc 100644 --- a/Private/NewBoot/Source/HEL/AMD64/BootKit.cxx +++ b/Private/NewBoot/Source/HEL/AMD64/BootKit.cxx @@ -9,10 +9,27 @@ #include <BootKit/BootKit.hxx> #include <EFIKit/Api.hxx> +#include <FSKit/NewFS.hxx> /// bugs 0 +///////////////////////////////////////////////////////////////////////////////////////////////////////// + +HCore::SizeT BCopyMem(CharacterType *dest, CharacterType *src, + const HCore::SizeT len) { + if (!dest || !src) return 0; + + SizeT index = 0UL; + for (; index < len; ++index) { + dest[index] = src[index]; + } + + return index; +} + HCore::SizeT BStrLen(const CharacterType *ptr) { + if (!ptr) return 0; + HCore::SizeT cnt = 0; while (*ptr != (CharacterType)0) { @@ -23,12 +40,10 @@ HCore::SizeT BStrLen(const CharacterType *ptr) { return cnt; } -/** - @biref set memory -*/ - HCore::SizeT BSetMem(CharacterType *src, const CharacterType byte, const HCore::SizeT len) { + if (!src) return 0; + HCore::SizeT cnt = 0UL; while (*src != 0) { @@ -43,9 +58,8 @@ HCore::SizeT BSetMem(CharacterType *src, const CharacterType byte, return cnt; } -/** -@brief puts wrapper over VGA. -*/ +///////////////////////////////////////////////////////////////////////////////////////////////////////// + BTextWriter &BTextWriter::WriteString(const CharacterType *str) { if (*str == 0 || !str) return *this; @@ -66,6 +80,9 @@ BTextWriter &BTextWriter::WriteCharacter(CharacterType c) { return *this; } +///////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////// + /*** @brief File Reader constructor. */ @@ -89,5 +106,14 @@ HCore::VoidPtr BFileReader::ReadAll() { .WriteString(mPath) .WriteString(L" *** \r\n"); + EfiFileDevicePathProtocol loadFile{0}; + loadFile.LengthData[0] = 0xFF; + loadFile.LengthData[1] = 0; + + loadFile.Type = kEFIMediaDevicePath; + loadFile.SubType = 0; // from all drives. + + BCopyMem(loadFile.Path, mPath, kPathLen); + return nullptr; } diff --git a/Private/NewBoot/Source/HEL/AMD64/Entrypoint.cxx b/Private/NewBoot/Source/HEL/AMD64/Entrypoint.cxx index 69f235c4..8dfd7a71 100644 --- a/Private/NewBoot/Source/HEL/AMD64/Entrypoint.cxx +++ b/Private/NewBoot/Source/HEL/AMD64/Entrypoint.cxx @@ -7,6 +7,7 @@ * ======================================================== */ +#include "NewKit/Defines.hpp" #define __BOOTLOADER__ 1 #include <BootKit/BootKit.hxx> @@ -33,6 +34,8 @@ EFI_EXTERN_C int EfiMain(EfiHandlePtr ImageHandle, KeRuntimeStop(L"HCoreLdr_NoSuchKernel", L"Couldn't find HCoreKrnl.exe! Aborting..."); + writer.WriteString(L"HCoreLdr: Running HCoreKrnl.exe...\r\n"); + EFI::ExitBootServices(SystemTable, mapKey, ImageHandle); EFI::Stop(); diff --git a/Private/NewBoot/Source/makefile b/Private/NewBoot/Source/makefile index 063fa42a..0f679772 100644 --- a/Private/NewBoot/Source/makefile +++ b/Private/NewBoot/Source/makefile @@ -17,6 +17,7 @@ bootloader-amd64: $(CC_GNU) $(FLAG_GNU) HEL/AMD64/*.cxx $(LD_GNU) *.o -e efi_main -filealign:16 -shared --subsystem=10 -ffreestanding -o HCoreLdr.exe cp HCoreLdr.exe CDROM/EFI/BOOT/BOOTX64.EFI + cp ../../HCoreKrnl.exe CDROM/EFI/BOOT/HCoreKrnl.exe .PHONY: run-efi-debug run-efi-debug: |
