# HG changeset patch # User nana # Date 1681179132 -32400 # Node ID f434d6ab8db173a6dd57d039a928509a214efcf8 xv6-UEFI bootloader diff -r 000000000000 -r f434d6ab8db1 bootloader.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bootloader.c Tue Apr 11 11:12:12 2023 +0900 @@ -0,0 +1,87 @@ +#include +#include + + +EFI_STATUS +efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) +{ + + // UINTN UartBase = 0x09000000; + // UINTN UartClk = 24000000; + //CHAR8 buffer[256]; + //UINTN bufferSize; + + EFI_DEVICE_PATH *Path; + EFI_LOADED_IMAGE *LoadedImageParent; + EFI_LOADED_IMAGE *LoadedImage; + EFI_HANDLE Image; + CHAR16 *Options = L"root=/dev/sda2 rootfstype=btrfs rw quiet splash"; + EFI_STATUS Status=EFI_SUCCESS; + + InitializeLib(ImageHandle, SystemTable); + Print(L"Hello, EFI!\n"); + +// Status = InitializeUart(UartBase, UartClk); +// if (EFI_ERROR(Status)) { +// Print(L"Error initializing UART device: %r\n", Status); +// return Status; +// } +// Print(L"Hello, UART1!\n"); + + // Read kernel image from UART +// bufferSize = sizeof(buffer); +// Status = ReadUart(UartBase, &bufferSize, buffer); +// if (EFI_ERROR(Status)) { +// Print(L"Error reading kernel image from UART: %r\n", Status); +// return Status; +// } + +// Print(L"Hello, UART2!\n"); + +// Status = uefi_call_wrapper(BS->OpenProtocol, 6, ImageHandle, &LoadedImageProtocol,(void**)&LoadedImageParent, ImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); +// if (EFI_ERROR(Status)) { +// Print(L"Could not get LoadedImageProtocol handler %r\n", Status); +// return Status; +// } + + // Check the validity of the received data +// if (!validate_image(buffer, bufferSize)) { +// Print(L"Invalid kernel image received\n"); +// return EFI_INVALID_PARAMETER; +// } + + + Print(L"Hello,2!\n"); + Path = FileDevicePath(LoadedImageParent->DeviceHandle, L"\\kernel.elf"); + if (Path == NULL) { + Print(L"Could not get device path."); + return EFI_INVALID_PARAMETER; + } + Print(L"Hello,3!\n"); + Status = uefi_call_wrapper(BS->LoadImage, 6, FALSE, ImageHandle, Path, NULL, 0, &Image); + if (EFI_ERROR(Status)) { + Print(L"Could not load %r", Status); + FreePool(Path); + return Status; + } + Print(L"Hello,4!\n"); + Status = uefi_call_wrapper(BS->OpenProtocol, 6, Image, &LoadedImageProtocol, (void**)&LoadedImage, ImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); + if (EFI_ERROR(Status)) { + Print(L"Could not get LoadedImageProtocol handler %r\n", Status); + uefi_call_wrapper(BS->UnloadImage, 1, Image); + FreePool(Path); + return Status; + } + Print(L"Hello,5!\n"); + LoadedImage->LoadOptions = Options; + LoadedImage->LoadOptionsSize = (StrLen(LoadedImage->LoadOptions)+1) * sizeof(CHAR16); + + Print(L"Hello,6!\n"); + Status = uefi_call_wrapper(BS->StartImage, 3, Image, NULL, NULL); + uefi_call_wrapper(BS->UnloadImage, 1, Image); + FreePool(Path); + Print(L"Hello,7!\n"); + + return EFI_SUCCESS; +} +