#include <Protocol/BlockIo.h>
#include <Protocol/RamDisk.h>
#include <Protocol/SimpleFileSystem.h>
+#include <Protocol/DriverBinding.h>
#include <Ventoy.h>
BOOLEAN gDebugPrint = FALSE;
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;
}
return Status;
}
+ ventoy_disable_ex_filesystem();
+
if (gMemdiskMode)
{
g_ramdisk_param.PhyAddr = (UINT64)(UINTN)g_iso_data_buf;
grub_env_set("vtoy_dotefi_retry", "YES");
}
+ ventoy_enable_ex_filesystem();
+
return EFI_SUCCESS;
}