]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: s390: vsie: Accommodate ESA prefix pages
authorEric Farman <farman@linux.ibm.com>
Wed, 1 Apr 2026 15:12:20 +0000 (17:12 +0200)
committerJanosch Frank <frankja@linux.ibm.com>
Thu, 2 Apr 2026 13:37:01 +0000 (15:37 +0200)
The prefix page address occupies a different number
of bits for z/Architecture versus ESA mode. Adjust the
definition to cover both, and permit an ESA mode
address within the nested codepath.

Signed-off-by: Eric Farman <farman@linux.ibm.com>
Reviewed-by: Hendrik Brueckner <brueckner@linux.ibm.com>
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
arch/s390/include/asm/kvm_host_types.h
arch/s390/kvm/kvm-s390.h
arch/s390/kvm/vsie.c

index 1394d3fb648f1e46dba2c513ed26e5dfd275fad4..3f50942bdfe6c7f9bfd0a0442e18b61823ac90ed 100644 (file)
@@ -137,8 +137,7 @@ struct mcck_volatile_info {
 struct kvm_s390_sie_block {
        atomic_t cpuflags;              /* 0x0000 */
        __u32 : 1;                      /* 0x0004 */
-       __u32 prefix : 18;
-       __u32 : 1;
+       __u32 prefix : 19;
        __u32 ibc : 12;
        __u8    reserved08[4];          /* 0x0008 */
 #define PROG_IN_SIE (1<<0)
index bf1d7798c1afa17fd1046c8b02d00880f95074ef..dc0573b7aa4bf2dfc79e3f14b882a3f19cb72dfa 100644 (file)
@@ -122,7 +122,9 @@ static inline int kvm_is_ucontrol(struct kvm *kvm)
 #endif
 }
 
-#define GUEST_PREFIX_SHIFT 13
+#define GUEST_PREFIX_SHIFT 12
+#define GUEST_PREFIX_MASK_ZARCH 0x7fffe
+#define GUEST_PREFIX_MASK_ESA   0x7ffff
 static inline u32 kvm_s390_get_prefix(struct kvm_vcpu *vcpu)
 {
        return vcpu->arch.sie_block->prefix << GUEST_PREFIX_SHIFT;
@@ -133,6 +135,7 @@ static inline void kvm_s390_set_prefix(struct kvm_vcpu *vcpu, u32 prefix)
        VCPU_EVENT(vcpu, 3, "set prefix of cpu %03u to 0x%x", vcpu->vcpu_id,
                   prefix);
        vcpu->arch.sie_block->prefix = prefix >> GUEST_PREFIX_SHIFT;
+       vcpu->arch.sie_block->prefix &= GUEST_PREFIX_MASK_ZARCH;
        kvm_make_request(KVM_REQ_TLB_FLUSH, vcpu);
        kvm_make_request(KVM_REQ_REFRESH_GUEST_PREFIX, vcpu);
 }
index 2ce406861d225fe66cdb09f72adf4def9c9ccbaf..3f43fe05afd3fe981193a245a43ad88aee049d5f 100644 (file)
@@ -479,7 +479,7 @@ static int shadow_scb(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
        struct kvm_s390_sie_block *scb_s = &vsie_page->scb_s;
        /* READ_ONCE does not work on bitfields - use a temporary variable */
        const uint32_t __new_prefix = scb_o->prefix;
-       const uint32_t new_prefix = READ_ONCE(__new_prefix);
+       uint32_t new_prefix = READ_ONCE(__new_prefix);
        const bool wants_tx = READ_ONCE(scb_o->ecb) & ECB_TE;
        bool had_tx = scb_s->ecb & ECB_TE;
        unsigned long new_mso = 0;
@@ -527,6 +527,11 @@ static int shadow_scb(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
 
        scb_s->icpua = scb_o->icpua;
 
+       if (!(atomic_read(&scb_s->cpuflags) & CPUSTAT_ZARCH))
+               new_prefix &= GUEST_PREFIX_MASK_ESA;
+       else
+               new_prefix &= GUEST_PREFIX_MASK_ZARCH;
+
        if (!(atomic_read(&scb_s->cpuflags) & CPUSTAT_SM))
                new_mso = READ_ONCE(scb_o->mso) & 0xfffffffffff00000UL;
        /* if the hva of the prefix changes, we have to remap the prefix */