arrfab / rpms / shim

Forked from rpms/shim 4 years ago
Clone

Blame SOURCES/0026-fallback-Avoid-duplicate-old-BootOrder.patch

4210fa
From 382a0b66e6c06ccf6775e3c05d5f9ce5f0eab5db Mon Sep 17 00:00:00 2001
4210fa
From: Gary Ching-Pang Lin <glin@suse.com>
4210fa
Date: Thu, 6 Mar 2014 11:58:36 +0800
4210fa
Subject: [PATCH 26/74] [fallback] Avoid duplicate old BootOrder
4210fa
4210fa
set_boot_order() already copies the old BootOrder to the variable,
4210fa
bootorder. Besides, we can adjust BootOrder when adding the newly
4210fa
generated boot option. So, we don't have to copy the old one again
4210fa
in update_boot_order(). This avoid the duplicate entries in BootOrder.
4210fa
4210fa
Signed-off-by: Gary Ching-Pang Lin <glin@suse.com>
4210fa
---
4210fa
 fallback.c | 37 ++++++++++++-------------------------
4210fa
 1 file changed, 12 insertions(+), 25 deletions(-)
4210fa
4210fa
diff --git a/fallback.c b/fallback.c
4210fa
index bc9a3c9..4bde9c1 100644
4210fa
--- a/fallback.c
4210fa
+++ b/fallback.c
4210fa
@@ -204,12 +204,12 @@ add_boot_option(EFI_DEVICE_PATH *hddp, EFI_DEVICE_PATH *fulldp,
4210fa
 				return EFI_OUT_OF_RESOURCES;
4210fa
 
4210fa
 			int j = 0;
4210fa
+			newbootorder[0] = i & 0xffff;
4210fa
 			if (nbootorder) {
4210fa
 				for (j = 0; j < nbootorder; j++)
4210fa
-					newbootorder[j] = bootorder[j];
4210fa
+					newbootorder[j+1] = bootorder[j];
4210fa
 				FreePool(bootorder);
4210fa
 			}
4210fa
-			newbootorder[j] = i & 0xffff;
4210fa
 			bootorder = newbootorder;
4210fa
 			nbootorder += 1;
4210fa
 #ifdef DEBUG_FALLBACK
4210fa
@@ -307,28 +307,17 @@ set_boot_order(void)
4210fa
 EFI_STATUS
4210fa
 update_boot_order(void)
4210fa
 {
4210fa
-	CHAR16 *oldbootorder;
4210fa
 	UINTN size;
4210fa
+	UINTN len = 0;
4210fa
 	EFI_GUID global = EFI_GLOBAL_VARIABLE;
4210fa
 	CHAR16 *newbootorder = NULL;
4210fa
+	EFI_STATUS rc;
4210fa
 
4210fa
-	oldbootorder = LibGetVariableAndSize(L"BootOrder", &global, &size);
4210fa
-	if (oldbootorder) {
4210fa
-		int n = size / sizeof (CHAR16) + nbootorder;
4210fa
-
4210fa
-		newbootorder = AllocateZeroPool(n * sizeof (CHAR16));
4210fa
-		if (!newbootorder)
4210fa
-			return EFI_OUT_OF_RESOURCES;
4210fa
-		CopyMem(newbootorder, bootorder, nbootorder * sizeof (CHAR16));
4210fa
-		CopyMem(newbootorder + nbootorder, oldbootorder, size);
4210fa
-		size = n * sizeof (CHAR16);
4210fa
-	} else {
4210fa
-		size = nbootorder * sizeof(CHAR16);
4210fa
-		newbootorder = AllocateZeroPool(size);
4210fa
-		if (!newbootorder)
4210fa
-			return EFI_OUT_OF_RESOURCES;
4210fa
-		CopyMem(newbootorder, bootorder, size);
4210fa
-	}
4210fa
+	size = nbootorder * sizeof(CHAR16);
4210fa
+	newbootorder = AllocateZeroPool(size);
4210fa
+	if (!newbootorder)
4210fa
+		return EFI_OUT_OF_RESOURCES;
4210fa
+	CopyMem(newbootorder, bootorder, size);
4210fa
 
4210fa
 #ifdef DEBUG_FALLBACK
4210fa
 	Print(L"nbootorder: %d\nBootOrder: ", size / sizeof (CHAR16));
4210fa
@@ -337,13 +326,11 @@ update_boot_order(void)
4210fa
 		Print(L"%04x ", newbootorder[j]);
4210fa
 	Print(L"\n");
4210fa
 #endif
4210fa
-
4210fa
-	if (oldbootorder) {
4210fa
+	rc = uefi_call_wrapper(RT->GetVariable, 5, L"BootOrder", &global,
4210fa
+			       NULL, &len, NULL);
4210fa
+	if (rc == EFI_BUFFER_TOO_SMALL)
4210fa
 		LibDeleteVariable(L"BootOrder", &global);
4210fa
-		FreePool(oldbootorder);
4210fa
-	}
4210fa
 
4210fa
-	EFI_STATUS rc;
4210fa
 	rc = uefi_call_wrapper(RT->SetVariable, 5, L"BootOrder", &global,
4210fa
 					EFI_VARIABLE_NON_VOLATILE |
4210fa
 					 EFI_VARIABLE_BOOTSERVICE_ACCESS |
4210fa
-- 
4210fa
1.9.3
4210fa