aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kvm
diff options
context:
space:
mode:
authorDavid Hildenbrand <dahi@linux.vnet.ibm.com>2016-05-10 03:43:11 -0400
committerChristian Borntraeger <borntraeger@de.ibm.com>2016-06-10 06:07:30 -0400
commit1824c723ac90f9870ebafae4b3b3e5f4b82ffeef (patch)
tree3168e13812bb9110be073849089f8936df750cd1 /arch/s390/kvm
parent2c26d1d23abd9a67d056c95a0823132a71edc477 (diff)
KVM: s390: pfmf: support conditional-sske facility
We already indicate that facility but don't implement it in our pfmf interception handler. Let's add a new storage key handling function for conditionally setting the guest storage key. As we will reuse this function later on, let's directly implement returning the old key via parameter and indicating if any change happened via rc. Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Diffstat (limited to 'arch/s390/kvm')
-rw-r--r--arch/s390/kvm/priv.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c
index 71fa603034d0..752a1ac1aab6 100644
--- a/arch/s390/kvm/priv.c
+++ b/arch/s390/kvm/priv.c
@@ -654,8 +654,10 @@ static int handle_epsw(struct kvm_vcpu *vcpu)
654 654
655static int handle_pfmf(struct kvm_vcpu *vcpu) 655static int handle_pfmf(struct kvm_vcpu *vcpu)
656{ 656{
657 bool mr = false, mc = false, nq;
657 int reg1, reg2; 658 int reg1, reg2;
658 unsigned long start, end; 659 unsigned long start, end;
660 unsigned char key;
659 661
660 vcpu->stat.instruction_pfmf++; 662 vcpu->stat.instruction_pfmf++;
661 663
@@ -675,6 +677,15 @@ static int handle_pfmf(struct kvm_vcpu *vcpu)
675 !test_kvm_facility(vcpu->kvm, 14)) 677 !test_kvm_facility(vcpu->kvm, 14))
676 return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION); 678 return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
677 679
680 /* Only provide conditional-SSKE support if enabled for the guest */
681 if (vcpu->run->s.regs.gprs[reg1] & PFMF_SK &&
682 test_kvm_facility(vcpu->kvm, 10)) {
683 mr = vcpu->run->s.regs.gprs[reg1] & PFMF_MR;
684 mc = vcpu->run->s.regs.gprs[reg1] & PFMF_MC;
685 }
686
687 nq = vcpu->run->s.regs.gprs[reg1] & PFMF_NQ;
688 key = vcpu->run->s.regs.gprs[reg1] & PFMF_KEY;
678 start = vcpu->run->s.regs.gprs[reg2] & PAGE_MASK; 689 start = vcpu->run->s.regs.gprs[reg2] & PAGE_MASK;
679 start = kvm_s390_logical_to_effective(vcpu, start); 690 start = kvm_s390_logical_to_effective(vcpu, start);
680 691
@@ -723,11 +734,10 @@ static int handle_pfmf(struct kvm_vcpu *vcpu)
723 if (rc) 734 if (rc)
724 return rc; 735 return rc;
725 down_read(&current->mm->mmap_sem); 736 down_read(&current->mm->mmap_sem);
726 rc = set_guest_storage_key(current->mm, useraddr, 737 rc = cond_set_guest_storage_key(current->mm, useraddr,
727 vcpu->run->s.regs.gprs[reg1] & PFMF_KEY, 738 key, NULL, nq, mr, mc);
728 vcpu->run->s.regs.gprs[reg1] & PFMF_NQ);
729 up_read(&current->mm->mmap_sem); 739 up_read(&current->mm->mmap_sem);
730 if (rc) 740 if (rc < 0)
731 return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING); 741 return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
732 } 742 }
733 743