]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
KVM: s390: protvirt: handle secure guest prefix pages
authorJanosch Frank <frankja@linux.ibm.com>
Tue, 17 Sep 2019 12:53:53 +0000 (14:53 +0200)
committerSeth Forshee <seth.forshee@canonical.com>
Fri, 20 Mar 2020 19:32:54 +0000 (14:32 -0500)
BugLink: https://bugs.launchpad.net/bugs/1835531
The SPX instruction is handled by the ultravisor. We do get a
notification intercept, though. Let us update our internal view.

In addition to that, when the guest prefix page is not secure, an
intercept 112 (0x70) is indicated. Let us make the prefix pages
secure again.

Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
[borntraeger@de.ibm.com: patch merging, splitting, fixing]
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
(cherry picked from commit d274995ec273b82dbbccc5521ab2132217f64952 linux-next)
Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
arch/s390/include/asm/kvm_host.h
arch/s390/kvm/intercept.c

index e4429ffec6b17a6b50deda5f66b52ace4e893754..017654bdfec4dd3ac39ffbd8675546a84ce38835 100644 (file)
@@ -225,6 +225,7 @@ struct kvm_s390_sie_block {
 #define ICPT_INT_ENABLE        0x64
 #define ICPT_PV_INSTR  0x68
 #define ICPT_PV_NOTIFY 0x6c
+#define ICPT_PV_PREF   0x70
        __u8    icptcode;               /* 0x0050 */
        __u8    icptstatus;             /* 0x0051 */
        __u16   ihcpu;                  /* 0x0052 */
index 331e620dcfdfb1437e80f2a690025a13e8216bf0..b6b7d4b0e26c0b29437b1d554ad8d1f2744bbf9a 100644 (file)
@@ -451,6 +451,15 @@ static int handle_operexc(struct kvm_vcpu *vcpu)
        return kvm_s390_inject_program_int(vcpu, PGM_OPERATION);
 }
 
+static int handle_pv_spx(struct kvm_vcpu *vcpu)
+{
+       u32 pref = *(u32 *)vcpu->arch.sie_block->sidad;
+
+       kvm_s390_set_prefix(vcpu, pref);
+       trace_kvm_s390_handle_prefix(vcpu, 1, pref);
+       return 0;
+}
+
 static int handle_pv_sclp(struct kvm_vcpu *vcpu)
 {
        struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int;
@@ -477,6 +486,8 @@ static int handle_pv_sclp(struct kvm_vcpu *vcpu)
 
 static int handle_pv_notification(struct kvm_vcpu *vcpu)
 {
+       if (vcpu->arch.sie_block->ipa == 0xb210)
+               return handle_pv_spx(vcpu);
        if (vcpu->arch.sie_block->ipa == 0xb220)
                return handle_pv_sclp(vcpu);
 
@@ -534,6 +545,13 @@ int kvm_handle_sie_intercept(struct kvm_vcpu *vcpu)
        case ICPT_PV_NOTIFY:
                rc = handle_pv_notification(vcpu);
                break;
+       case ICPT_PV_PREF:
+               rc = 0;
+               gmap_convert_to_secure(vcpu->arch.gmap,
+                                      kvm_s390_get_prefix(vcpu));
+               gmap_convert_to_secure(vcpu->arch.gmap,
+                                      kvm_s390_get_prefix(vcpu) + PAGE_SIZE);
+               break;
        default:
                return -EOPNOTSUPP;
        }