summaryrefslogtreecommitdiff
path: root/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0040-fix-runtime-capsule-update-flags-checks.patch
blob: b1d400d715abc55d30f1dd26d937c1214a76ccfb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
From a83aa9e1b8f6e312da82e54614fbca498493c34d Mon Sep 17 00:00:00 2001
From: Emekcan Aras <emekcan.aras@arm.com>
Date: Thu, 19 Oct 2023 14:56:55 +0100
Subject: [PATCH] fix runtime capsule update flags checks for corstone1000

Fixes capsule update flags checks in capsule update as these checks are missing
in the platform-specific capsule-update implementation in corstone1000.

Signed-off-by: Emekcan Aras <emekcan.aras@arm.com>
Upstream-Status: Inappropriate [Redesign of Capsule update interface is required]
---
 lib/efi_loader/efi_capsule.c | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c
index 307bcfd73c..34507482b7 100644
--- a/lib/efi_loader/efi_capsule.c
+++ b/lib/efi_loader/efi_capsule.c
@@ -854,6 +854,34 @@ efi_status_t __efi_runtime EFIAPI efi_update_capsule(
			continue;
		}

+		/* According to UEFI specs when the flag is CAPSULE_FLAGS_PERSIST_ACROSS_RESET,
+		ScatterGatherList can't be NULL.*/
+		if ((capsule->flags & CAPSULE_FLAGS_PERSIST_ACROSS_RESET) &&
+		    scatter_gather_list == 0){
+			ret = EFI_INVALID_PARAMETER;
+			goto out;
+		}
+
+		/*According to UEFI specs a capsule which has the CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE
+		 * flag must have CAPSULE_FLAGS_PERSIST_ACROSS_RESET set in its
+		 * header as well.*/
+		if (capsule->flags & CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE){
+			if(!(capsule->flags & CAPSULE_FLAGS_PERSIST_ACROSS_RESET)){
+				ret = EFI_INVALID_PARAMETER;
+				goto out;
+			}
+		}
+
+		/* According to UEFI specs, a capsule which has the CAPSULE_FLAGS_INITIATE_RESET
+		 * Flag must have  CAPSULE_FLAGS_PERSIST_ACROSS_RESET set in its
+		 * header as well.*/
+		if (capsule->flags & CAPSULE_FLAGS_INITIATE_RESET){
+			if(!(capsule->flags & CAPSULE_FLAGS_PERSIST_ACROSS_RESET)){
+				ret = EFI_INVALID_PARAMETER;
+				goto out;
+			}
+		}
+
		log_debug("Capsule[%d] (guid:%pUs)\n",
			  i, &capsule->capsule_guid);

--
2.25.1