OSDN Git Service

KVM: s390: protvirt: Instruction emulation
authorJanosch Frank <frankja@linux.ibm.com>
Tue, 22 Oct 2019 08:42:52 +0000 (04:42 -0400)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Thu, 27 Feb 2020 18:47:11 +0000 (19:47 +0100)
We have two new SIE exit codes dealing with instructions.
104 (0x68) for a secure instruction interception, on which the SIE needs
hypervisor action to complete the instruction. We can piggy-back on the
existing instruction handlers.

108 which is merely a notification and provides data for tracking and
management. For example this is used to tell the host about a new value
for the prefix register. As there will be several special case handlers
in later patches, we handle this in a separate function.

Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
[borntraeger@de.ibm.com: patch merging, splitting, fixing]
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
arch/s390/include/asm/kvm_host.h
arch/s390/kvm/intercept.c

index fdc6cef..c6694f4 100644 (file)
@@ -217,6 +217,8 @@ struct kvm_s390_sie_block {
 #define ICPT_KSS       0x5c
 #define ICPT_MCHKREQ   0x60
 #define ICPT_INT_ENABLE        0x64
+#define ICPT_PV_INSTR  0x68
+#define ICPT_PV_NOTIFY 0x6c
        __u8    icptcode;               /* 0x0050 */
        __u8    icptstatus;             /* 0x0051 */
        __u16   ihcpu;                  /* 0x0052 */
index 9090f29..9966c43 100644 (file)
@@ -444,6 +444,11 @@ static int handle_operexc(struct kvm_vcpu *vcpu)
        return kvm_s390_inject_program_int(vcpu, PGM_OPERATION);
 }
 
+static int handle_pv_notification(struct kvm_vcpu *vcpu)
+{
+       return handle_instruction(vcpu);
+}
+
 int kvm_handle_sie_intercept(struct kvm_vcpu *vcpu)
 {
        int rc, per_rc = 0;
@@ -489,6 +494,12 @@ int kvm_handle_sie_intercept(struct kvm_vcpu *vcpu)
                 */
                rc = 0;
                break;
+       case ICPT_PV_INSTR:
+               rc = handle_instruction(vcpu);
+               break;
+       case ICPT_PV_NOTIFY:
+               rc = handle_pv_notification(vcpu);
+               break;
        default:
                return -EOPNOTSUPP;
        }