#include #include #include #include #include "../kjarna.h" #include "../config.h" #include #include "kjarna_efi.h" struct efi_context const *efi_context; EFI_STATUS efi_errno = EFI_SUCCESS; EFI_STATUS _exit(EFI_STATUS status) { return gBS->Exit(efi_context->handle, status, 0, nullptr); } EFI_STATUS _start(EFI_HANDLE handle, EFI_SYSTEM_TABLE *system_table) { struct efi_context app_context = { handle, system_table }; efi_context = &app_context; system_table->ConOut->ClearScreen(system_table->ConOut); #ifdef DEBUG_WAIT EFI_GUID lip_guid = EFI_LOADED_IMAGE_PROTOCOL_GUID; EFI_LOADED_IMAGE_PROTOCOL *lip = efi_get_protocol(efi_context->handle, &lip_guid); uint64_t text_base; uint64_t data_base; printf("DEBUG: EFI_LOADED_IMAGE_PROTOCOL { .ImageBase = %p }\n", lip->ImageBase); __asm__ volatile ("movq %0, %%rax" :: "r"(lip->ImageBase) : "rax"); __asm__ volatile ( "lea .text, %0\n" "lea .data, %1\n" : "=r"(text_base), "=r"(data_base) : ); printf("DEBUG: .text %p .data %p\n", text_base, data_base); bool wait = true; while(wait) { __asm__ ("hlt"); } #endif if (main(0, nullptr) != 0) { efi_errno = EFI_ABORTED; } return _exit(efi_errno); }