KVM: s390: hardware support for guest debugging
[firefly-linux-kernel-4.4.55.git] / arch / s390 / include / asm / kvm_host.h
index 154b60089be996de483f07844f9229c728918892..0d45f6fe734f0a085b227efe5bcc97928e6df8bd 100644 (file)
@@ -39,9 +39,17 @@ struct sca_entry {
        __u64   reserved2[2];
 } __attribute__((packed));
 
+union ipte_control {
+       unsigned long val;
+       struct {
+               unsigned long k  : 1;
+               unsigned long kh : 31;
+               unsigned long kg : 32;
+       };
+};
 
 struct sca_block {
-       __u64   ipte_control;
+       union ipte_control ipte_control;
        __u64   reserved[5];
        __u64   mcn;
        __u64   reserved2;
@@ -85,12 +93,26 @@ struct kvm_s390_sie_block {
        __u8    reserved40[4];          /* 0x0040 */
 #define LCTL_CR0       0x8000
 #define LCTL_CR6       0x0200
+#define LCTL_CR9       0x0040
+#define LCTL_CR10      0x0020
+#define LCTL_CR11      0x0010
 #define LCTL_CR14      0x0002
        __u16   lctl;                   /* 0x0044 */
        __s16   icpua;                  /* 0x0046 */
-#define ICTL_LPSW 0x00400000
+#define ICTL_PINT      0x20000000
+#define ICTL_LPSW      0x00400000
+#define ICTL_STCTL     0x00040000
+#define ICTL_ISKE      0x00004000
+#define ICTL_SSKE      0x00002000
+#define ICTL_RRBE      0x00001000
        __u32   ictl;                   /* 0x0048 */
        __u32   eca;                    /* 0x004c */
+#define ICPT_INST      0x04
+#define ICPT_PROGI     0x08
+#define ICPT_INSTPROGI 0x0C
+#define ICPT_OPEREXC   0x2C
+#define ICPT_PARTEXEC  0x38
+#define ICPT_IOINST    0x40
        __u8    icptcode;               /* 0x0050 */
        __u8    reserved51;             /* 0x0051 */
        __u16   ihcpu;                  /* 0x0052 */
@@ -109,9 +131,21 @@ struct kvm_s390_sie_block {
        psw_t   gpsw;                   /* 0x0090 */
        __u64   gg14;                   /* 0x00a0 */
        __u64   gg15;                   /* 0x00a8 */
-       __u8    reservedb0[30];         /* 0x00b0 */
-       __u16   iprcc;                  /* 0x00ce */
-       __u8    reservedd0[48];         /* 0x00d0 */
+       __u8    reservedb0[28];         /* 0x00b0 */
+       __u16   pgmilc;                 /* 0x00cc */
+       __u16   iprcc;                  /* 0x00ce */
+       __u32   dxc;                    /* 0x00d0 */
+       __u16   mcn;                    /* 0x00d4 */
+       __u8    perc;                   /* 0x00d6 */
+       __u8    peratmid;               /* 0x00d7 */
+       __u64   peraddr;                /* 0x00d8 */
+       __u8    eai;                    /* 0x00e0 */
+       __u8    peraid;                 /* 0x00e1 */
+       __u8    oai;                    /* 0x00e2 */
+       __u8    armid;                  /* 0x00e3 */
+       __u8    reservede4[4];          /* 0x00e4 */
+       __u64   tecmc;                  /* 0x00e8 */
+       __u8    reservedf0[16];         /* 0x00f0 */
        __u64   gcr[16];                /* 0x0100 */
        __u64   gbea;                   /* 0x0180 */
        __u8    reserved188[24];        /* 0x0188 */
@@ -146,6 +180,8 @@ struct kvm_vcpu_stat {
        u32 exit_instruction;
        u32 instruction_lctl;
        u32 instruction_lctlg;
+       u32 instruction_stctl;
+       u32 instruction_stctg;
        u32 exit_program_interruption;
        u32 exit_instr_and_program;
        u32 deliver_external_call;
@@ -164,6 +200,7 @@ struct kvm_vcpu_stat {
        u32 instruction_stpx;
        u32 instruction_stap;
        u32 instruction_storage_key;
+       u32 instruction_ipte_interlock;
        u32 instruction_stsch;
        u32 instruction_chsc;
        u32 instruction_stsi;
@@ -183,13 +220,58 @@ struct kvm_vcpu_stat {
        u32 diagnose_9c;
 };
 
-#define PGM_OPERATION            0x01
-#define PGM_PRIVILEGED_OP       0x02
-#define PGM_EXECUTE              0x03
-#define PGM_PROTECTION           0x04
-#define PGM_ADDRESSING           0x05
-#define PGM_SPECIFICATION        0x06
-#define PGM_DATA                 0x07
+#define PGM_OPERATION                  0x01
+#define PGM_PRIVILEGED_OP              0x02
+#define PGM_EXECUTE                    0x03
+#define PGM_PROTECTION                 0x04
+#define PGM_ADDRESSING                 0x05
+#define PGM_SPECIFICATION              0x06
+#define PGM_DATA                       0x07
+#define PGM_FIXED_POINT_OVERFLOW       0x08
+#define PGM_FIXED_POINT_DIVIDE         0x09
+#define PGM_DECIMAL_OVERFLOW           0x0a
+#define PGM_DECIMAL_DIVIDE             0x0b
+#define PGM_HFP_EXPONENT_OVERFLOW      0x0c
+#define PGM_HFP_EXPONENT_UNDERFLOW     0x0d
+#define PGM_HFP_SIGNIFICANCE           0x0e
+#define PGM_HFP_DIVIDE                 0x0f
+#define PGM_SEGMENT_TRANSLATION                0x10
+#define PGM_PAGE_TRANSLATION           0x11
+#define PGM_TRANSLATION_SPEC           0x12
+#define PGM_SPECIAL_OPERATION          0x13
+#define PGM_OPERAND                    0x15
+#define PGM_TRACE_TABEL                        0x16
+#define PGM_SPACE_SWITCH               0x1c
+#define PGM_HFP_SQUARE_ROOT            0x1d
+#define PGM_PC_TRANSLATION_SPEC                0x1f
+#define PGM_AFX_TRANSLATION            0x20
+#define PGM_ASX_TRANSLATION            0x21
+#define PGM_LX_TRANSLATION             0x22
+#define PGM_EX_TRANSLATION             0x23
+#define PGM_PRIMARY_AUTHORITY          0x24
+#define PGM_SECONDARY_AUTHORITY                0x25
+#define PGM_LFX_TRANSLATION            0x26
+#define PGM_LSX_TRANSLATION            0x27
+#define PGM_ALET_SPECIFICATION         0x28
+#define PGM_ALEN_TRANSLATION           0x29
+#define PGM_ALE_SEQUENCE               0x2a
+#define PGM_ASTE_VALIDITY              0x2b
+#define PGM_ASTE_SEQUENCE              0x2c
+#define PGM_EXTENDED_AUTHORITY         0x2d
+#define PGM_LSTE_SEQUENCE              0x2e
+#define PGM_ASTE_INSTANCE              0x2f
+#define PGM_STACK_FULL                 0x30
+#define PGM_STACK_EMPTY                        0x31
+#define PGM_STACK_SPECIFICATION                0x32
+#define PGM_STACK_TYPE                 0x33
+#define PGM_STACK_OPERATION            0x34
+#define PGM_ASCE_TYPE                  0x38
+#define PGM_REGION_FIRST_TRANS         0x39
+#define PGM_REGION_SECOND_TRANS                0x3a
+#define PGM_REGION_THIRD_TRANS         0x3b
+#define PGM_MONITOR                    0x40
+#define PGM_PER                                0x80
+#define PGM_CRYPTO_OPERATION           0x119
 
 struct kvm_s390_interrupt_info {
        struct list_head list;
@@ -229,6 +311,45 @@ struct kvm_s390_float_interrupt {
        unsigned int irq_count;
 };
 
+struct kvm_hw_wp_info_arch {
+       unsigned long addr;
+       unsigned long phys_addr;
+       int len;
+       char *old_data;
+};
+
+struct kvm_hw_bp_info_arch {
+       unsigned long addr;
+       int len;
+};
+
+/*
+ * Only the upper 16 bits of kvm_guest_debug->control are arch specific.
+ * Further KVM_GUESTDBG flags which an be used from userspace can be found in
+ * arch/s390/include/uapi/asm/kvm.h
+ */
+#define KVM_GUESTDBG_EXIT_PENDING 0x10000000
+
+#define guestdbg_enabled(vcpu) \
+               (vcpu->guest_debug & KVM_GUESTDBG_ENABLE)
+#define guestdbg_sstep_enabled(vcpu) \
+               (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP)
+#define guestdbg_hw_bp_enabled(vcpu) \
+               (vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP)
+#define guestdbg_exit_pending(vcpu) (guestdbg_enabled(vcpu) && \
+               (vcpu->guest_debug & KVM_GUESTDBG_EXIT_PENDING))
+
+struct kvm_guestdbg_info_arch {
+       unsigned long cr0;
+       unsigned long cr9;
+       unsigned long cr10;
+       unsigned long cr11;
+       struct kvm_hw_bp_info_arch *hw_bp_info;
+       struct kvm_hw_wp_info_arch *hw_wp_info;
+       int nr_hw_bp;
+       int nr_hw_wp;
+       unsigned long last_bp;
+};
 
 struct kvm_vcpu_arch {
        struct kvm_s390_sie_block *sie_block;
@@ -238,11 +359,13 @@ struct kvm_vcpu_arch {
        struct kvm_s390_local_interrupt local_int;
        struct hrtimer    ckc_timer;
        struct tasklet_struct tasklet;
+       struct kvm_s390_pgm_info pgm;
        union  {
                struct cpuid    cpu_id;
                u64             stidp_data;
        };
        struct gmap *gmap;
+       struct kvm_guestdbg_info_arch guestdbg;
 #define KVM_S390_PFAULT_TOKEN_INVALID  (-1UL)
        unsigned long pfault_token;
        unsigned long pfault_select;
@@ -285,7 +408,9 @@ struct kvm_arch{
        struct gmap *gmap;
        int css_support;
        int use_irqchip;
+       int use_cmma;
        struct s390_io_adapter *adapters[MAX_S390_IO_ADAPTERS];
+       wait_queue_head_t ipte_wq;
 };
 
 #define KVM_HVA_ERR_BAD                (-1UL)