backends/confidential-guest-support: Add functions to support IGVM

In preparation for supporting the processing of IGVM files to configure
guests, this adds a set of functions to ConfidentialGuestSupport
allowing configuration of secure virtual machines that can be
implemented for each supported isolation platform type such as Intel TDX
or AMD SEV-SNP. These functions will be called by IGVM processing code
in subsequent patches.

This commit provides a default implementation of the functions that
either perform no action or generate an error when they are called.
Targets that support ConfidentalGuestSupport should override these
implementations.

Signed-off-by: Roy Hopkins <roy.hopkins@randomman.co.uk>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Acked-by: Gerd Hoffman <kraxel@redhat.com>
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
Reviewed-by: Ani Sinha <anisinha@redhat.com>
Link: https://lore.kernel.org/r/23e34a106da87427899f93178102e4a6ef50c966.1751554099.git.roy.hopkins@randomman.co.uk
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Roy Hopkins 2025-07-03 16:03:10 +01:00 committed by Paolo Bonzini
parent 84fe49d94a
commit e7ed19507b
2 changed files with 98 additions and 0 deletions

View file

@ -14,15 +14,46 @@
#include "qemu/osdep.h"
#include "system/confidential-guest-support.h"
#include "qapi/error.h"
OBJECT_DEFINE_ABSTRACT_TYPE(ConfidentialGuestSupport,
confidential_guest_support,
CONFIDENTIAL_GUEST_SUPPORT,
OBJECT)
static bool check_support(ConfidentialGuestPlatformType platform,
uint16_t platform_version, uint8_t highest_vtl,
uint64_t shared_gpa_boundary)
{
/* Default: no support. */
return false;
}
static int set_guest_state(hwaddr gpa, uint8_t *ptr, uint64_t len,
ConfidentialGuestPageType memory_type,
uint16_t cpu_index, Error **errp)
{
error_setg(errp,
"Setting confidential guest state is not supported for this platform");
return -1;
}
static int get_mem_map_entry(int index, ConfidentialGuestMemoryMapEntry *entry,
Error **errp)
{
error_setg(
errp,
"Obtaining the confidential guest memory map is not supported for this platform");
return -1;
}
static void confidential_guest_support_class_init(ObjectClass *oc,
const void *data)
{
ConfidentialGuestSupportClass *cgsc = CONFIDENTIAL_GUEST_SUPPORT_CLASS(oc);
cgsc->check_support = check_support;
cgsc->set_guest_state = set_guest_state;
cgsc->get_mem_map_entry = get_mem_map_entry;
}
static void confidential_guest_support_init(Object *obj)

View file

@ -19,6 +19,7 @@
#define QEMU_CONFIDENTIAL_GUEST_SUPPORT_H
#include "qom/object.h"
#include "exec/hwaddr.h"
#define TYPE_CONFIDENTIAL_GUEST_SUPPORT "confidential-guest-support"
OBJECT_DECLARE_TYPE(ConfidentialGuestSupport,
@ -26,6 +27,36 @@ OBJECT_DECLARE_TYPE(ConfidentialGuestSupport,
CONFIDENTIAL_GUEST_SUPPORT)
typedef enum ConfidentialGuestPlatformType {
CGS_PLATFORM_SEV,
CGS_PLATFORM_SEV_ES,
CGS_PLATFORM_SEV_SNP,
} ConfidentialGuestPlatformType;
typedef enum ConfidentialGuestMemoryType {
CGS_MEM_RAM,
CGS_MEM_RESERVED,
CGS_MEM_ACPI,
CGS_MEM_NVS,
CGS_MEM_UNUSABLE,
} ConfidentialGuestMemoryType;
typedef struct ConfidentialGuestMemoryMapEntry {
uint64_t gpa;
uint64_t size;
ConfidentialGuestMemoryType type;
} ConfidentialGuestMemoryMapEntry;
typedef enum ConfidentialGuestPageType {
CGS_PAGE_TYPE_NORMAL,
CGS_PAGE_TYPE_VMSA,
CGS_PAGE_TYPE_ZERO,
CGS_PAGE_TYPE_UNMEASURED,
CGS_PAGE_TYPE_SECRETS,
CGS_PAGE_TYPE_CPUID,
CGS_PAGE_TYPE_REQUIRED_MEMORY,
} ConfidentialGuestPageType;
struct ConfidentialGuestSupport {
Object parent;
@ -64,6 +95,42 @@ typedef struct ConfidentialGuestSupportClass {
int (*kvm_init)(ConfidentialGuestSupport *cgs, Error **errp);
int (*kvm_reset)(ConfidentialGuestSupport *cgs, Error **errp);
/*
* Check to see if this confidential guest supports a particular
* platform or configuration.
*
* Return true if supported or false if not supported.
*/
bool (*check_support)(ConfidentialGuestPlatformType platform,
uint16_t platform_version, uint8_t highest_vtl,
uint64_t shared_gpa_boundary);
/*
* Configure part of the state of a guest for a particular set of data, page
* type and gpa. This can be used for example to pre-populate and measure
* guest memory contents, define private ranges or set the initial CPU state
* for one or more CPUs.
*
* If memory_type is CGS_PAGE_TYPE_VMSA then ptr points to the initial CPU
* context for a virtual CPU. The format of the data depends on the type of
* confidential virtual machine. For example, for SEV-ES ptr will point to a
* vmcb_save_area structure that should be copied into guest memory at the
* address specified in gpa. The cpu_index parameter contains the index of
* the CPU the VMSA applies to.
*/
int (*set_guest_state)(hwaddr gpa, uint8_t *ptr, uint64_t len,
ConfidentialGuestPageType memory_type,
uint16_t cpu_index, Error **errp);
/*
* Iterate the system memory map, getting the entry with the given index
* that can be populated into guest memory.
*
* Returns 0 for ok, 1 if the index is out of range and -1 on error.
*/
int (*get_mem_map_entry)(int index, ConfidentialGuestMemoryMapEntry *entry,
Error **errp);
} ConfidentialGuestSupportClass;
static inline int confidential_guest_kvm_init(ConfidentialGuestSupport *cgs,