On 7/21/22 15:22, Janosch Frank wrote:
> Introduce an interface over which we can get information about UV data.
>
> Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
Reviewed-by: Steffen Eiden <seiden@linux.ibm.com>
> ---
> hw/s390x/pv.c | 61 ++++++++++++++++++++++++++++++++++++++
> hw/s390x/s390-virtio-ccw.c | 5 ++++
> include/hw/s390x/pv.h | 10 +++++++
> 3 files changed, 76 insertions(+)
>
> diff --git a/hw/s390x/pv.c b/hw/s390x/pv.c
> index 401b63d6cb..a5af4ddf46 100644
> --- a/hw/s390x/pv.c
> +++ b/hw/s390x/pv.c
> @@ -20,6 +20,11 @@
> #include "exec/confidential-guest-support.h"
> #include "hw/s390x/ipl.h"
> #include "hw/s390x/pv.h"
> +#include "target/s390x/kvm/kvm_s390x.h"
> +
> +static bool info_valid;
> +static struct kvm_s390_pv_info_vm info_vm;
> +static struct kvm_s390_pv_info_dump info_dump;
>
> static int __s390_pv_cmd(uint32_t cmd, const char *cmdname, void *data)
> {
> @@ -56,6 +61,42 @@ static int __s390_pv_cmd(uint32_t cmd, const char *cmdname, void *data)
> } \
> }
>
> +int s390_pv_query_info(void)
> +{
> + struct kvm_s390_pv_info info = {
> + .header.id = KVM_PV_INFO_VM,
> + .header.len_max = sizeof(info.header) + sizeof(info.vm),
> + };
> + int rc;
> +
> + /* Info API's first user is dump so they are bundled */
> + if (!kvm_s390_get_protected_dump()) {
> + return 0;
> + }
> +
> + rc = s390_pv_cmd(KVM_PV_INFO, &info);
> + if (rc) {
> + error_report("KVM PV INFO cmd %x failed: %s",
> + info.header.id, strerror(rc));
> + return rc;
> + }
> + memcpy(&info_vm, &info.vm, sizeof(info.vm));
> +
> + info.header.id = KVM_PV_INFO_DUMP;
> + info.header.len_max = sizeof(info.header) + sizeof(info.dump);
> + rc = s390_pv_cmd(KVM_PV_INFO, &info);
> + if (rc) {
> + error_report("KVM PV INFO cmd %x failed: %s",
> + info.header.id, strerror(rc));
> + return rc;
> + }
> +
> + memcpy(&info_dump, &info.dump, sizeof(info.dump));
> + info_valid = true;
> +
> + return rc;
> +}
> +
> int s390_pv_vm_enable(void)
> {
> return s390_pv_cmd(KVM_PV_ENABLE, NULL);
> @@ -114,6 +155,26 @@ void s390_pv_inject_reset_error(CPUState *cs)
> env->regs[r1 + 1] = DIAG_308_RC_INVAL_FOR_PV;
> }
>
> +uint64_t kvm_s390_pv_dmp_get_size_cpu(void)
> +{
> + return info_dump.dump_cpu_buffer_len;
> +}
> +
> +uint64_t kvm_s390_pv_dmp_get_size_complete(void)
> +{
> + return info_dump.dump_config_finalize_len;
> +}
> +
> +uint64_t kvm_s390_pv_dmp_get_size_mem(void)
> +{
> + return info_dump.dump_config_mem_buffer_per_1m;
> +}
> +
> +bool kvm_s390_pv_info_basic_valid(void)
> +{
> + return info_valid;
> +}
> +
> #define TYPE_S390_PV_GUEST "s390-pv-guest"
> OBJECT_DECLARE_SIMPLE_TYPE(S390PVGuest, S390_PV_GUEST)
>
> diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
> index cc3097bfee..f9401e392b 100644
> --- a/hw/s390x/s390-virtio-ccw.c
> +++ b/hw/s390x/s390-virtio-ccw.c
> @@ -366,6 +366,11 @@ static int s390_machine_protect(S390CcwMachineState *ms)
>
> ms->pv = true;
>
> + rc = s390_pv_query_info();
> + if (rc) {
> + goto out_err;
> + }
> +
> /* Set SE header and unpack */
> rc = s390_ipl_prepare_pv_header();
> if (rc) {
> diff --git a/include/hw/s390x/pv.h b/include/hw/s390x/pv.h
> index 1f1f545bfc..6fa55bf70e 100644
> --- a/include/hw/s390x/pv.h
> +++ b/include/hw/s390x/pv.h
> @@ -38,6 +38,7 @@ static inline bool s390_is_pv(void)
> return ccw->pv;
> }
>
> +int s390_pv_query_info(void);
> int s390_pv_vm_enable(void);
> void s390_pv_vm_disable(void);
> int s390_pv_set_sec_parms(uint64_t origin, uint64_t length);
> @@ -46,8 +47,13 @@ void s390_pv_prep_reset(void);
> int s390_pv_verify(void);
> void s390_pv_unshare(void);
> void s390_pv_inject_reset_error(CPUState *cs);
> +uint64_t kvm_s390_pv_dmp_get_size_cpu(void);
> +uint64_t kvm_s390_pv_dmp_get_size_mem(void);
> +uint64_t kvm_s390_pv_dmp_get_size_complete(void);
> +bool kvm_s390_pv_info_basic_valid(void);
> #else /* CONFIG_KVM */
> static inline bool s390_is_pv(void) { return false; }
> +static inline int s390_pv_query_info(void) { return 0; }
> static inline int s390_pv_vm_enable(void) { return 0; }
> static inline void s390_pv_vm_disable(void) {}
> static inline int s390_pv_set_sec_parms(uint64_t origin, uint64_t length) { return 0; }
> @@ -56,6 +62,10 @@ static inline void s390_pv_prep_reset(void) {}
> static inline int s390_pv_verify(void) { return 0; }
> static inline void s390_pv_unshare(void) {}
> static inline void s390_pv_inject_reset_error(CPUState *cs) {};
> +static inline uint64_t kvm_s390_pv_dmp_get_size_cpu(void) { return 0; }
> +static inline uint64_t kvm_s390_pv_dmp_get_size_mem(void) { return 0; }
> +static inline uint64_t kvm_s390_pv_dmp_get_size_complete(void) { return 0; }
> +static inline bool kvm_s390_pv_info_basic_valid(void) { return false; }
> #endif /* CONFIG_KVM */
>
> int s390_pv_kvm_init(ConfidentialGuestSupport *cgs, Error **errp);