KVM: s390: sida: sort out physical vs virtual pointers usage
authorNico Boehr <nrb@linux.ibm.com>
Thu, 20 Oct 2022 14:31:58 +0000 (16:31 +0200)
committerJanosch Frank <frankja@linux.ibm.com>
Wed, 26 Oct 2022 12:27:41 +0000 (14:27 +0200)
All callers of the sida_origin() macro actually expected a virtual
address, so rename it to sida_addr() and hand out a virtual address.

At some places, the macro wasn't used, potentially creating problems
if the sida size ever becomes nonzero (not currently the case), so let's
start using it everywhere now while at it.

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-5-nrb@linux.ibm.com
Message-Id: <20221020143159.294605-5-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/priv.c
arch/s390/kvm/pv.c

index 931f978758997bada656c3394e5803eda7e4ea8d..21f1339a419741dfdcb3778ef468856725b87307 100644 (file)
@@ -142,8 +142,7 @@ struct mcck_volatile_info {
                           CR14_EXTERNAL_DAMAGE_SUBMASK)
 
 #define SIDAD_SIZE_MASK                0xff
-#define sida_origin(sie_block) \
-       ((sie_block)->sidad & PAGE_MASK)
+#define sida_addr(sie_block) phys_to_virt((sie_block)->sidad & PAGE_MASK)
 #define sida_size(sie_block) \
        ((((sie_block)->sidad & SIDAD_SIZE_MASK) + 1) * PAGE_SIZE)
 
index b703b5202f257be2e1242eab60674b7325d3ff07..0ee02dae14b2bdc1294d4685825f25f042715fac 100644 (file)
@@ -409,8 +409,7 @@ int handle_sthyi(struct kvm_vcpu *vcpu)
 out:
        if (!cc) {
                if (kvm_s390_pv_cpu_is_protected(vcpu)) {
-                       memcpy((void *)(sida_origin(vcpu->arch.sie_block)),
-                              sctns, PAGE_SIZE);
+                       memcpy(sida_addr(vcpu->arch.sie_block), sctns, PAGE_SIZE);
                } else {
                        r = write_guest(vcpu, addr, reg2, sctns, PAGE_SIZE);
                        if (r) {
@@ -464,7 +463,7 @@ static int handle_operexc(struct kvm_vcpu *vcpu)
 
 static int handle_pv_spx(struct kvm_vcpu *vcpu)
 {
-       u32 pref = *(u32 *)vcpu->arch.sie_block->sidad;
+       u32 pref = *(u32 *)sida_addr(vcpu->arch.sie_block);
 
        kvm_s390_set_prefix(vcpu, pref);
        trace_kvm_s390_handle_prefix(vcpu, 1, pref);
@@ -497,7 +496,7 @@ static int handle_pv_sclp(struct kvm_vcpu *vcpu)
 
 static int handle_pv_uvc(struct kvm_vcpu *vcpu)
 {
-       struct uv_cb_share *guest_uvcb = (void *)vcpu->arch.sie_block->sidad;
+       struct uv_cb_share *guest_uvcb = sida_addr(vcpu->arch.sie_block);
        struct uv_cb_cts uvcb = {
                .header.cmd     = UVC_CMD_UNPIN_PAGE_SHARED,
                .header.len     = sizeof(uvcb),
index 0f7ff0c9019f808cd75f6d57c041585474e966f7..bd6e0201bfe5f975247eb3293341d07a4e0b1c0d 100644 (file)
@@ -5167,6 +5167,7 @@ static long kvm_s390_vcpu_sida_op(struct kvm_vcpu *vcpu,
                                  struct kvm_s390_mem_op *mop)
 {
        void __user *uaddr = (void __user *)mop->buf;
+       void *sida_addr;
        int r = 0;
 
        if (mop->flags || !mop->size)
@@ -5178,16 +5179,16 @@ static long kvm_s390_vcpu_sida_op(struct kvm_vcpu *vcpu,
        if (!kvm_s390_pv_cpu_is_protected(vcpu))
                return -EINVAL;
 
+       sida_addr = (char *)sida_addr(vcpu->arch.sie_block) + mop->sida_offset;
+
        switch (mop->op) {
        case KVM_S390_MEMOP_SIDA_READ:
-               if (copy_to_user(uaddr, (void *)(sida_origin(vcpu->arch.sie_block) +
-                                mop->sida_offset), mop->size))
+               if (copy_to_user(uaddr, sida_addr, mop->size))
                        r = -EFAULT;
 
                break;
        case KVM_S390_MEMOP_SIDA_WRITE:
-               if (copy_from_user((void *)(sida_origin(vcpu->arch.sie_block) +
-                                  mop->sida_offset), uaddr, mop->size))
+               if (copy_from_user(sida_addr, uaddr, mop->size))
                        r = -EFAULT;
                break;
        }
index 3335fa09b6f1d205a518beb3b84848225966b2e5..9f8a192bd750f9b4150779aabbaed2000c962cab 100644 (file)
@@ -924,8 +924,7 @@ static int handle_stsi(struct kvm_vcpu *vcpu)
                return -EREMOTE;
        }
        if (kvm_s390_pv_cpu_is_protected(vcpu)) {
-               memcpy((void *)sida_origin(vcpu->arch.sie_block), (void *)mem,
-                      PAGE_SIZE);
+               memcpy(sida_addr(vcpu->arch.sie_block), (void *)mem, PAGE_SIZE);
                rc = 0;
        } else {
                rc = write_guest(vcpu, operand2, ar, (void *)mem, PAGE_SIZE);
index 7cb7799a0acb4000157554df8beec25634c6084b..c7435c37cdfea169cc743c5fb3377b3a6e53e58c 100644 (file)
@@ -44,7 +44,7 @@ int kvm_s390_pv_destroy_cpu(struct kvm_vcpu *vcpu, u16 *rc, u16 *rrc)
                free_pages(vcpu->arch.pv.stor_base,
                           get_order(uv_info.guest_cpu_stor_len));
 
-       free_page(sida_origin(vcpu->arch.sie_block));
+       free_page((unsigned long)sida_addr(vcpu->arch.sie_block));
        vcpu->arch.sie_block->pv_handle_cpu = 0;
        vcpu->arch.sie_block->pv_handle_config = 0;
        memset(&vcpu->arch.pv, 0, sizeof(vcpu->arch.pv));
@@ -66,6 +66,7 @@ int kvm_s390_pv_create_cpu(struct kvm_vcpu *vcpu, u16 *rc, u16 *rrc)
                .header.cmd = UVC_CMD_CREATE_SEC_CPU,
                .header.len = sizeof(uvcb),
        };
+       void *sida_addr;
        int cc;
 
        if (kvm_s390_pv_cpu_get_handle(vcpu))
@@ -83,12 +84,13 @@ int kvm_s390_pv_create_cpu(struct kvm_vcpu *vcpu, u16 *rc, u16 *rrc)
        uvcb.stor_origin = (u64)vcpu->arch.pv.stor_base;
 
        /* Alloc Secure Instruction Data Area Designation */
-       vcpu->arch.sie_block->sidad = __get_free_page(GFP_KERNEL_ACCOUNT | __GFP_ZERO);
-       if (!vcpu->arch.sie_block->sidad) {
+       sida_addr = (void *)__get_free_page(GFP_KERNEL_ACCOUNT | __GFP_ZERO);
+       if (!sida_addr) {
                free_pages(vcpu->arch.pv.stor_base,
                           get_order(uv_info.guest_cpu_stor_len));
                return -ENOMEM;
        }
+       vcpu->arch.sie_block->sidad = virt_to_phys(sida_addr);
 
        cc = uv_call(0, (u64)&uvcb);
        *rc = uvcb.header.rc;