diff options
Diffstat (limited to 'Private')
| -rw-r--r-- | Private/FirmwareKit/EFI/API.hxx | 3 | ||||
| -rw-r--r-- | Private/FirmwareKit/EFI/EFI.hxx | 10 | ||||
| -rw-r--r-- | Private/FirmwareKit/Handover.hxx | 2 | ||||
| -rw-r--r-- | Private/NewBoot/BootKit/BootKit.hxx | 5 | ||||
| -rw-r--r-- | Private/NewBoot/Source/HEL/AMD64/BootMain.cxx | 73 | ||||
| -rw-r--r-- | Private/NewBoot/Source/makefile | 10 |
6 files changed, 59 insertions, 44 deletions
diff --git a/Private/FirmwareKit/EFI/API.hxx b/Private/FirmwareKit/EFI/API.hxx index 0e2ef200..4cf8e603 100644 --- a/Private/FirmwareKit/EFI/API.hxx +++ b/Private/FirmwareKit/EFI/API.hxx @@ -47,8 +47,7 @@ Bascially frees everything we have in the EFI side. inline void ExitBootServices(UInt64 MapKey, EfiHandlePtr ImageHandle) noexcept { if (!ST) return; - while (ST->BootServices->ExitBootServices(ImageHandle, MapKey) != kEfiOk) - ; + ST->BootServices->ExitBootServices(ImageHandle, MapKey); } enum { diff --git a/Private/FirmwareKit/EFI/EFI.hxx b/Private/FirmwareKit/EFI/EFI.hxx index 7f8223cf..c967647c 100644 --- a/Private/FirmwareKit/EFI/EFI.hxx +++ b/Private/FirmwareKit/EFI/EFI.hxx @@ -50,6 +50,9 @@ typedef struct EfiHandle { /* UEFI uses wide characters by default. */ typedef WideChar EfiCharType; +typedef UInt64 EfiPhysicalAddress; +typedef UIntPtr EfiVirtualAddress; + /// What's BootBolicy? /// If TRUE, indicates that the request originates from the boot manager, and /// that the boot manager is attempting to load FilePath as a boot selection. If @@ -200,13 +203,13 @@ typedef struct EfiMemoryDescriptor { /// 0xfffffffffffff000. Kind EFI_PHYSICAL_ADDRESS is defined in the /// AllocatePages() function description /// - UIntPtr PhysicalStart; + EfiPhysicalAddress PhysicalStart; /// /// Virtual address of the first byte in the memory region. /// VirtualStart must be aligned on a 4 KiB boundary, /// and must not be above 0xfffffffffffff000. /// - UIntPtr VirtualStart; + EfiVirtualAddress VirtualStart; /// /// NumberOfPagesNumber of 4 KiB pages in the memory region. /// NumberOfPages must not be 0, and must not be any value @@ -417,9 +420,6 @@ typedef struct EfiFileDevicePathProtocol { WideChar Path[kPathLen]; } EfiFileDevicePathProtocol; -typedef UInt64 EfiPhysicalAddress; -typedef UIntPtr EfiVirtualAddress; - typedef UInt64(EFI_API *EfiExitBootServices)(VoidPtr ImageHandle, UInt32 MapKey); diff --git a/Private/FirmwareKit/Handover.hxx b/Private/FirmwareKit/Handover.hxx index 4131467d..afec440d 100644 --- a/Private/FirmwareKit/Handover.hxx +++ b/Private/FirmwareKit/Handover.hxx @@ -64,7 +64,6 @@ struct HandoverInformationHeader { voidPtr f_VirtualStart; SizeT f_VirtualSize; voidPtr f_PhysicalStart; - SizeT f_PhysicalSize; WideChar f_FirmwareVendorName[32]; SizeT f_FirmwareVendorLen; struct { @@ -79,6 +78,7 @@ struct HandoverInformationHeader { UInt32 f_PixelFormat; UInt32 f_PixelPerLine; } f_GOP; + UInt64 f_FirmwareSpecific[8]; }; /// @brief Bootloader main type. diff --git a/Private/NewBoot/BootKit/BootKit.hxx b/Private/NewBoot/BootKit/BootKit.hxx index f7f33958..e2e371dd 100644 --- a/Private/NewBoot/BootKit/BootKit.hxx +++ b/Private/NewBoot/BootKit/BootKit.hxx @@ -255,7 +255,12 @@ private: Lba startLba = partBlock.StartCatalog; BTextWriter writer; + SizeT blobCounter = 0UL; + while (blob) { + if (blobCounter > blobCount) break; + ++blobCounter; + NewCatalog* catalogKind = new NewCatalog(); memset(catalogKind, 0, sizeof(NewCatalog)); diff --git a/Private/NewBoot/Source/HEL/AMD64/BootMain.cxx b/Private/NewBoot/Source/HEL/AMD64/BootMain.cxx index 68762089..558bf001 100644 --- a/Private/NewBoot/Source/HEL/AMD64/BootMain.cxx +++ b/Private/NewBoot/Source/HEL/AMD64/BootMain.cxx @@ -70,31 +70,15 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, .Write(SystemTable->FirmwareVendor) .Write(L"\r\n"); - UInt32 MapKey = 0; - UInt32* SizePtr = nullptr; - EfiMemoryDescriptor* Descriptor = nullptr; - UInt32 SzDesc = 0; - UInt32 RevDesc = 0; - - if (BS->AllocatePool(EfiLoaderData, sizeof(UInt32), (VoidPtr*)&SizePtr) != - kEfiOk) { - EFI::ThrowError(L"Bad-Alloc", L"New Boot ran out of memory!"); - } - - /**** - * - * Load kernel into memory. - * - */ + UInt32* MapKey = new UInt32(); + UInt32* SizePtr = new UInt32(); + EfiMemoryDescriptor* Descriptor = new EfiMemoryDescriptor(); + UInt32* SzDesc = new UInt32(); + UInt32* RevDesc = new UInt32(); *SizePtr = sizeof(EfiMemoryDescriptor); - if (BS->AllocatePool(EfiLoaderData, sizeof(EfiMemoryDescriptor), - (VoidPtr*)&Descriptor) != kEfiOk) { - EFI::ThrowError(L"Bad-Alloc", L"New Boot ran out of memory!"); - } - - HEL::HandoverInformationHeader* handoverHdrPtr = nullptr; + HEL::HandoverInformationHeader* handoverHdrPtr = new HEL::HandoverInformationHeader(); for (SizeT indexVT = 0; indexVT < SystemTable->NumberOfTableEntries; ++indexVT) { @@ -141,20 +125,21 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, ToolboxClearRsrc(); - BS->AllocatePool(EfiLoaderData, sizeof(HEL::HandoverInformationHeader), - (VoidPtr*)&handoverHdrPtr); + EfiPhysicalAddress* whereAddress = + reinterpret_cast<EfiPhysicalAddress*>(kBootVirtualAddress); - handoverHdrPtr->f_PhysicalStart = 0; - handoverHdrPtr->f_PhysicalSize = 0; + BS->GetMemoryMap(SizePtr, Descriptor, MapKey, SzDesc, RevDesc); + + handoverHdrPtr->f_PhysicalStart = (VoidPtr)Descriptor->PhysicalStart; + + handoverHdrPtr->f_FirmwareSpecific[0] = Descriptor->Attribute; + handoverHdrPtr->f_FirmwareSpecific[1] = Descriptor->Kind; - EfiPhysicalAddress* whereAddress = - reinterpret_cast<EfiPhysicalAddress*>(kBootVirtualAddress); BS->AllocatePages(EfiAllocateType::AllocateAnyPages, EfiMemoryType::EfiConventionalMemory, 1, whereAddress); - handoverHdrPtr->f_VirtualStart = reinterpret_cast<voidPtr>(whereAddress); - + handoverHdrPtr->f_VirtualStart = (VoidPtr)Descriptor->VirtualStart; handoverHdrPtr->f_VirtualSize = Descriptor->NumberOfPages; /* # of pages */ handoverHdrPtr->f_FirmwareVendorLen = BStrLen(SystemTable->FirmwareVendor); @@ -209,7 +194,7 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, memcpy(bootDesc.fForkName, kNewFSResourceFork, strlen(kNewFSResourceFork)); bootDesc.fBlobSz = BootDeviceATA::kSectorSize; - bootDesc.fBlob = new Char[rootDesc.fBlobSz]; + bootDesc.fBlob = new Char[bootDesc.fBlobSz]; memset(bootDesc.fBlob, 0, bootDesc.fBlobSz); @@ -217,12 +202,32 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, strlen(kMachineModel " startup folder.")); rootDesc.fNext = &bootDesc; - rootDesc.fNext->fPrev = &rootDesc; + rootDesc.fNext->fPrev = nullptr; + + BDiskFormatFactory<BootDeviceATA>::BFileDescriptor appDesc{0}; + + appDesc.fKind = kNewFSCatalogKindDir; + + memcpy(appDesc.fFileName, "/Applications", strlen("/Applications")); + memcpy(appDesc.fForkName, kNewFSResourceFork, strlen(kNewFSResourceFork)); + + appDesc.fBlobSz = BootDeviceATA::kSectorSize; + appDesc.fBlob = new Char[appDesc.fBlobSz]; + + memset(appDesc.fBlob, 0, appDesc.fBlobSz); + + memcpy(appDesc.fBlob, kMachineModel " applications folder.", + strlen(kMachineModel " applications folder.")); + + appDesc.fNext = nullptr; + appDesc.fNext->fPrev = &bootDesc; + + bootDesc.fNext = &appDesc; - diskFormatter.Format(kMachineModel, &rootDesc, 2); + diskFormatter.Format(kMachineModel, &rootDesc, 3); } - EFI::ExitBootServices(MapKey, ImageHandle); + EFI::ExitBootServices(*MapKey, ImageHandle); hal_init_platform(kHandoverHeader); diff --git a/Private/NewBoot/Source/makefile b/Private/NewBoot/Source/makefile index 8306f844..f3a292c5 100644 --- a/Private/NewBoot/Source/makefile +++ b/Private/NewBoot/Source/makefile @@ -28,7 +28,13 @@ EMU_FLAGS=-net none -smp 4 -m 8G -M q35 -bios OVMF.fd -device piix3-ide,id=ide - LD_FLAGS=-e Main --subsystem=10 +ifeq ($(NEWS_STANDLONE), ) OBJ=*.o ../../Objects/*.obj +else +RESCMD=$(WINDRES) BootloaderRsrc.rsrc -O coff -o BootloaderRsrc.o +STANDALONE_MACRO=-D__STANDALONE__ +OBJ=*.o +endif REM=rm REM_FLAG=-f @@ -60,8 +66,8 @@ endif .PHONY: compile-amd64 compile-amd64: - # $(WINDRES) BootloaderRsrc.rsrc -O coff -o BootloaderRsrc.o - $(CC_GNU) $(NEWOS_MODEL) $(FLAG_GNU) $(DEBUG) $(wildcard HEL/AMD64/*.cxx) $(wildcard HEL/AMD64/*.S) $(wildcard *.cxx) + $(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: |
