Re: [PATCH v2] ch: Enable SEV SNP support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Feb 06, 2025 at 11:11:11AM -0600, Praveen K Paladugu wrote:
> Enable SEV-SNP support for ch guests.
> 
> Co-Authored-by: Smit Gardhariya <sgardhariya@xxxxxxxxxxxxx>
> Signed-off-by: Praveen K Paladugu <praveenkpaladugu@xxxxxxxxx>
> ---
>  src/ch/ch_monitor.c | 70 +++++++++++++++++++++++++++++++++++++--------
>  1 file changed, 58 insertions(+), 12 deletions(-)
> 
> diff --git a/src/ch/ch_monitor.c b/src/ch/ch_monitor.c
> index bedcde2dde..55f0353fa9 100644
> --- a/src/ch/ch_monitor.c
> +++ b/src/ch/ch_monitor.c
> @@ -130,29 +130,56 @@ static int
>  virCHMonitorBuildPayloadJson(virJSONValue *content, virDomainDef *vmdef)
>  {
>      g_autoptr(virJSONValue) payload = virJSONValueNewObject();
> -
> +    g_autofree unsigned char *tmp = NULL;
> +    size_t len;
> +    g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
> +    g_autofree char *host_data = NULL;
> +    const size_t host_data_len = 32;

All these 5 vars are only used within the lower 'if' scope, so
lets move them there....

>  
>      if (vmdef->os.kernel == NULL) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                       _("Kernel image path in this domain is not defined"));
> +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                       _("Kernel image path is not defined. With sev_snp=on, pass an igvm path"));
>          return -1;
> -    } else {
> -        if (virJSONValueObjectAppendString(payload, "kernel", vmdef->os.kernel) < 0)
> -            return -1;
>      }
>  
> -    if (vmdef->os.cmdline) {
> -        if (virJSONValueObjectAppendString(payload, "cmdline", vmdef->os.cmdline) < 0)
> +    if (vmdef->sec &&
> +        vmdef->sec->sectype == VIR_DOMAIN_LAUNCH_SECURITY_SEV_SNP) {
> +        if (virJSONValueObjectAppendString(payload, "igvm", vmdef->os.kernel) < 0)
>              return -1;
> -    }
>  
> -    if (vmdef->os.initrd != NULL) {
> -        if (virJSONValueObjectAppendString(payload, "initramfs", vmdef->os.initrd) < 0)
> +        if (vmdef->sec->data.sev_snp.host_data) {
> +            /* Libvirt provided host_data is base64 encoded and cloud-hypervisor
> +               requires host_data as hex encoded. Base64 decode and hex encode
> +               before sending to cloud-hypervisor.*/
> +            tmp = g_base64_decode(vmdef->sec->data.sev_snp.host_data, &len);
> +            if (len != host_data_len) {
> +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                               _("Invalid host_data provdied. Expected '%1$ld' bytes"),
> +                               host_data_len);
> +                return -1;
> +            }
> +
> +            while (len > 0) {
> +                virBufferAsprintf(&buf, "%02x", tmp[host_data_len-len]);
> +                len--;
> +            }
> +
> +            host_data = virBufferContentAndReset(&buf);


The idea of converting a byte array to a hex string is generally
useful, so preferrably add a helper to src/util/virstring.h

  char *virStringFormatHex(uint8_t *buf, size_t len);

> +            if (virJSONValueObjectAppendString(payload, "host_data",
> +                                               host_data) < 0)
> +                return -1;
> +        }
> +    } else {
> +        if (virJSONValueObjectAdd(&payload,
> +                                  "s:kernel", vmdef->os.kernel,
> +                                  "S:cmdline", vmdef->os.cmdline,
> +                                  "S:initramfs", vmdef->os.initrd,
> +                                  NULL) < 0)
>              return -1;
>      }
>  
>      if (virJSONValueObjectAppend(content, "payload", &payload) < 0)
> -    return -1;
> +        return -1;
>  
>      return 0;
>  }
> @@ -426,6 +453,23 @@ virCHMonitorBuildDevicesJson(virJSONValue *content,
>      return 0;
>  }
>  
> +static int
> +virCHMonitorBuildPlatformJson(virJSONValue *content, virDomainDef *vmdef)
> +{
> +    g_autoptr(virJSONValue) platform = virJSONValueNewObject();
> +
> +    if (vmdef->sec &&
> +        vmdef->sec->sectype == VIR_DOMAIN_LAUNCH_SECURITY_SEV_SNP) {
> +        if (virJSONValueObjectAppendBoolean(platform, "sev_snp", 1) < 0)
> +            return -1;
> +
> +        if (virJSONValueObjectAppend(content, "platform", &platform) < 0)
> +            return -1;
> +    }
> +
> +    return 0;
> +}
> +
>  static int
>  virCHMonitorBuildVMJson(virCHDriver *driver, virDomainDef *vmdef,
>                          char **jsonstr)
> @@ -454,6 +498,8 @@ virCHMonitorBuildVMJson(virCHDriver *driver, virDomainDef *vmdef,
>              return -1;
>      }
>  
> +    if (virCHMonitorBuildPlatformJson(content, vmdef) < 0)
> +        return -1;
>  
>      if (virCHMonitorBuildDisksJson(content, vmdef) < 0)
>          return -1;
> -- 
> 2.47.0
> 

With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux