Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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 }