sev: Provide sev_features flags from IGVM VMSA to KVM_SEV_INIT2
IGVM files can contain an initial VMSA that should be applied to each vcpu as part of the initial guest state. The sev_features flags are provided as part of the VMSA structure. However, KVM only allows sev_features to be set during initialization and not as the guest is being prepared for launch. This patch queries KVM for the supported set of sev_features flags and processes the VP context entries in the IGVM file during kvm_init to determine any sev_features flags set in the IGVM file. These are then provided in the call to KVM_SEV_INIT2 to ensure the guest state matches that specified in the IGVM file. The igvm process() function is modified to allow a partial processing of the file during initialization, with only the IGVM_VHT_VP_CONTEXT fields being processed. This means the function is called twice, firstly to extract the sev_features then secondly to actually configure the guest. Signed-off-by: Roy Hopkins <roy.hopkins@randomman.co.uk> Acked-by: Michael S. Tsirkin <mst@redhat.com> Acked-by: Stefano Garzarella <sgarzare@redhat.com> Acked-by: Gerd Hoffman <kraxel@redhat.com> Tested-by: Stefano Garzarella <sgarzare@redhat.com> Reviewed-by: Liam Merwick <liam.merwick@oracle.com> Reviewed-by: Ani Sinha <anisinha@redhat.com> Link: https://lore.kernel.org/r/b2f986aae04e1da2aee530c9be22a54c0c59a560.1751554099.git.roy.hopkins@randomman.co.uk Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
2ff75825cc
commit
d60238b4c1
6 changed files with 163 additions and 26 deletions
|
|
@ -880,7 +880,7 @@ static IgvmHandle qigvm_file_init(char *filename, Error **errp)
|
|||
}
|
||||
|
||||
int qigvm_process_file(IgvmCfg *cfg, ConfidentialGuestSupport *cgs,
|
||||
Error **errp)
|
||||
bool onlyVpContext, Error **errp)
|
||||
{
|
||||
int32_t header_count;
|
||||
QIgvmParameterData *parameter;
|
||||
|
|
@ -924,11 +924,22 @@ int qigvm_process_file(IgvmCfg *cfg, ConfidentialGuestSupport *cgs,
|
|||
ctx.current_header_index++) {
|
||||
IgvmVariableHeaderType type = igvm_get_header_type(
|
||||
ctx.file, IGVM_HEADER_SECTION_DIRECTIVE, ctx.current_header_index);
|
||||
if (qigvm_handler(&ctx, type, errp) < 0) {
|
||||
goto cleanup_parameters;
|
||||
if (!onlyVpContext || (type == IGVM_VHT_VP_CONTEXT)) {
|
||||
if (qigvm_handler(&ctx, type, errp) < 0) {
|
||||
goto cleanup_parameters;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If only processing the VP context then we don't need to process
|
||||
* any more of the file.
|
||||
*/
|
||||
if (onlyVpContext) {
|
||||
retval = 0;
|
||||
goto cleanup_parameters;
|
||||
}
|
||||
|
||||
header_count =
|
||||
igvm_header_count(ctx.file, IGVM_HEADER_SECTION_INITIALIZATION);
|
||||
if (header_count < 0) {
|
||||
|
|
|
|||
|
|
@ -17,6 +17,6 @@
|
|||
#include "qapi/error.h"
|
||||
|
||||
int qigvm_process_file(IgvmCfg *igvm, ConfidentialGuestSupport *cgs,
|
||||
Error **errp);
|
||||
bool onlyVpContext, Error **errp);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue