KVM: s390: sort out physical vs virtual pointers usage
authorNico Boehr <nrb@linux.ibm.com>
Thu, 20 Oct 2022 14:31:57 +0000 (16:31 +0200)
committerJanosch Frank <frankja@linux.ibm.com>
Wed, 26 Oct 2022 12:27:41 +0000 (14:27 +0200)
Fix virtual vs physical address confusion (which currently are the same).

Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Link: https://lore.kernel.org/r/20221020143159.294605-4-nrb@linux.ibm.com
Message-Id: <20221020143159.294605-4-nrb@linux.ibm.com>
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
arch/s390/include/asm/kvm_host.h
arch/s390/kvm/intercept.c
arch/s390/kvm/kvm-s390.c
arch/s390/kvm/kvm-s390.h

index 9a31d00..931f978 100644 (file)
@@ -276,6 +276,7 @@ struct kvm_s390_sie_block {
 #define ECB3_AES 0x04
 #define ECB3_RI  0x01
        __u8    ecb3;                   /* 0x0063 */
+#define ESCA_SCAOL_MASK ~0x3fU
        __u32   scaol;                  /* 0x0064 */
        __u8    sdf;                    /* 0x0068 */
        __u8    epdx;                   /* 0x0069 */
index 8811206..b703b52 100644 (file)
@@ -217,7 +217,7 @@ static int handle_itdb(struct kvm_vcpu *vcpu)
                return 0;
        if (current->thread.per_flags & PER_FLAG_NO_TE)
                return 0;
-       itdb = (struct kvm_s390_itdb *)vcpu->arch.sie_block->itdba;
+       itdb = phys_to_virt(vcpu->arch.sie_block->itdba);
        rc = write_guest_lc(vcpu, __LC_PGM_TDB, itdb, sizeof(*itdb));
        if (rc)
                return rc;
index 45d4b81..0f7ff0c 100644 (file)
@@ -3329,28 +3329,30 @@ static void sca_del_vcpu(struct kvm_vcpu *vcpu)
 static void sca_add_vcpu(struct kvm_vcpu *vcpu)
 {
        if (!kvm_s390_use_sca_entries()) {
-               struct bsca_block *sca = vcpu->kvm->arch.sca;
+               phys_addr_t sca_phys = virt_to_phys(vcpu->kvm->arch.sca);
 
                /* we still need the basic sca for the ipte control */
-               vcpu->arch.sie_block->scaoh = (__u32)(((__u64)sca) >> 32);
-               vcpu->arch.sie_block->scaol = (__u32)(__u64)sca;
+               vcpu->arch.sie_block->scaoh = sca_phys >> 32;
+               vcpu->arch.sie_block->scaol = sca_phys;
                return;
        }
        read_lock(&vcpu->kvm->arch.sca_lock);
        if (vcpu->kvm->arch.use_esca) {
                struct esca_block *sca = vcpu->kvm->arch.sca;
+               phys_addr_t sca_phys = virt_to_phys(sca);
 
-               sca->cpu[vcpu->vcpu_id].sda = (__u64) vcpu->arch.sie_block;
-               vcpu->arch.sie_block->scaoh = (__u32)(((__u64)sca) >> 32);
-               vcpu->arch.sie_block->scaol = (__u32)(__u64)sca & ~0x3fU;
+               sca->cpu[vcpu->vcpu_id].sda = virt_to_phys(vcpu->arch.sie_block);
+               vcpu->arch.sie_block->scaoh = sca_phys >> 32;
+               vcpu->arch.sie_block->scaol = sca_phys & ESCA_SCAOL_MASK;
                vcpu->arch.sie_block->ecb2 |= ECB2_ESCA;
                set_bit_inv(vcpu->vcpu_id, (unsigned long *) sca->mcn);
        } else {
                struct bsca_block *sca = vcpu->kvm->arch.sca;
+               phys_addr_t sca_phys = virt_to_phys(sca);
 
-               sca->cpu[vcpu->vcpu_id].sda = (__u64) vcpu->arch.sie_block;
-               vcpu->arch.sie_block->scaoh = (__u32)(((__u64)sca) >> 32);
-               vcpu->arch.sie_block->scaol = (__u32)(__u64)sca;
+               sca->cpu[vcpu->vcpu_id].sda = virt_to_phys(vcpu->arch.sie_block);
+               vcpu->arch.sie_block->scaoh = sca_phys >> 32;
+               vcpu->arch.sie_block->scaol = sca_phys;
                set_bit_inv(vcpu->vcpu_id, (unsigned long *) &sca->mcn);
        }
        read_unlock(&vcpu->kvm->arch.sca_lock);
@@ -3381,6 +3383,7 @@ static int sca_switch_to_extended(struct kvm *kvm)
        struct kvm_vcpu *vcpu;
        unsigned long vcpu_idx;
        u32 scaol, scaoh;
+       phys_addr_t new_sca_phys;
 
        if (kvm->arch.use_esca)
                return 0;
@@ -3389,8 +3392,9 @@ static int sca_switch_to_extended(struct kvm *kvm)
        if (!new_sca)
                return -ENOMEM;
 
-       scaoh = (u32)((u64)(new_sca) >> 32);
-       scaol = (u32)(u64)(new_sca) & ~0x3fU;
+       new_sca_phys = virt_to_phys(new_sca);
+       scaoh = new_sca_phys >> 32;
+       scaol = new_sca_phys & ESCA_SCAOL_MASK;
 
        kvm_s390_vcpu_block_all(kvm);
        write_lock(&kvm->arch.sca_lock);
@@ -3610,15 +3614,18 @@ static void kvm_s390_vcpu_crypto_setup(struct kvm_vcpu *vcpu)
 
 void kvm_s390_vcpu_unsetup_cmma(struct kvm_vcpu *vcpu)
 {
-       free_page(vcpu->arch.sie_block->cbrlo);
+       free_page((unsigned long)phys_to_virt(vcpu->arch.sie_block->cbrlo));
        vcpu->arch.sie_block->cbrlo = 0;
 }
 
 int kvm_s390_vcpu_setup_cmma(struct kvm_vcpu *vcpu)
 {
-       vcpu->arch.sie_block->cbrlo = get_zeroed_page(GFP_KERNEL_ACCOUNT);
-       if (!vcpu->arch.sie_block->cbrlo)
+       void *cbrlo_page = (void *)get_zeroed_page(GFP_KERNEL_ACCOUNT);
+
+       if (!cbrlo_page)
                return -ENOMEM;
+
+       vcpu->arch.sie_block->cbrlo = virt_to_phys(cbrlo_page);
        return 0;
 }
 
@@ -3628,7 +3635,7 @@ static void kvm_s390_vcpu_setup_model(struct kvm_vcpu *vcpu)
 
        vcpu->arch.sie_block->ibc = model->ibc;
        if (test_kvm_facility(vcpu->kvm, 7))
-               vcpu->arch.sie_block->fac = (u32)(u64) model->fac_list;
+               vcpu->arch.sie_block->fac = virt_to_phys(model->fac_list);
 }
 
 static int kvm_s390_vcpu_setup(struct kvm_vcpu *vcpu)
@@ -3685,9 +3692,8 @@ static int kvm_s390_vcpu_setup(struct kvm_vcpu *vcpu)
                VCPU_EVENT(vcpu, 3, "AIV gisa format-%u enabled for cpu %03u",
                           vcpu->arch.sie_block->gd & 0x3, vcpu->vcpu_id);
        }
-       vcpu->arch.sie_block->sdnxo = ((unsigned long) &vcpu->run->s.regs.sdnx)
-                                       | SDNXC;
-       vcpu->arch.sie_block->riccbd = (unsigned long) &vcpu->run->s.regs.riccb;
+       vcpu->arch.sie_block->sdnxo = virt_to_phys(&vcpu->run->s.regs.sdnx) | SDNXC;
+       vcpu->arch.sie_block->riccbd = virt_to_phys(&vcpu->run->s.regs.riccb);
 
        if (sclp.has_kss)
                kvm_s390_set_cpuflags(vcpu, CPUSTAT_KSS);
@@ -3737,7 +3743,7 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu)
                return -ENOMEM;
 
        vcpu->arch.sie_block = &sie_page->sie_block;
-       vcpu->arch.sie_block->itdba = (unsigned long) &sie_page->itdb;
+       vcpu->arch.sie_block->itdba = virt_to_phys(&sie_page->itdb);
 
        /* the real guest size will always be smaller than msl */
        vcpu->arch.sie_block->mso = 0;
index f6fd668..a60d1e5 100644 (file)
@@ -23,7 +23,8 @@
 /* Transactional Memory Execution related macros */
 #define IS_TE_ENABLED(vcpu)    ((vcpu->arch.sie_block->ecb & ECB_TE))
 #define TDB_FORMAT1            1
-#define IS_ITDB_VALID(vcpu)    ((*(char *)vcpu->arch.sie_block->itdba == TDB_FORMAT1))
+#define IS_ITDB_VALID(vcpu) \
+       ((*(char *)phys_to_virt((vcpu)->arch.sie_block->itdba) == TDB_FORMAT1))
 
 extern debug_info_t *kvm_s390_dbf;
 extern debug_info_t *kvm_s390_dbf_uv;
@@ -233,7 +234,7 @@ static inline unsigned long kvm_s390_get_gfn_end(struct kvm_memslots *slots)
 
 static inline u32 kvm_s390_get_gisa_desc(struct kvm *kvm)
 {
-       u32 gd = (u32)(u64)kvm->arch.gisa_int.origin;
+       u32 gd = virt_to_phys(kvm->arch.gisa_int.origin);
 
        if (gd && sclp.has_gisaf)
                gd |= GISA_FORMAT1;