]> err.no Git - linux-2.6/blobdiff - include/asm-s390/kvm_host.h
m68knommu: add ffs and __ffs plattform which support ISA A+ or ISA C
[linux-2.6] / include / asm-s390 / kvm_host.h
index c9d653333106579541ea376a35a2ddc567086ae6..3234dd5b3511275521f8f22b3e4f808b432eb257 100644 (file)
@@ -62,7 +62,7 @@ struct sca_block {
 #define CPUSTAT_J          0x00000002
 #define CPUSTAT_P          0x00000001
 
-struct sie_block {
+struct kvm_s390_sie_block {
        atomic_t cpuflags;              /* 0x0000 */
        __u32   prefix;                 /* 0x0004 */
        __u8    reserved8[32];          /* 0x0008 */
@@ -70,6 +70,7 @@ struct sie_block {
        __u64   ckc;                    /* 0x0030 */
        __u64   epoch;                  /* 0x0038 */
        __u8    reserved40[4];          /* 0x0040 */
+#define LCTL_CR0       0x8000
        __u16   lctl;                   /* 0x0044 */
        __s16   icpua;                  /* 0x0046 */
        __u32   ictl;                   /* 0x0048 */
@@ -93,7 +94,9 @@ struct sie_block {
        psw_t   gpsw;                   /* 0x0090 */
        __u64   gg14;                   /* 0x00a0 */
        __u64   gg15;                   /* 0x00a8 */
-       __u8    reservedb0[80];         /* 0x00b0 */
+       __u8    reservedb0[30];         /* 0x00b0 */
+       __u16   iprcc;                  /* 0x00ce */
+       __u8    reservedd0[48];         /* 0x00d0 */
        __u64   gcr[16];                /* 0x0100 */
        __u64   gbea;                   /* 0x0180 */
        __u8    reserved188[120];       /* 0x0188 */
@@ -101,15 +104,119 @@ struct sie_block {
 
 struct kvm_vcpu_stat {
        u32 exit_userspace;
+       u32 exit_null;
+       u32 exit_external_request;
+       u32 exit_external_interrupt;
+       u32 exit_stop_request;
+       u32 exit_validity;
+       u32 exit_instruction;
+       u32 instruction_lctl;
+       u32 instruction_lctg;
+       u32 exit_program_interruption;
+       u32 exit_instr_and_program;
+       u32 deliver_emergency_signal;
+       u32 deliver_service_signal;
+       u32 deliver_virtio_interrupt;
+       u32 deliver_stop_signal;
+       u32 deliver_prefix_signal;
+       u32 deliver_restart_signal;
+       u32 deliver_program_int;
+       u32 exit_wait_state;
+       u32 instruction_stidp;
+       u32 instruction_spx;
+       u32 instruction_stpx;
+       u32 instruction_stap;
+       u32 instruction_storage_key;
+       u32 instruction_stsch;
+       u32 instruction_chsc;
+       u32 instruction_stsi;
+       u32 instruction_stfl;
+       u32 instruction_sigp_sense;
+       u32 instruction_sigp_emergency;
+       u32 instruction_sigp_stop;
+       u32 instruction_sigp_arch;
+       u32 instruction_sigp_prefix;
+       u32 instruction_sigp_restart;
+       u32 diagnose_44;
 };
 
+struct kvm_s390_io_info {
+       __u16        subchannel_id;            /* 0x0b8 */
+       __u16        subchannel_nr;            /* 0x0ba */
+       __u32        io_int_parm;              /* 0x0bc */
+       __u32        io_int_word;              /* 0x0c0 */
+};
+
+struct kvm_s390_ext_info {
+       __u32 ext_params;
+       __u64 ext_params2;
+};
+
+#define PGM_OPERATION            0x01
+#define PGM_PRIVILEGED_OPERATION 0x02
+#define PGM_EXECUTE              0x03
+#define PGM_PROTECTION           0x04
+#define PGM_ADDRESSING           0x05
+#define PGM_SPECIFICATION        0x06
+#define PGM_DATA                 0x07
+
+struct kvm_s390_pgm_info {
+       __u16 code;
+};
+
+struct kvm_s390_prefix_info {
+       __u32 address;
+};
+
+struct kvm_s390_interrupt_info {
+       struct list_head list;
+       u64     type;
+       union {
+               struct kvm_s390_io_info io;
+               struct kvm_s390_ext_info ext;
+               struct kvm_s390_pgm_info pgm;
+               struct kvm_s390_prefix_info prefix;
+       };
+};
+
+/* for local_interrupt.action_flags */
+#define ACTION_STORE_ON_STOP 1
+#define ACTION_STOP_ON_STOP  2
+
+struct kvm_s390_local_interrupt {
+       spinlock_t lock;
+       struct list_head list;
+       atomic_t active;
+       struct kvm_s390_float_interrupt *float_int;
+       int timer_due; /* event indicator for waitqueue below */
+       wait_queue_head_t wq;
+       atomic_t *cpuflags;
+       unsigned int action_bits;
+};
+
+struct kvm_s390_float_interrupt {
+       spinlock_t lock;
+       struct list_head list;
+       atomic_t active;
+       int next_rr_cpu;
+       unsigned long idle_mask [(64 + sizeof(long) - 1) / sizeof(long)];
+       struct kvm_s390_local_interrupt *local_int[64];
+};
+
+
 struct kvm_vcpu_arch {
-       struct sie_block *sie_block;
+       struct kvm_s390_sie_block *sie_block;
        unsigned long     guest_gprs[16];
        s390_fp_regs      host_fpregs;
        unsigned int      host_acrs[NUM_ACRS];
        s390_fp_regs      guest_fpregs;
        unsigned int      guest_acrs[NUM_ACRS];
+       struct kvm_s390_local_interrupt local_int;
+       struct timer_list ckc_timer;
+       union  {
+               cpuid_t   cpu_id;
+               u64       stidp_data;
+       };
 };
 
 struct kvm_vm_stat {
@@ -121,7 +228,8 @@ struct kvm_arch{
        unsigned long guest_memsize;
        struct sca_block *sca;
        debug_info_t *dbf;
+       struct kvm_s390_float_interrupt float_int;
 };
 
-extern int sie64a(struct sie_block *, __u64 *);
+extern int sie64a(struct kvm_s390_sie_block *, __u64 *);
 #endif