X-Git-Url: https://glassweightruler.freedombox.rocks/gitweb/Ventoy.git/blobdiff_plain/ebaa4d954aa0b3d70f14b2fd6fec63df1599b8ce..787d950f28e48b4e8c541d2eaa96380e151e90ad:/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.c diff --git a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.c b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.c index c560bcb..3b7cf24 100644 --- a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.c +++ b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.c @@ -34,14 +34,17 @@ #include #include #include +#include #include 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; @@ -269,6 +272,7 @@ static int ventoy_update_image_location(ventoy_os_param *param) } address = (UINTN)buffer; + g_vtoy_img_location_buf = buffer; if (address % 4096) { @@ -359,10 +363,22 @@ EFI_HANDLE EFIAPI ventoy_get_parent_handle(IN EFI_DEVICE_PATH_PROTOCOL *pDevPath 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, @@ -376,21 +392,38 @@ EFI_STATUS EFIAPI ventoy_delete_ramdisk_param(VOID) { 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)); @@ -403,11 +436,21 @@ EFI_STATUS EFIAPI ventoy_delete_variable(VOID) { 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; } @@ -694,6 +737,11 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle) gDebugPrint = TRUE; } + if (StrStr(pCmdLine, L"fallback")) + { + gBootFallBack = TRUE; + } + if (StrStr(pCmdLine, L"dotefi")) { gDotEfiBoot = TRUE; @@ -873,12 +921,15 @@ EFI_STATUS EFIAPI ventoy_clean_env(VOID) 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; } @@ -1030,7 +1081,7 @@ EFI_STATUS EFIAPI ventoy_boot(IN EFI_HANDLE ImageHandle) } debug("Fs not found, now wait and retry..."); - sleep(2); + sleep(1); } } @@ -1074,6 +1125,8 @@ EFI_STATUS EFIAPI VentoyEfiMain return Status; } + ventoy_disable_ex_filesystem(); + if (gMemdiskMode) { g_ramdisk_param.PhyAddr = (UINT64)(UINTN)g_iso_data_buf; @@ -1130,7 +1183,7 @@ EFI_STATUS EFIAPI VentoyEfiMain ventoy_clean_env(); } - if (FALSE == gDotEfiBoot) + if (FALSE == gDotEfiBoot && FALSE == gBootFallBack) { if (EFI_NOT_FOUND == Status) { @@ -1148,6 +1201,8 @@ EFI_STATUS EFIAPI VentoyEfiMain grub_env_set("vtoy_dotefi_retry", "YES"); } + ventoy_enable_ex_filesystem(); + return EFI_SUCCESS; }