uefi_start.c (2757B)
1 #include <efi.h> 2 #include <efilib.h> 3 #include "./include/kernel.h" 4 //#include "kernel.h" 5 #include "./include/font.h" 6 #include "include/print.h" 7 #include "./include/main.h" 8 #include <stdint.h> 9 10 uint32_t *fb; 11 uint64_t fsize, maxX, maxY, ppline; 12 13 EFI_STATUS EFIAPI efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) { 14 InitializeLib(ImageHandle, SystemTable); 15 16 Print(L"Stage 1\n"); 17 EFI_BOOT_SERVICES *bs = SystemTable->BootServices; 18 UINTN MMapSize = 0; 19 EFI_MEMORY_DESCRIPTOR *Mmap = NULL; 20 UINTN MapKey; 21 UINTN DescriptorSize; 22 UINT32 DescriptorVersion; 23 EFI_STATUS status; 24 EFI_GUID gopGuid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID; 25 EFI_GRAPHICS_OUTPUT_PROTOCOL *gop; 26 27 Print(L"Survived Stage 1\n"); 28 29 Print(L"proceeding to get gop\n"); 30 status = uefi_call_wrapper(bs->LocateProtocol, 3, &gopGuid, NULL, (void**)&gop); 31 if (EFI_ERROR(status)) return status; 32 33 typedef struct fbuffer { 34 uint32_t *fb; 35 UINTN fsize; 36 UINTN ppline; 37 UINTN VertRes; 38 UINTN HorizRes; 39 } Framebuffer; 40 41 Framebuffer kernel_fb; 42 kernel_fb.fb = (uint32_t *)gop->Mode->FrameBufferBase; 43 kernel_fb.fsize = gop->Mode->FrameBufferSize; 44 kernel_fb.ppline = (UINTN)gop->Mode->Info->PixelsPerScanLine; 45 kernel_fb.VertRes = (UINTN)gop->Mode->Info->VerticalResolution; 46 kernel_fb.HorizRes = (UINTN)gop->Mode->Info->HorizontalResolution; 47 48 fb = kernel_fb.fb; 49 maxX = kernel_fb.HorizRes; 50 maxY = kernel_fb.VertRes; 51 fsize = kernel_fb.fsize; 52 ppline = kernel_fb.ppline; 53 54 Print(L"GOP Loaded successfully.\n"); 55 56 Print(L"Stage 2\n"); 57 status = uefi_call_wrapper(bs->GetMemoryMap, 5, &MMapSize, NULL, &MapKey, &DescriptorSize, &DescriptorVersion); 58 if (status != EFI_BUFFER_TOO_SMALL) while (1); 59 Print(L"survived Stage 2\n"); 60 61 MMapSize += 5 * DescriptorSize; 62 Print(L"Stage 3\n"); 63 status = uefi_call_wrapper(bs->AllocatePool, 3, EfiLoaderData, MMapSize, (void**)&Mmap); 64 if (EFI_ERROR(status)) { 65 // Print(status); 66 return status; 67 } 68 Print(L"Stage 3 survived\n"); 69 70 Print(L"Stage 4\n"); 71 status = uefi_call_wrapper(bs->GetMemoryMap, 5, &MMapSize, Mmap, &MapKey, &DescriptorSize, &DescriptorVersion); 72 if (EFI_ERROR(status)) return status; 73 // Print(L"Stage 4 done. Attempting stage 5....\n"); 74 status = uefi_call_wrapper(bs->ExitBootServices, 2, ImageHandle, MapKey); 75 if (EFI_ERROR(status)) { 76 Print(L"Exit failed\n"); 77 while (1); 78 } 79 80 __asm__ volatile("cli"); 81 // k_print("black", "HEY!"); 82 kernel(kernel_fb.fb, kernel_fb.fsize, kernel_fb.ppline, kernel_fb.HorizRes, kernel_fb.VertRes); 83 84 while (1) { 85 __asm__ volatile("hlt"); 86 } 87 88 return EFI_SUCCESS; 89 }