kvm-s390.c (ef11c9463ae006302ce170a401854a48ea0532ca) kvm-s390.c (0e1234c02b77ef22d9cf78f86b98347ceb170090)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * hosting IBM Z kernel virtual machines (s390x)
4 *
5 * Copyright IBM Corp. 2008, 2020
6 *
7 * Author(s): Carsten Otte <cotte@de.ibm.com>
8 * Christian Borntraeger <borntraeger@de.ibm.com>

--- 4727 unchanged lines hidden (view full) ---

4736 break;
4737 default:
4738 r = -EINVAL;
4739 break;
4740 }
4741 return r;
4742}
4743
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * hosting IBM Z kernel virtual machines (s390x)
4 *
5 * Copyright IBM Corp. 2008, 2020
6 *
7 * Author(s): Carsten Otte <cotte@de.ibm.com>
8 * Christian Borntraeger <borntraeger@de.ibm.com>

--- 4727 unchanged lines hidden (view full) ---

4736 break;
4737 default:
4738 r = -EINVAL;
4739 break;
4740 }
4741 return r;
4742}
4743
4744static long kvm_s390_guest_sida_op(struct kvm_vcpu *vcpu,
4745 struct kvm_s390_mem_op *mop)
4744static long kvm_s390_vcpu_sida_op(struct kvm_vcpu *vcpu,
4745 struct kvm_s390_mem_op *mop)
4746{
4747 void __user *uaddr = (void __user *)mop->buf;
4748 int r = 0;
4749
4750 if (mop->flags || !mop->size)
4751 return -EINVAL;
4752 if (mop->size + mop->sida_offset < mop->size)
4753 return -EINVAL;

--- 12 unchanged lines hidden (view full) ---

4766 case KVM_S390_MEMOP_SIDA_WRITE:
4767 if (copy_from_user((void *)(sida_origin(vcpu->arch.sie_block) +
4768 mop->sida_offset), uaddr, mop->size))
4769 r = -EFAULT;
4770 break;
4771 }
4772 return r;
4773}
4746{
4747 void __user *uaddr = (void __user *)mop->buf;
4748 int r = 0;
4749
4750 if (mop->flags || !mop->size)
4751 return -EINVAL;
4752 if (mop->size + mop->sida_offset < mop->size)
4753 return -EINVAL;

--- 12 unchanged lines hidden (view full) ---

4766 case KVM_S390_MEMOP_SIDA_WRITE:
4767 if (copy_from_user((void *)(sida_origin(vcpu->arch.sie_block) +
4768 mop->sida_offset), uaddr, mop->size))
4769 r = -EFAULT;
4770 break;
4771 }
4772 return r;
4773}
4774static long kvm_s390_guest_mem_op(struct kvm_vcpu *vcpu,
4775 struct kvm_s390_mem_op *mop)
4774
4775static long kvm_s390_vcpu_mem_op(struct kvm_vcpu *vcpu,
4776 struct kvm_s390_mem_op *mop)
4776{
4777 void __user *uaddr = (void __user *)mop->buf;
4778 void *tmpbuf = NULL;
4779 int r = 0;
4780 const u64 supported_flags = KVM_S390_MEMOP_F_INJECT_EXCEPTION
4781 | KVM_S390_MEMOP_F_CHECK_ONLY
4782 | KVM_S390_MEMOP_F_SKEY_PROTECTION;
4783

--- 46 unchanged lines hidden (view full) ---

4830
4831 if (r > 0 && (mop->flags & KVM_S390_MEMOP_F_INJECT_EXCEPTION) != 0)
4832 kvm_s390_inject_prog_irq(vcpu, &vcpu->arch.pgm);
4833
4834 vfree(tmpbuf);
4835 return r;
4836}
4837
4777{
4778 void __user *uaddr = (void __user *)mop->buf;
4779 void *tmpbuf = NULL;
4780 int r = 0;
4781 const u64 supported_flags = KVM_S390_MEMOP_F_INJECT_EXCEPTION
4782 | KVM_S390_MEMOP_F_CHECK_ONLY
4783 | KVM_S390_MEMOP_F_SKEY_PROTECTION;
4784

--- 46 unchanged lines hidden (view full) ---

4831
4832 if (r > 0 && (mop->flags & KVM_S390_MEMOP_F_INJECT_EXCEPTION) != 0)
4833 kvm_s390_inject_prog_irq(vcpu, &vcpu->arch.pgm);
4834
4835 vfree(tmpbuf);
4836 return r;
4837}
4838
4838static long kvm_s390_guest_memsida_op(struct kvm_vcpu *vcpu,
4839 struct kvm_s390_mem_op *mop)
4839static long kvm_s390_vcpu_memsida_op(struct kvm_vcpu *vcpu,
4840 struct kvm_s390_mem_op *mop)
4840{
4841 int r, srcu_idx;
4842
4843 srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
4844
4845 switch (mop->op) {
4846 case KVM_S390_MEMOP_LOGICAL_READ:
4847 case KVM_S390_MEMOP_LOGICAL_WRITE:
4841{
4842 int r, srcu_idx;
4843
4844 srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
4845
4846 switch (mop->op) {
4847 case KVM_S390_MEMOP_LOGICAL_READ:
4848 case KVM_S390_MEMOP_LOGICAL_WRITE:
4848 r = kvm_s390_guest_mem_op(vcpu, mop);
4849 r = kvm_s390_vcpu_mem_op(vcpu, mop);
4849 break;
4850 case KVM_S390_MEMOP_SIDA_READ:
4851 case KVM_S390_MEMOP_SIDA_WRITE:
4852 /* we are locked against sida going away by the vcpu->mutex */
4850 break;
4851 case KVM_S390_MEMOP_SIDA_READ:
4852 case KVM_S390_MEMOP_SIDA_WRITE:
4853 /* we are locked against sida going away by the vcpu->mutex */
4853 r = kvm_s390_guest_sida_op(vcpu, mop);
4854 r = kvm_s390_vcpu_sida_op(vcpu, mop);
4854 break;
4855 default:
4856 r = -EINVAL;
4857 }
4858
4859 srcu_read_unlock(&vcpu->kvm->srcu, srcu_idx);
4860 return r;
4861}

--- 146 unchanged lines hidden (view full) ---

5008 break;
5009 r = kvm_vcpu_ioctl_enable_cap(vcpu, &cap);
5010 break;
5011 }
5012 case KVM_S390_MEM_OP: {
5013 struct kvm_s390_mem_op mem_op;
5014
5015 if (copy_from_user(&mem_op, argp, sizeof(mem_op)) == 0)
4855 break;
4856 default:
4857 r = -EINVAL;
4858 }
4859
4860 srcu_read_unlock(&vcpu->kvm->srcu, srcu_idx);
4861 return r;
4862}

--- 146 unchanged lines hidden (view full) ---

5009 break;
5010 r = kvm_vcpu_ioctl_enable_cap(vcpu, &cap);
5011 break;
5012 }
5013 case KVM_S390_MEM_OP: {
5014 struct kvm_s390_mem_op mem_op;
5015
5016 if (copy_from_user(&mem_op, argp, sizeof(mem_op)) == 0)
5016 r = kvm_s390_guest_memsida_op(vcpu, &mem_op);
5017 r = kvm_s390_vcpu_memsida_op(vcpu, &mem_op);
5017 else
5018 r = -EFAULT;
5019 break;
5020 }
5021 case KVM_S390_SET_IRQ_STATE: {
5022 struct kvm_s390_irq_state irq_state;
5023
5024 r = -EFAULT;

--- 161 unchanged lines hidden ---
5018 else
5019 r = -EFAULT;
5020 break;
5021 }
5022 case KVM_S390_SET_IRQ_STATE: {
5023 struct kvm_s390_irq_state irq_state;
5024
5025 r = -EFAULT;

--- 161 unchanged lines hidden ---