diff options
Diffstat (limited to 'core')
| -rw-r--r-- | core/file.c | 55 | ||||
| -rw-r--r-- | core/sboot.c | 9 |
2 files changed, 64 insertions, 0 deletions
diff --git a/core/file.c b/core/file.c new file mode 100644 index 0000000..717e506 --- /dev/null +++ b/core/file.c @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2026, Apollo Telephone Laboratories. + * Provided under the BSD-3 clause. + */ + +#include <sboot/file.h> +#include <sboot/fwi.h> + +EFI_STATUS +FileGetVolume(IN EFI_HANDLE ImageHandle, OUT EFI_FILE_HANDLE *Handle) +{ + EFI_LOADED_IMAGE *LoadedImage = NULL; + EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *IoVolume; + EFI_GUID LipGuid = EFI_LOADED_IMAGE_PROTOCOL_GUID; + EFI_GUID FsGuid = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID; + EFI_FILE_HANDLE Volume; + EFI_STATUS Status; + + Status = FwiHandleProtocol( + ImageHandle, + &LipGuid, + (VOID **)&LoadedImage + ); + + if (EFI_ERROR(Status)) { + Print(L"fatal: could not get loaded image\n"); + return Status; + } + + Status = FwiHandleProtocol( + LoadedImage->DeviceHandle, + &FsGuid, + (VOID *)&IoVolume + ); + + if (EFI_ERROR(Status)) { + Print(L"fatal: could not I/O volume\n"); + return Status; + } + + Status = uefi_call_wrapper( + IoVolume->OpenVolume, + 2, + IoVolume, + &Volume + ); + + if (EFI_ERROR(Status)) { + Print(L"fatal: failed to get volume\n"); + return Status; + } + + *Handle = Volume; + return EFI_SUCCESS; +} diff --git a/core/sboot.c b/core/sboot.c index 1a3d7d1..5511ca4 100644 --- a/core/sboot.c +++ b/core/sboot.c @@ -8,12 +8,16 @@ #include <sboot/sboot.h> #include <sboot/config.h> #include <sboot/fwi.h> +#include <sboot/file.h> + +EFI_FILE_HANDLE gBootVolume; EFI_STATUS EFIAPI efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) { BOOT_ENTRY Entry; + EFI_STATUS Status; InitializeLib(ImageHandle, SystemTable); @@ -25,6 +29,11 @@ efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) NULL ); + Status = FileGetVolume(ImageHandle, &gBootVolume); + if (EFI_ERROR(Status)) { + Hcf(); + } + Print( L"SBOOT %s - %d boot entrie(s)\n", SBOOT_VERSION, |
