changeset 0:f434d6ab8db1

xv6-UEFI bootloader
author nana
date Tue, 11 Apr 2023 11:12:12 +0900
parents
children cbcaeba32076
files bootloader.c
diffstat 1 files changed, 87 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /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<efi.h>
+#include<efilib.h>
+
+
+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;
+}
+