| /* |
| * Guest driven VM launch state update device via IGVM. |
| * The definitions in this header defines the API for the hypervisor interface. |
| * For details and specification, please look at docs/specs/vmlaunchupdate.rst. |
| * |
| * Copyright (C) 2026 Red Hat, Inc. |
| * |
| * Authors: Ani Sinha <anisinha@redhat.com> |
| * |
| * SPDX-License-Identifier: GPL-2.0-or-later |
| * |
| */ |
| #ifndef VMLAUNCHUPDATE_API_H |
| #define VMLAUNCHUPDATE_API_H |
| |
| /* fw-cfg file definition */ |
| #define FILE_VMLAUNCHUPDATE "etc/vmlaunchupdate" |
| |
| /* version */ |
| #define VM_LAUNCHUPDATE_VERSION 0x01 |
| |
| /* format bits, used by both 'capabilities' and 'control' */ |
| |
| /* igvm */ |
| #define VM_LAUNCHUPDATE_FORMAT_IGVM (1ULL << 32) |
| |
| /* 'control' field bits */ |
| |
| /* disable vmlaunchupdate interface */ |
| #define VM_LAUNCHUPDATE_CTL_DISABLE (1 << 0) |
| /* revert to the original host provided igvm */ |
| #define VM_LAUNCHUPDATE_CTL_HOST_IGVM (1 << 1) |
| |
| /* The combination of the above two ctl interfaces work as |
| * follows: |
| * |
| * A) CTL_HOST_IGVM=off CTL_DISABLE=off |
| * |
| * Supplied IGVM file replaces the firmware permanently. Updating the |
| * firmware again is possible. |
| * |
| * B) CTL_HOST_IGVM=off CTL_DISABLE=on |
| * |
| * Supplied IGVM file replaces the firmware permanently. Updating the |
| * firmware again is not possible. |
| * |
| * C) CTL_HOST_IGVM=on CTL_DISABLE=off |
| * |
| * Supplied IGVM file replaces the firmware for one reset. Resetting |
| * again will switch back to the original firmware. Updating the |
| * firmware again is possible. |
| * |
| * D) CTL_HOST_IGVM=on CTL_DISABLE=on |
| * |
| * Supplied IGVM file replaces the firmware for one reset. Resetting |
| * again will switch back to the original firmware. Updating the |
| * firmware again is NOT possible. |
| * |
| */ |
| |
| /* status code */ |
| enum VMLaunchUpdateStatus { |
| VM_LAUNCHUPDATE_SUCCESS = 0, |
| VM_LAUNCHUPDATE_LOAD_FAIL = 1, |
| VM_LAUNCHUPDATE_NOT_IGVM_INIT = 2, |
| }; |
| |
| typedef struct QEMU_PACKED { |
| /* api version */ |
| uint16_t version; |
| |
| /* |
| * The guest can read this in order to determine if loading new IGVM |
| * succeeded. |
| */ |
| uint16_t status; |
| |
| uint32_t _padding; |
| |
| /* VMM capabilities, read-only. */ |
| uint64_t capabilities; |
| /* control bits, see VMFWUPDATE_CTL_* */ |
| uint64_t control; |
| |
| /* |
| * address and size of the IGVM image. Will be cleared when |
| * the write completes successfully and IGVM file is correctly parsed. |
| */ |
| uint64_t fw_image_addr; |
| uint64_t fw_image_size; |
| |
| /* |
| * address + size of opaque blob. The guest can use this to pass on |
| * information, for example which memory region the linux kernel has been |
| * loaded to. writable, will be kept intact on firmware update. |
| */ |
| uint64_t opaque_addr; |
| uint64_t opaque_size; |
| |
| } VMLaunchUpdate; |
| |
| #endif |