#include "uefi/uefi.h" // IWYU pragma: keep #include "../../Common/bootinfo.h" void print(wchar_t* msg) { ST->ConOut->OutputString(ST->ConOut, msg); } efi_status_t die() { while(1) __asm__ volatile("wfi"); return EFI_ABORTED; } int compare_guid(efi_guid_t* a, efi_guid_t* b) { uint8_t* p1 = (uint8_t*)a; uint8_t* p2 = (uint8_t*)b; for (int i = 0; i < 16; i++) { if (p1[i] != p2[i]) return 0; } return 1; } int main() { efi_gop_t* gop = NULL; efi_guid_t gop_guid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID; ST->BootServices->LocateProtocol(&gop_guid, 0, (void**)&gop); efi_guid_t dtb_guid = {0xb1b621d5, 0xf19c, 0x41a5, {0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0}}; void* dtbAddress = NULL; for (uintn_t i = 0; i < ST->NumberOfTableEntries; i++) { if (compare_guid(&ST->ConfigurationTable[i].VendorGuid, &dtb_guid)) { dtbAddress = ST->ConfigurationTable[i].VendorTable; break; } } if (!dtbAddress) { print(L"Failed to find DTB!\r\n"); return die(); } efi_loaded_image_protocol_t* loaded_image; efi_guid_t lip_guid = EFI_LOADED_IMAGE_PROTOCOL_GUID; gBS->HandleProtocol(IM, &lip_guid, (void**)&loaded_image); efi_simple_file_system_protocol_t* fs; efi_guid_t sfsp_guid = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID; gBS->HandleProtocol(loaded_image->DeviceHandle, &sfsp_guid, (void**)&fs); efi_file_handle_t* root; fs->OpenVolume(fs, &root); efi_file_handle_t* kernel_file; uintn_t kinfo_size = 0; efi_file_info_t* kfile_info = NULL; efi_guid_t fi_guid = EFI_FILE_INFO_GUID; efi_status_t status = root->Open(root, &kernel_file, L"ksOSKernel.bin", EFI_FILE_MODE_READ, 0); if (EFI_ERROR(status)) { print(L"Cant find ksOSKernel.bin\r\n"); return die(); } status = kernel_file->GetInfo(kernel_file, &fi_guid, &kinfo_size, NULL); if (status == EFI_BUFFER_TOO_SMALL) { gBS->AllocatePool(EfiLoaderData, kinfo_size, (void**)&kfile_info); status = kernel_file->GetInfo(kernel_file, &fi_guid, &kinfo_size, kfile_info); } uint64_t kernel_size = kfile_info->FileSize; uintn_t kernel_size_read = (uintn_t)kernel_size; uintn_t kernel_pages = (kernel_size + 0xFFF) / 0x1000; efi_physical_address_t kernel_addr = 0; status = gBS->AllocatePages(AllocateAnyPages, EfiLoaderData, kernel_pages, &kernel_addr); if (EFI_ERROR(status)) { print(L"Failed to allocate ANY memory for kernel!\r\n"); return die(); } kernel_file->Read(kernel_file, &kernel_size_read, (void*)kernel_addr); \ printf("Kernel loaded at %p\r\n", (void*)kernel_addr); Bootinfo* bootInfo = (Bootinfo*)malloc(sizeof(Bootinfo)); bootInfo->magic = BOOTINFO_MAGIC; bootInfo->kernelInfo.kernelAddress = (void*)kernel_addr; bootInfo->kernelInfo.kernelSize = kernel_size; bootInfo->framebuffer.base = (BIUInt32*)gop->Mode->FrameBufferBase; bootInfo->framebuffer.baseSize = gop->Mode->FrameBufferSize; bootInfo->framebuffer.height = gop->Mode->Information->VerticalResolution; bootInfo->framebuffer.width = gop->Mode->Information->HorizontalResolution; bootInfo->framebuffer.pitch = gop->Mode->Information->PixelsPerScanLine; bootInfo->dtb = dtbAddress; printf("DTB located at: %p\r\n", (void*)dtbAddress); uintn_t map_size = 0; efi_memory_descriptor_t *map = NULL; uintn_t map_key; uintn_t desc_size; uint32_t desc_version; print(L"Almost ready to jump :D. Working with memory map\r\n"); gBS->GetMemoryMap(&map_size, NULL, &map_key, &desc_size, &desc_version); map_size += 4096; // woah letsgoo status = gBS->AllocatePool(EfiLoaderData, map_size, (void**)&map); if (EFI_ERROR(status)) { print(L"Failed to allocate pool\r\n"); } do { status = gBS->GetMemoryMap(&map_size, map, &map_key, &desc_size, &desc_version); if (EFI_ERROR(status)) { break; } bootInfo->memoryMap.descriptorSize = desc_size; bootInfo->memoryMap.descriptorVersion = desc_version; bootInfo->memoryMap.mapSize = map_size; bootInfo->memoryMap.mapKey = map_key; bootInfo->memoryMap.map = map; status = gBS->ExitBootServices(IM, map_key); if (status == EFI_SUCCESS) { break; // FUCK OFF; } map_size += 2 * desc_size; } while (EFI_ERROR(status)); typedef void (__attribute__((sysv_abi)) *kentry)(Bootinfo*); kentry kmain = (kentry)kernel_addr; kmain(bootInfo); // yay! :D return EFI_SUCCESS; }