@samitouri / QOSamiQemu / commits / b28c3ad1d6

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,