From: Michael Mueller <mimu@linux.ibm.com>
To: Steffen Eiden <seiden@linux.ibm.com>,
qemu-s390x@nongnu.org, qemu-devel@nongnu.org
Cc: Janosch Frank <frankja@linux.ibm.com>,
Thomas Huth <thuth@redhat.com>,
David Hildenbrand <david@redhat.com>,
Michael Mueller <mimu@linux.vnet.ibm.com>,
Marc Hartmayer <mhartmay@linux.ibm.com>,
Christian Borntraeger <borntraeger@linux.ibm.com>
Subject: Re: [PATCH v3 5/5] target/s390x: AP-passthrough for PV guests
Date: Wed, 23 Aug 2023 10:55:01 +0200 [thread overview]
Message-ID: <08f3ffbc-2af6-8c4c-0152-3358d514e91e@linux.ibm.com> (raw)
In-Reply-To: <20230818111520.698615-6-seiden@linux.ibm.com>
On 18.08.23 13:15, Steffen Eiden wrote:
> Enabling AP-passthrough(AP-pt) for PV-guest by using the new CPU
> features for PV-AP-pt of KVM.
>
> As usual QEMU first checks which CPU features are available and then
> sets them if available and selected by user. An additional check is done
> to verify that PV-AP can only be enabled if "regular" AP-pt is enabled
> as well. Note that KVM itself does not enforce this restriction.
>
> Signed-off-by: Steffen Eiden <seiden@linux.ibm.com>
Signed-off-by: Michael Mueller <sMIMU@linux.ibm.com>
with the findings from Thomas H. integrated
> ---
> target/s390x/cpu_features.h | 1 +
> target/s390x/cpu_features_def.h.inc | 4 ++
> target/s390x/cpu_models.c | 2 +
> target/s390x/gen-features.c | 2 +
> target/s390x/kvm/kvm.c | 71 +++++++++++++++++++++++++++++
> 5 files changed, 80 insertions(+)
>
> diff --git a/target/s390x/cpu_features.h b/target/s390x/cpu_features.h
> index 87463f064d..a9bd68a2e1 100644
> --- a/target/s390x/cpu_features.h
> +++ b/target/s390x/cpu_features.h
> @@ -43,6 +43,7 @@ typedef enum {
> S390_FEAT_TYPE_KDSA,
> S390_FEAT_TYPE_SORTL,
> S390_FEAT_TYPE_DFLTCC,
> + S390_FEAT_TYPE_UV_FEAT_GUEST,
> } S390FeatType;
>
> /* Definition of a CPU feature */
> diff --git a/target/s390x/cpu_features_def.h.inc b/target/s390x/cpu_features_def.h.inc
> index e3cfe63735..e68da9b8ff 100644
> --- a/target/s390x/cpu_features_def.h.inc
> +++ b/target/s390x/cpu_features_def.h.inc
> @@ -379,3 +379,7 @@ DEF_FEAT(DEFLATE_GHDT, "dfltcc-gdht", DFLTCC, 1, "DFLTCC GDHT")
> DEF_FEAT(DEFLATE_CMPR, "dfltcc-cmpr", DFLTCC, 2, "DFLTCC CMPR")
> DEF_FEAT(DEFLATE_XPND, "dfltcc-xpnd", DFLTCC, 4, "DFLTCC XPND")
> DEF_FEAT(DEFLATE_F0, "dfltcc-f0", DFLTCC, 192, "DFLTCC format 0 parameter-block")
> +
> +/* Features exposed via the UV-CALL instruction */
> +DEF_FEAT(UV_FEAT_AP, "appv", UV_FEAT_GUEST, 4, "AP instructions installed for secure guests")
> +DEF_FEAT(UV_FEAT_AP_INTR, "appvi", UV_FEAT_GUEST, 5, "AP instructions interruption support for secure guests")
> diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
> index 42b52afdb4..65331c37a3 100644
> --- a/target/s390x/cpu_models.c
> +++ b/target/s390x/cpu_models.c
> @@ -483,6 +483,8 @@ static void check_consistency(const S390CPUModel *model)
> { S390_FEAT_DIAG_318, S390_FEAT_EXTENDED_LENGTH_SCCB },
> { S390_FEAT_NNPA, S390_FEAT_VECTOR },
> { S390_FEAT_RDP, S390_FEAT_LOCAL_TLB_CLEARING },
> + { S390_FEAT_UV_FEAT_AP, S390_FEAT_AP },
> + { S390_FEAT_UV_FEAT_AP_INTR, S390_FEAT_UV_FEAT_AP },
> };
> int i;
>
> diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c
> index 1e3b7c0dc9..2b2bfc3736 100644
> --- a/target/s390x/gen-features.c
> +++ b/target/s390x/gen-features.c
> @@ -576,6 +576,8 @@ static uint16_t full_GEN16_GA1[] = {
> S390_FEAT_RDP,
> S390_FEAT_PAI,
> S390_FEAT_PAIE,
> + S390_FEAT_UV_FEAT_AP,
> + S390_FEAT_UV_FEAT_AP_INTR,
> };
>
>
> diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c
> index a7e2cdf668..937387a768 100644
> --- a/target/s390x/kvm/kvm.c
> +++ b/target/s390x/kvm/kvm.c
> @@ -2307,6 +2307,42 @@ static bool ap_enabled(const S390FeatBitmap features)
> return test_bit(S390_FEAT_AP, features);
> }
>
> +static bool uv_feat_supported(void)
> +{
> + return kvm_vm_check_attr(kvm_state, KVM_S390_VM_CPU_MODEL,
> + KVM_S390_VM_CPU_PROCESSOR_UV_FEAT_GUEST);
> +}
> +
> +static int query_uv_feat_guest(S390FeatBitmap features)
> +{
> + struct kvm_s390_vm_cpu_uv_feat prop = {};
> + struct kvm_device_attr attr = {
> + .group = KVM_S390_VM_CPU_MODEL,
> + .attr = KVM_S390_VM_CPU_MACHINE_UV_FEAT_GUEST,
> + .addr = (uint64_t) &prop,
> + };
> + int rc;
> +
> + // AP support check is currently the only user of the UV feature test.
> + if (!(uv_feat_supported() && ap_available())) {
> + return 0;
> + }
> +
> + rc = kvm_vm_ioctl(kvm_state, KVM_GET_DEVICE_ATTR, &attr);
> + if (rc) {
> + return rc;
> + }
> +
> + if (prop.ap) {
> + set_bit(S390_FEAT_UV_FEAT_AP, features);
> + }
> + if (prop.ap_intr) {
> + set_bit(S390_FEAT_UV_FEAT_AP_INTR, features);
> + }
> +
> + return 0;
> +}
> +
> static int kvm_to_feat[][2] = {
> { KVM_S390_VM_CPU_FEAT_ESOP, S390_FEAT_ESOP },
> { KVM_S390_VM_CPU_FEAT_SIEF2, S390_FEAT_SIE_F2 },
> @@ -2501,11 +2537,39 @@ void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp)
> set_bit(S390_FEAT_DIAG_318, model->features);
> }
>
> + /* Test for Ultravisor features that influence secure guest behavior */
> + query_uv_feat_guest(model->features);
> +
> /* strip of features that are not part of the maximum model */
> bitmap_and(model->features, model->features, model->def->full_feat,
> S390_FEAT_MAX);
> }
>
> +static int configure_uv_feat_guest(const S390FeatBitmap features)
> +{
> +
> + struct kvm_s390_vm_cpu_uv_feat uv_feat = {};
> + struct kvm_device_attr attribute = {
> + .group = KVM_S390_VM_CPU_MODEL,
> + .attr = KVM_S390_VM_CPU_PROCESSOR_UV_FEAT_GUEST,
> + .addr = (__u64) &uv_feat,
> + };
> +
> + // AP support check is currently the only user of the UV feature test.
> + if (!(uv_feat_supported() && ap_enabled(features))) {
> + return 0;
> + }
> +
> + if (test_bit(S390_FEAT_UV_FEAT_AP, features)) {
> + uv_feat.ap = 1;
> + }
> + if (test_bit(S390_FEAT_UV_FEAT_AP_INTR, features)) {
> + uv_feat.ap_intr = 1;
> + }
> +
> + return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attribute);
> +}
> +
> static void kvm_s390_configure_apie(bool interpret)
> {
> uint64_t attr = interpret ? KVM_S390_VM_CRYPTO_ENABLE_APIE :
> @@ -2569,6 +2633,13 @@ void kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp)
> if (ap_enabled(model->features)) {
> kvm_s390_configure_apie(true);
> }
> +
> + /* configure UV-features for the guest indicated via query / test_bit */
> + rc = configure_uv_feat_guest(model->features);
> + if (rc) {
> + error_setg(errp, "KVM: Error configuring CPU UV features %d", rc);
> + return;
> + }
> }
>
> void kvm_s390_restart_interrupt(S390CPU *cpu)
prev parent reply other threads:[~2023-08-23 8:55 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-18 11:15 [PATCH v3 0/5] s390: Enable AP instructions for pv-guests Steffen Eiden
2023-08-18 11:15 ` [PATCH v3 1/5] s390x/ap: fix missing subsystem reset registration Steffen Eiden
2023-08-18 11:15 ` [PATCH v3 2/5] s390x: switch pv and subsystem reset ordering on reboot Steffen Eiden
2023-08-18 11:15 ` [PATCH v3 3/5] NOTFORMERGE update linux-headers/asm-s390/kvm.h Steffen Eiden
2023-08-18 11:15 ` [PATCH v3 4/5] target/s390x/kvm: Refactor AP functionalities Steffen Eiden
2023-08-21 7:57 ` Thomas Huth
2023-08-18 11:15 ` [PATCH v3 5/5] target/s390x: AP-passthrough for PV guests Steffen Eiden
2023-08-21 8:31 ` Thomas Huth
2023-08-23 8:55 ` Michael Mueller [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=08f3ffbc-2af6-8c4c-0152-3358d514e91e@linux.ibm.com \
--to=mimu@linux.ibm.com \
--cc=borntraeger@linux.ibm.com \
--cc=david@redhat.com \
--cc=frankja@linux.ibm.com \
--cc=mhartmay@linux.ibm.com \
--cc=mimu@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-s390x@nongnu.org \
--cc=seiden@linux.ibm.com \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).