* [PATCH v2 0/3] KVM: s390: Enable AP instructions for pv-guests
@ 2023-08-10 12:47 Steffen Eiden
2023-08-10 12:47 ` [PATCH v2 1/3] linux-headers: update asm-s390/kvm.h Steffen Eiden
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Steffen Eiden @ 2023-08-10 12:47 UTC (permalink / raw)
To: qemu-s390x, qemu-devel
Cc: Janosch Frank, Thomas Huth, David Hildenbrand, Michael Mueller,
Marc Hartmayer, Christian Borntraeger
This series enables general QEMU support for AP pass-through for Secure
Execution guests (pv-guests).
To enable AP-PT on pv-guests QEMU has to turn on the corresponding bits
in the KVM CPU-model[1] if the CPU firmware supports it. However, it
only makes sense to turn on AP-PT if the QEMU user enabled (general) AP
for that guest.
The series consists of three patches:
1) update kvm-s390 header for this series
2) small cleanup for kvm_s390_set_attr()
refactor code to add ap_available() and ap_enabled()
3) Add UV_CALL CPU model enablement
since v1:
- removed the new features from the default gen16 model
- updated KVM-headers to match KVM series v3 [1]
- applied review comments from Thomas
[1]
https://lore.kernel.org/linux-s390/20230810113255.2163043-1-seiden@linux.ibm.com/#t
Steffen
Steffen Eiden (3):
linux-headers: update asm-s390/kvm.h
target/s390x/kvm: Refactor AP functionalities
target/s390x: AP-passthrough for PV guests
linux-headers/asm-s390/kvm.h | 16 +++++
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 | 97 ++++++++++++++++++++++++++---
6 files changed, 115 insertions(+), 7 deletions(-)
--
2.40.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 1/3] linux-headers: update asm-s390/kvm.h
2023-08-10 12:47 [PATCH v2 0/3] KVM: s390: Enable AP instructions for pv-guests Steffen Eiden
@ 2023-08-10 12:47 ` Steffen Eiden
2023-08-14 14:25 ` Thomas Huth
2023-08-10 12:47 ` [PATCH v2 2/3] target/s390x/kvm: Refactor AP functionalities Steffen Eiden
2023-08-10 12:47 ` [PATCH v2 3/3] target/s390x: AP-passthrough for PV guests Steffen Eiden
2 siblings, 1 reply; 7+ messages in thread
From: Steffen Eiden @ 2023-08-10 12:47 UTC (permalink / raw)
To: qemu-s390x, qemu-devel
Cc: Janosch Frank, Thomas Huth, David Hildenbrand, Michael Mueller,
Marc Hartmayer, Christian Borntraeger
Signed-off-by: Steffen Eiden <seiden@linux.ibm.com>
---
| 16 ++++++++++++++++
1 file changed, 16 insertions(+)
--git a/linux-headers/asm-s390/kvm.h b/linux-headers/asm-s390/kvm.h
index e2afd95420..023a2763a9 100644
--- a/linux-headers/asm-s390/kvm.h
+++ b/linux-headers/asm-s390/kvm.h
@@ -159,6 +159,22 @@ struct kvm_s390_vm_cpu_subfunc {
__u8 reserved[1728];
};
+#define KVM_S390_VM_CPU_PROCESSOR_UV_FEAT_GUEST 6
+#define KVM_S390_VM_CPU_MACHINE_UV_FEAT_GUEST 7
+
+#define KVM_S390_VM_CPU_UV_FEAT_NR_BITS 64
+struct kvm_s390_vm_cpu_uv_feat {
+ union {
+ struct {
+ __u64 : 4;
+ __u64 ap : 1; /* bit 4 */
+ __u64 ap_intr : 1; /* bit 5 */
+ __u64 : 58;
+ };
+ __u64 feat;
+ };
+};
+
/* kvm attributes for crypto */
#define KVM_S390_VM_CRYPTO_ENABLE_AES_KW 0
#define KVM_S390_VM_CRYPTO_ENABLE_DEA_KW 1
--
2.40.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2 2/3] target/s390x/kvm: Refactor AP functionalities
2023-08-10 12:47 [PATCH v2 0/3] KVM: s390: Enable AP instructions for pv-guests Steffen Eiden
2023-08-10 12:47 ` [PATCH v2 1/3] linux-headers: update asm-s390/kvm.h Steffen Eiden
@ 2023-08-10 12:47 ` Steffen Eiden
2023-08-17 12:43 ` Michael Mueller
2023-08-10 12:47 ` [PATCH v2 3/3] target/s390x: AP-passthrough for PV guests Steffen Eiden
2 siblings, 1 reply; 7+ messages in thread
From: Steffen Eiden @ 2023-08-10 12:47 UTC (permalink / raw)
To: qemu-s390x, qemu-devel
Cc: Janosch Frank, Thomas Huth, David Hildenbrand, Michael Mueller,
Marc Hartmayer, Christian Borntraeger
kvm_s390_set_attr() is a misleading name as it only sets attributes for
the KVM_S390_VM_CRYPTO group. Therefore, rename it to
kvm_s390_set_crypto_attr().
Add new functions ap_available() and ap_enabled() to avoid code
duplication later.
Signed-off-by: Steffen Eiden <seiden@linux.ibm.com>
---
target/s390x/kvm/kvm.c | 24 +++++++++++++++++-------
1 file changed, 17 insertions(+), 7 deletions(-)
diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c
index a9e5880349..a7e2cdf668 100644
--- a/target/s390x/kvm/kvm.c
+++ b/target/s390x/kvm/kvm.c
@@ -250,7 +250,7 @@ static void kvm_s390_enable_cmma(void)
trace_kvm_enable_cmma(rc);
}
-static void kvm_s390_set_attr(uint64_t attr)
+static void kvm_s390_set_crypto_attr(uint64_t attr)
{
struct kvm_device_attr attribute = {
.group = KVM_S390_VM_CRYPTO,
@@ -275,7 +275,7 @@ static void kvm_s390_init_aes_kw(void)
}
if (kvm_vm_check_attr(kvm_state, KVM_S390_VM_CRYPTO, attr)) {
- kvm_s390_set_attr(attr);
+ kvm_s390_set_crypto_attr(attr);
}
}
@@ -289,7 +289,7 @@ static void kvm_s390_init_dea_kw(void)
}
if (kvm_vm_check_attr(kvm_state, KVM_S390_VM_CRYPTO, attr)) {
- kvm_s390_set_attr(attr);
+ kvm_s390_set_crypto_attr(attr);
}
}
@@ -2296,6 +2296,17 @@ static int configure_cpu_subfunc(const S390FeatBitmap features)
return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
}
+static bool ap_available(void)
+{
+ return kvm_vm_check_attr(kvm_state, KVM_S390_VM_CRYPTO,
+ KVM_S390_VM_CRYPTO_ENABLE_APIE);
+}
+
+static bool ap_enabled(const S390FeatBitmap features)
+{
+ return test_bit(S390_FEAT_AP, features);
+}
+
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 },
@@ -2475,8 +2486,7 @@ void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp)
return;
}
/* for now, we can only provide the AP feature with HW support */
- if (kvm_vm_check_attr(kvm_state, KVM_S390_VM_CRYPTO,
- KVM_S390_VM_CRYPTO_ENABLE_APIE)) {
+ if (ap_available()) {
set_bit(S390_FEAT_AP, model->features);
}
@@ -2502,7 +2512,7 @@ static void kvm_s390_configure_apie(bool interpret)
KVM_S390_VM_CRYPTO_DISABLE_APIE;
if (kvm_vm_check_attr(kvm_state, KVM_S390_VM_CRYPTO, attr)) {
- kvm_s390_set_attr(attr);
+ kvm_s390_set_crypto_attr(attr);
}
}
@@ -2556,7 +2566,7 @@ void kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp)
kvm_s390_enable_cmma();
}
- if (test_bit(S390_FEAT_AP, model->features)) {
+ if (ap_enabled(model->features)) {
kvm_s390_configure_apie(true);
}
}
--
2.40.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2 3/3] target/s390x: AP-passthrough for PV guests
2023-08-10 12:47 [PATCH v2 0/3] KVM: s390: Enable AP instructions for pv-guests Steffen Eiden
2023-08-10 12:47 ` [PATCH v2 1/3] linux-headers: update asm-s390/kvm.h Steffen Eiden
2023-08-10 12:47 ` [PATCH v2 2/3] target/s390x/kvm: Refactor AP functionalities Steffen Eiden
@ 2023-08-10 12:47 ` Steffen Eiden
2023-08-17 11:56 ` Janosch Frank
2 siblings, 1 reply; 7+ messages in thread
From: Steffen Eiden @ 2023-08-10 12:47 UTC (permalink / raw)
To: qemu-s390x, qemu-devel
Cc: Janosch Frank, Thomas Huth, David Hildenbrand, Michael Mueller,
Marc Hartmayer, Christian Borntraeger
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>
---
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 | 73 +++++++++++++++++++++++++++++
5 files changed, 82 insertions(+)
diff --git a/target/s390x/cpu_features.h b/target/s390x/cpu_features.h
index 87463f064d..40928c60e9 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_CALL,
} 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..9a2c5a9dfc 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_CALL_AP, "appv", UV_CALL, 4, "AP instructions installed for secure guests")
+DEF_FEAT(UV_CALL_AP_INTR, "appvi", UV_CALL, 5, "AP instructions interpretation for secure guests")
diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
index 42b52afdb4..a7900a8a5c 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_CALL_AP, S390_FEAT_AP },
+ { S390_FEAT_UV_CALL_AP_INTR, S390_FEAT_UV_CALL_AP },
};
int i;
diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c
index 1e3b7c0dc9..6ae10a2cd8 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_CALL_AP,
+ S390_FEAT_UV_CALL_AP_INTR,
};
diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c
index a7e2cdf668..500b9d894d 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;
+
+ if (!uv_feat_supported()) {
+ return 0;
+ }
+
+ rc = kvm_vm_ioctl(kvm_state, KVM_GET_DEVICE_ATTR, &attr);
+ if (rc) {
+ return rc;
+ }
+
+ if (ap_available()) {
+ if (prop.ap) {
+ set_bit(S390_FEAT_UV_CALL_AP, features);
+ }
+ if (prop.ap_intr) {
+ set_bit(S390_FEAT_UV_CALL_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,41 @@ 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,
+ bool interpret)
+{
+
+ 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,
+ };
+
+ if (!uv_feat_supported()) {
+ return 0;
+ }
+
+ if (ap_enabled(features)) {
+ if (test_bit(S390_FEAT_UV_CALL_AP, features)) {
+ uv_feat.ap = 1;
+ }
+ if (test_bit(S390_FEAT_UV_CALL_AP_INTR, features) && interpret) {
+ 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 +2635,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, true);
+ if (rc) {
+ error_setg(errp, "KVM: Error configuring CPU UV features %d", rc);
+ return;
+ }
}
void kvm_s390_restart_interrupt(S390CPU *cpu)
--
2.40.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2 1/3] linux-headers: update asm-s390/kvm.h
2023-08-10 12:47 ` [PATCH v2 1/3] linux-headers: update asm-s390/kvm.h Steffen Eiden
@ 2023-08-14 14:25 ` Thomas Huth
0 siblings, 0 replies; 7+ messages in thread
From: Thomas Huth @ 2023-08-14 14:25 UTC (permalink / raw)
To: Steffen Eiden, qemu-s390x, qemu-devel
Cc: Janosch Frank, David Hildenbrand, Michael Mueller, Marc Hartmayer,
Christian Borntraeger
Sorry, I should have mentioned this for v1 already, but better late than
never: We need to replace this patch with a proper header update later (via
the scripts/update-linux-headers.sh script) - so in case you respin, please
mark it with NOTFORMERGE or PLACEHOLDER or something similar in the subject,
and mention the kernel version in the description that will likely contain
the update.
Thanks,
Thomas
On 10/08/2023 14.47, Steffen Eiden wrote:
> Signed-off-by: Steffen Eiden <seiden@linux.ibm.com>
> ---
> linux-headers/asm-s390/kvm.h | 16 ++++++++++++++++
> 1 file changed, 16 insertions(+)
>
> diff --git a/linux-headers/asm-s390/kvm.h b/linux-headers/asm-s390/kvm.h
> index e2afd95420..023a2763a9 100644
> --- a/linux-headers/asm-s390/kvm.h
> +++ b/linux-headers/asm-s390/kvm.h
> @@ -159,6 +159,22 @@ struct kvm_s390_vm_cpu_subfunc {
> __u8 reserved[1728];
> };
>
> +#define KVM_S390_VM_CPU_PROCESSOR_UV_FEAT_GUEST 6
> +#define KVM_S390_VM_CPU_MACHINE_UV_FEAT_GUEST 7
> +
> +#define KVM_S390_VM_CPU_UV_FEAT_NR_BITS 64
> +struct kvm_s390_vm_cpu_uv_feat {
> + union {
> + struct {
> + __u64 : 4;
> + __u64 ap : 1; /* bit 4 */
> + __u64 ap_intr : 1; /* bit 5 */
> + __u64 : 58;
> + };
> + __u64 feat;
> + };
> +};
> +
> /* kvm attributes for crypto */
> #define KVM_S390_VM_CRYPTO_ENABLE_AES_KW 0
> #define KVM_S390_VM_CRYPTO_ENABLE_DEA_KW 1
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 3/3] target/s390x: AP-passthrough for PV guests
2023-08-10 12:47 ` [PATCH v2 3/3] target/s390x: AP-passthrough for PV guests Steffen Eiden
@ 2023-08-17 11:56 ` Janosch Frank
0 siblings, 0 replies; 7+ messages in thread
From: Janosch Frank @ 2023-08-17 11:56 UTC (permalink / raw)
To: Steffen Eiden, qemu-s390x, qemu-devel
Cc: Thomas Huth, David Hildenbrand, Michael Mueller, Marc Hartmayer,
Christian Borntraeger
On 8/10/23 14:47, 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>
> ---
> 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 | 73 +++++++++++++++++++++++++++++
> 5 files changed, 82 insertions(+)
>
> diff --git a/target/s390x/cpu_features.h b/target/s390x/cpu_features.h
> index 87463f064d..40928c60e9 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_CALL,
You've named them UV features in the KVM patches.
None of this is "call" related.
Also you made a point of having the word "guest" in the KVM features
> } 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..9a2c5a9dfc 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_CALL_AP, "appv", UV_CALL, 4, "AP instructions installed for secure guests")
> +DEF_FEAT(UV_CALL_AP_INTR, "appvi", UV_CALL, 5, "AP instructions interpretation for secure guests")
*INTERRUPTION* support
The AP instructions are nearly fully interpreted in secure guests for
security reasons. The only time we see an AP instruction is for defining
the notification byte for the interrupt support since we need to pin the
page on which the byte resides.
Have a look what the feature for STFLE 65 says and either keep the INTR
or use the suffix that's defined there
> diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
> index 42b52afdb4..a7900a8a5c 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_CALL_AP, S390_FEAT_AP },
> + { S390_FEAT_UV_CALL_AP_INTR, S390_FEAT_UV_CALL_AP },
> };
> int i;
>
> diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c
> index 1e3b7c0dc9..6ae10a2cd8 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_CALL_AP,
> + S390_FEAT_UV_CALL_AP_INTR,
> };
>
>
> diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c
> index a7e2cdf668..500b9d894d 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;
> +
> + if (!uv_feat_supported()) {
> + return 0;
> + }
> +
> + rc = kvm_vm_ioctl(kvm_state, KVM_GET_DEVICE_ATTR, &attr);
> + if (rc) {
> + return rc;
> + }
> +
> + if (ap_available()) {
Can this be made into an early return?
> + if (prop.ap) {
> + set_bit(S390_FEAT_UV_CALL_AP, features);
> + }
> + if (prop.ap_intr) {
> + set_bit(S390_FEAT_UV_CALL_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,41 @@ 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,
> + bool interpret)
> +{
> +
> + 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,
> + };
> +
> + if (!uv_feat_supported()) {
> + return 0;
> + }
> +
> + if (ap_enabled(features)) {
Same early return check please
> + if (test_bit(S390_FEAT_UV_CALL_AP, features)) {
> + uv_feat.ap = 1;
> + }
> + if (test_bit(S390_FEAT_UV_CALL_AP_INTR, features) && interpret) {
> + 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 +2635,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, true);
> + if (rc) {
> + error_setg(errp, "KVM: Error configuring CPU UV features %d", rc);
> + return;
> + }
> }
>
> void kvm_s390_restart_interrupt(S390CPU *cpu)
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 2/3] target/s390x/kvm: Refactor AP functionalities
2023-08-10 12:47 ` [PATCH v2 2/3] target/s390x/kvm: Refactor AP functionalities Steffen Eiden
@ 2023-08-17 12:43 ` Michael Mueller
0 siblings, 0 replies; 7+ messages in thread
From: Michael Mueller @ 2023-08-17 12:43 UTC (permalink / raw)
To: Steffen Eiden, qemu-s390x, qemu-devel
Cc: Janosch Frank, Thomas Huth, David Hildenbrand, Michael Mueller,
Marc Hartmayer, Christian Borntraeger
On 10.08.23 14:47, Steffen Eiden wrote:
> kvm_s390_set_attr() is a misleading name as it only sets attributes for
> the KVM_S390_VM_CRYPTO group. Therefore, rename it to
> kvm_s390_set_crypto_attr().
>
> Add new functions ap_available() and ap_enabled() to avoid code
> duplication later.
>
> Signed-off-by: Steffen Eiden <seiden@linux.ibm.com>
Reviewed-by: Michael Mueller <mimu@linux.ibm.com>
> ---
> target/s390x/kvm/kvm.c | 24 +++++++++++++++++-------
> 1 file changed, 17 insertions(+), 7 deletions(-)
>
> diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c
> index a9e5880349..a7e2cdf668 100644
> --- a/target/s390x/kvm/kvm.c
> +++ b/target/s390x/kvm/kvm.c
> @@ -250,7 +250,7 @@ static void kvm_s390_enable_cmma(void)
> trace_kvm_enable_cmma(rc);
> }
>
> -static void kvm_s390_set_attr(uint64_t attr)
> +static void kvm_s390_set_crypto_attr(uint64_t attr)
> {
> struct kvm_device_attr attribute = {
> .group = KVM_S390_VM_CRYPTO,
> @@ -275,7 +275,7 @@ static void kvm_s390_init_aes_kw(void)
> }
>
> if (kvm_vm_check_attr(kvm_state, KVM_S390_VM_CRYPTO, attr)) {
> - kvm_s390_set_attr(attr);
> + kvm_s390_set_crypto_attr(attr);
> }
> }
>
> @@ -289,7 +289,7 @@ static void kvm_s390_init_dea_kw(void)
> }
>
> if (kvm_vm_check_attr(kvm_state, KVM_S390_VM_CRYPTO, attr)) {
> - kvm_s390_set_attr(attr);
> + kvm_s390_set_crypto_attr(attr);
> }
> }
>
> @@ -2296,6 +2296,17 @@ static int configure_cpu_subfunc(const S390FeatBitmap features)
> return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
> }
>
> +static bool ap_available(void)
> +{
> + return kvm_vm_check_attr(kvm_state, KVM_S390_VM_CRYPTO,
> + KVM_S390_VM_CRYPTO_ENABLE_APIE);
> +}
> +
> +static bool ap_enabled(const S390FeatBitmap features)
> +{
> + return test_bit(S390_FEAT_AP, features);
> +}
> +
> 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 },
> @@ -2475,8 +2486,7 @@ void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp)
> return;
> }
> /* for now, we can only provide the AP feature with HW support */
> - if (kvm_vm_check_attr(kvm_state, KVM_S390_VM_CRYPTO,
> - KVM_S390_VM_CRYPTO_ENABLE_APIE)) {
> + if (ap_available()) {
> set_bit(S390_FEAT_AP, model->features);
> }
>
> @@ -2502,7 +2512,7 @@ static void kvm_s390_configure_apie(bool interpret)
> KVM_S390_VM_CRYPTO_DISABLE_APIE;
>
> if (kvm_vm_check_attr(kvm_state, KVM_S390_VM_CRYPTO, attr)) {
> - kvm_s390_set_attr(attr);
> + kvm_s390_set_crypto_attr(attr);
> }
> }
>
> @@ -2556,7 +2566,7 @@ void kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp)
> kvm_s390_enable_cmma();
> }
>
> - if (test_bit(S390_FEAT_AP, model->features)) {
> + if (ap_enabled(model->features)) {
> kvm_s390_configure_apie(true);
> }
> }
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2023-08-17 12:44 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-08-10 12:47 [PATCH v2 0/3] KVM: s390: Enable AP instructions for pv-guests Steffen Eiden
2023-08-10 12:47 ` [PATCH v2 1/3] linux-headers: update asm-s390/kvm.h Steffen Eiden
2023-08-14 14:25 ` Thomas Huth
2023-08-10 12:47 ` [PATCH v2 2/3] target/s390x/kvm: Refactor AP functionalities Steffen Eiden
2023-08-17 12:43 ` Michael Mueller
2023-08-10 12:47 ` [PATCH v2 3/3] target/s390x: AP-passthrough for PV guests Steffen Eiden
2023-08-17 11:56 ` Janosch Frank
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).