hw/uefi: add variable digest to vmstate
Add digest to vmstate if needed. Clear digest before loading vmstate to make sure it is initialized. Fixes: db1ecfb473ac ("hw/uefi: add var-service-vars.c") Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-ID: <20260304075954.584423-1-kraxel@redhat.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Gerd Hoffmann committed
Mar 4, 2026 at 08:59 UTC
b28c3ad1d63c2fe167b6f93fad1616ecd769e599
1 file changed
+37
hw/uefi/var-service-vars.c
+37
@@ -37,8 +37,41 @@ const VMStateDescription vmstate_uefi_time = {
37
},
38
};
39
40
+static int uefi_vars_pre_load(void *opaque)
41
+{
42
+ uefi_variable *var = opaque;
43
+
44
+ /* clear digest which is optional in the live migration data stream */
45
+ var->digest = NULL;
46
+ var->digest_size = 0;
47
+ return 0;
48
+}
49
+
50
+static bool uefi_vars_digest_is_needed(void *opaque)
51
+{
52
+ uefi_variable *var = opaque;
53
+
54
+ if ((var->attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS)
55
+ && !uefi_vars_is_sb_any(var)) {
56
+ return true;
57
+ }
58
+ return false;
59
+}
60
+
61
+const VMStateDescription vmstate_uefi_variable_digest = {
62
+ .name = "uefi-variable-digest",
63
+ .needed = uefi_vars_digest_is_needed,
64
+ .fields = (VMStateField[]) {
65
+ VMSTATE_UINT32(digest_size, uefi_variable),
66
+ VMSTATE_VBUFFER_ALLOC_UINT32(digest, uefi_variable,
67
+ 0, NULL, digest_size),
68
+ VMSTATE_END_OF_LIST()
69
+ },
70
+};
71
+
72
const VMStateDescription vmstate_uefi_variable = {
73
.name = "uefi-variable",
74
+ .pre_load = uefi_vars_pre_load,
75
.fields = (VMStateField[]) {
76
VMSTATE_UINT8_ARRAY_V(guid.data, uefi_variable, sizeof(QemuUUID), 0),
77
VMSTATE_UINT32(name_size, uefi_variable),
@@ -49,6 +82,10 @@ const VMStateDescription vmstate_uefi_variable = {
82
VMSTATE_STRUCT(time, uefi_variable, 0, vmstate_uefi_time, efi_time),
83
VMSTATE_END_OF_LIST()
84
},
85
+ .subsections = (const VMStateDescription * const []) {
86
+ &vmstate_uefi_variable_digest,
87
+ NULL
88
+ }
89
};
90
91
uefi_variable *uefi_vars_find_variable(uefi_vars_state *uv, QemuUUID guid,