[SRU][R][PATCH 2/5] KVM: s390: vsie: Allow non-zarch guests
Massimiliano Pellizzer
massimiliano.pellizzer at canonical.com
Wed May 27 22:48:08 UTC 2026
From: Eric Farman <farman at linux.ibm.com>
BugLink: https://bugs.launchpad.net/bugs/2153159
Linux/KVM runs in z/Architecture-only mode. Although z/Architecture
is built upon a long history of hardware refinements, any other
CPU mode is not permitted.
Allow a userspace to explicitly enable the use of ESA mode for
nested guests, otherwise usage will be rejected.
Reviewed-by: Janosch Frank <frankja at linux.ibm.com>
Signed-off-by: Eric Farman <farman at linux.ibm.com>
Reviewed-by: Hendrik Brueckner <brueckner at linux.ibm.com>
Reviewed-by: Christian Borntraeger <borntraeger at linux.ibm.com>
Signed-off-by: Janosch Frank <frankja at linux.ibm.com>
(cherry picked from commit b0ad874d9852967dafdb94b1632e0732e01e6cd8)
Signed-off-by: Massimiliano Pellizzer <massimiliano.pellizzer at canonical.com>
---
arch/s390/include/asm/kvm_host.h | 1 +
arch/s390/kvm/vsie.c | 8 +++++---
2 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h
index 3039c88daa63..8a4f4a39f7a2 100644
--- a/arch/s390/include/asm/kvm_host.h
+++ b/arch/s390/include/asm/kvm_host.h
@@ -656,6 +656,7 @@ struct kvm_arch {
int user_stsi;
int user_instr0;
int user_operexec;
+ int allow_vsie_esamode;
struct s390_io_adapter *adapters[MAX_S390_IO_ADAPTERS];
wait_queue_head_t ipte_wq;
int ipte_lock_count;
diff --git a/arch/s390/kvm/vsie.c b/arch/s390/kvm/vsie.c
index 72895dddc39a..eee1b72e14df 100644
--- a/arch/s390/kvm/vsie.c
+++ b/arch/s390/kvm/vsie.c
@@ -125,8 +125,8 @@ static int prepare_cpuflags(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
struct kvm_s390_sie_block *scb_o = vsie_page->scb_o;
int newflags, cpuflags = atomic_read(&scb_o->cpuflags);
- /* we don't allow ESA/390 guests */
- if (!(cpuflags & CPUSTAT_ZARCH))
+ /* we don't allow ESA/390 guests unless explicitly enabled */
+ if (!(cpuflags & CPUSTAT_ZARCH) && !vcpu->kvm->arch.allow_vsie_esamode)
return set_validity_icpt(scb_s, 0x0001U);
if (cpuflags & (CPUSTAT_RRF | CPUSTAT_MCDS))
@@ -135,7 +135,9 @@ static int prepare_cpuflags(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
return set_validity_icpt(scb_s, 0x0007U);
/* intervention requests will be set later */
- newflags = CPUSTAT_ZARCH;
+ newflags = 0;
+ if (cpuflags & CPUSTAT_ZARCH)
+ newflags = CPUSTAT_ZARCH;
if (cpuflags & CPUSTAT_GED && test_kvm_facility(vcpu->kvm, 8))
newflags |= CPUSTAT_GED;
if (cpuflags & CPUSTAT_GED2 && test_kvm_facility(vcpu->kvm, 78)) {
--
2.53.0
More information about the kernel-team
mailing list