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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
From dce70fb042d91ba74359a6dfb519f31d77e2c328 Mon Sep 17 00:00:00 2001
From: Paul Kocialkowski <contact@paulk.fr>
Date: Mon, 10 Aug 2015 20:24:50 +0200
Subject: [PATCH 5/7] Proper firmware index report for read-only boot path
When booting from a read-only boot path, the active firmware to report is RO.
This is detected with the lack of a vboot handoff pointer.
Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
---
src/vboot/crossystem/fdt.c | 2 +-
src/vboot/firmware_id.c | 6 +++++-
src/vboot/firmware_id.h | 1 +
3 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/src/vboot/crossystem/fdt.c b/src/vboot/crossystem/fdt.c
index ca39dac..a79b192 100644
--- a/src/vboot/crossystem/fdt.c
+++ b/src/vboot/crossystem/fdt.c
@@ -73,7 +73,7 @@ static int install_crossystem_data(DeviceTreeFixup *fixup, DeviceTree *tree)
nvstorage_flash_get_blob_size());
}
- int fw_index = vdat->firmware_index;
+ int fw_index = get_active_fw_index(vdat);
const char *fwid;
int fwid_size;
diff --git a/src/vboot/firmware_id.c b/src/vboot/firmware_id.c
index 3662921..955bc84 100644
--- a/src/vboot/firmware_id.c
+++ b/src/vboot/firmware_id.c
@@ -36,6 +36,7 @@ static struct fwid {
} fw_fmap_ops[] = {
{VDAT_RW_A, "RW_FWID_A", NULL, 0, "RW A: ID NOT FOUND"},
{VDAT_RW_B, "RW_FWID_B", NULL, 0, "RW B: ID NOT FOUND"},
+ {VDAT_RO, "RO_FRID", NULL, 0, "RO: ID NOT FOUND"},
{VDAT_RECOVERY, "RO_FRID", NULL, 0, "RO: ID NOT FOUND"},
};
@@ -130,10 +131,13 @@ static VbSharedDataHeader *get_vdat(void)
return NULL;
}
-static inline int get_active_fw_index(VbSharedDataHeader *vdat)
+int get_active_fw_index(VbSharedDataHeader *vdat)
{
int fw_index = VDAT_UNKNOWN;
+ if (lib_sysinfo.vboot_handoff == NULL)
+ return VDAT_RO;
+
if (vdat)
fw_index = vdat->firmware_index;
diff --git a/src/vboot/firmware_id.h b/src/vboot/firmware_id.h
index fb6f206..090e9d1 100644
--- a/src/vboot/firmware_id.h
+++ b/src/vboot/firmware_id.h
@@ -49,6 +49,7 @@ int get_rwb_fw_size(void);
* Get firmware details for currently active fw type. It looks up vdat,
* identifies fw_index and returns appropriate id and size for that index.
*/
+int get_active_fw_index(VbSharedDataHeader *vdat);
const char *get_active_fw_id(void);
int get_active_fw_size(void);
--
1.9.1
|