#include <Protocol/BlockIo.h>
#include <Protocol/RamDisk.h>
#include <Protocol/SimpleFileSystem.h>
+#include <Protocol/DriverBinding.h>
#include <Ventoy.h>
BOOLEAN gDebugPrint = FALSE;
+BOOLEAN gBootFallBack = FALSE;
BOOLEAN gDotEfiBoot = FALSE;
BOOLEAN gLoadIsoEfi = FALSE;
BOOLEAN gIsoUdf = FALSE;
ventoy_ram_disk g_ramdisk_param;
ventoy_chain_head *g_chain;
+void *g_vtoy_img_location_buf;
ventoy_img_chunk *g_chunk;
UINT8 *g_os_param_reserved;
UINT32 g_img_chunk_num;
}
address = (UINTN)buffer;
+ g_vtoy_img_location_buf = buffer;
if (address % 4096)
{
return Handle;
}
+STATIC ventoy_ram_disk g_backup_ramdisk_param;
+STATIC ventoy_os_param g_backup_os_param_var;
+
+
EFI_STATUS EFIAPI ventoy_save_ramdisk_param(VOID)
{
+ UINTN DataSize;
EFI_STATUS Status = EFI_SUCCESS;
EFI_GUID VarGuid = VENTOY_GUID;
+
+ DataSize = sizeof(g_backup_ramdisk_param);
+ Status = gRT->GetVariable(L"VentoyRamDisk", &VarGuid, NULL, &DataSize, &g_backup_ramdisk_param);
+ if (!EFI_ERROR(Status))
+ {
+ debug("find previous ramdisk variable <%llu>", g_backup_ramdisk_param.DiskSize);
+ }
Status = gRT->SetVariable(L"VentoyRamDisk", &VarGuid,
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
{
EFI_STATUS Status = EFI_SUCCESS;
EFI_GUID VarGuid = VENTOY_GUID;
-
- Status = gRT->SetVariable(L"VentoyRamDisk", &VarGuid,
+
+ if (g_backup_ramdisk_param.DiskSize > 0 && g_backup_ramdisk_param.PhyAddr > 0)
+ {
+ Status = gRT->SetVariable(L"VentoyRamDisk", &VarGuid,
+ EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
+ sizeof(g_backup_ramdisk_param), &g_backup_ramdisk_param);
+ debug("resotre ramdisk variable %r", Status);
+ }
+ else
+ {
+ Status = gRT->SetVariable(L"VentoyRamDisk", &VarGuid,
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
0, NULL);
- debug("delete efi variable %r", Status);
+ debug("delete ramdisk variable %r", Status);
+ }
return Status;
}
-
EFI_STATUS EFIAPI ventoy_save_variable(VOID)
{
+ UINTN DataSize;
EFI_STATUS Status = EFI_SUCCESS;
EFI_GUID VarGuid = VENTOY_GUID;
-
+
+ DataSize = sizeof(g_backup_os_param_var);
+ Status = gRT->GetVariable(L"VentoyOsParam", &VarGuid, NULL, &DataSize, &g_backup_os_param_var);
+ if (!EFI_ERROR(Status))
+ {
+ debug("find previous efi variable <%a>", g_backup_os_param_var.vtoy_img_path);
+ }
+
Status = gRT->SetVariable(L"VentoyOsParam", &VarGuid,
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
sizeof(g_chain->os_param), &(g_chain->os_param));
{
EFI_STATUS Status = EFI_SUCCESS;
EFI_GUID VarGuid = VENTOY_GUID;
-
- Status = gRT->SetVariable(L"VentoyOsParam", &VarGuid,
+
+ if (0 == CompareMem(&(g_backup_os_param_var.guid), &VarGuid, sizeof(EFI_GUID)))
+ {
+ Status = gRT->SetVariable(L"VentoyOsParam", &VarGuid,
+ EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
+ sizeof(g_backup_os_param_var), &(g_backup_os_param_var));
+ debug("restore efi variable %r", Status);
+ }
+ else
+ {
+ Status = gRT->SetVariable(L"VentoyOsParam", &VarGuid,
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
0, NULL);
- debug("delete efi variable %r", Status);
+ debug("delete efi variable %r", Status);
+ }
return Status;
}
gDebugPrint = TRUE;
}
+ if (StrStr(pCmdLine, L"fallback"))
+ {
+ gBootFallBack = TRUE;
+ }
+
if (StrStr(pCmdLine, L"dotefi"))
{
gDotEfiBoot = TRUE;
ventoy_delete_variable();
- if (g_chain->os_param.vtoy_img_location_addr)
+ if (g_vtoy_img_location_buf)
{
- FreePool((VOID *)(UINTN)g_chain->os_param.vtoy_img_location_addr);
+ FreePool(g_vtoy_img_location_buf);
}
- FreePool(g_chain);
+ if (!gMemdiskMode)
+ {
+ FreePool(g_chain);
+ }
return EFI_SUCCESS;
}
}
debug("Fs not found, now wait and retry...");
- sleep(2);
+ sleep(1);
}
}
return Status;
}
+ ventoy_disable_ex_filesystem();
+
if (gMemdiskMode)
{
g_ramdisk_param.PhyAddr = (UINT64)(UINTN)g_iso_data_buf;
ventoy_clean_env();
}
- if (FALSE == gDotEfiBoot)
+ if (FALSE == gDotEfiBoot && FALSE == gBootFallBack)
{
if (EFI_NOT_FOUND == Status)
{
grub_env_set("vtoy_dotefi_retry", "YES");
}
+ ventoy_enable_ex_filesystem();
+
return EFI_SUCCESS;
}