linux/arch/s390/include/asm/kvm_host.h
<<
>>
Prefs
   1/*
   2 * definition for kernel virtual machines on s390
   3 *
   4 * Copyright IBM Corp. 2008, 2009
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License (version 2 only)
   8 * as published by the Free Software Foundation.
   9 *
  10 *    Author(s): Carsten Otte <cotte@de.ibm.com>
  11 */
  12
  13
  14#ifndef ASM_KVM_HOST_H
  15#define ASM_KVM_HOST_H
  16#include <linux/hrtimer.h>
  17#include <linux/interrupt.h>
  18#include <linux/kvm_host.h>
  19#include <asm/debug.h>
  20#include <asm/cpu.h>
  21
  22#define KVM_MAX_VCPUS 64
  23#define KVM_USER_MEM_SLOTS 32
  24
  25struct sca_entry {
  26        atomic_t scn;
  27        __u32   reserved;
  28        __u64   sda;
  29        __u64   reserved2[2];
  30} __attribute__((packed));
  31
  32
  33struct sca_block {
  34        __u64   ipte_control;
  35        __u64   reserved[5];
  36        __u64   mcn;
  37        __u64   reserved2;
  38        struct sca_entry cpu[64];
  39} __attribute__((packed));
  40
  41#define KVM_NR_PAGE_SIZES 2
  42#define KVM_HPAGE_GFN_SHIFT(x) (((x) - 1) * 8)
  43#define KVM_HPAGE_SHIFT(x) (PAGE_SHIFT + KVM_HPAGE_GFN_SHIFT(x))
  44#define KVM_HPAGE_SIZE(x) (1UL << KVM_HPAGE_SHIFT(x))
  45#define KVM_HPAGE_MASK(x)       (~(KVM_HPAGE_SIZE(x) - 1))
  46#define KVM_PAGES_PER_HPAGE(x)  (KVM_HPAGE_SIZE(x) / PAGE_SIZE)
  47
  48#define CPUSTAT_STOPPED    0x80000000
  49#define CPUSTAT_WAIT       0x10000000
  50#define CPUSTAT_ECALL_PEND 0x08000000
  51#define CPUSTAT_STOP_INT   0x04000000
  52#define CPUSTAT_IO_INT     0x02000000
  53#define CPUSTAT_EXT_INT    0x01000000
  54#define CPUSTAT_RUNNING    0x00800000
  55#define CPUSTAT_RETAINED   0x00400000
  56#define CPUSTAT_TIMING_SUB 0x00020000
  57#define CPUSTAT_SIE_SUB    0x00010000
  58#define CPUSTAT_RRF        0x00008000
  59#define CPUSTAT_SLSV       0x00004000
  60#define CPUSTAT_SLSR       0x00002000
  61#define CPUSTAT_ZARCH      0x00000800
  62#define CPUSTAT_MCDS       0x00000100
  63#define CPUSTAT_SM         0x00000080
  64#define CPUSTAT_G          0x00000008
  65#define CPUSTAT_J          0x00000002
  66#define CPUSTAT_P          0x00000001
  67
  68struct kvm_s390_sie_block {
  69        atomic_t cpuflags;              /* 0x0000 */
  70        __u32   prefix;                 /* 0x0004 */
  71        __u8    reserved8[32];          /* 0x0008 */
  72        __u64   cputm;                  /* 0x0028 */
  73        __u64   ckc;                    /* 0x0030 */
  74        __u64   epoch;                  /* 0x0038 */
  75        __u8    reserved40[4];          /* 0x0040 */
  76#define LCTL_CR0        0x8000
  77#define LCTL_CR6        0x0200
  78#define LCTL_CR14       0x0002
  79        __u16   lctl;                   /* 0x0044 */
  80        __s16   icpua;                  /* 0x0046 */
  81#define ICTL_LPSW 0x00400000
  82        __u32   ictl;                   /* 0x0048 */
  83        __u32   eca;                    /* 0x004c */
  84        __u8    icptcode;               /* 0x0050 */
  85        __u8    reserved51;             /* 0x0051 */
  86        __u16   ihcpu;                  /* 0x0052 */
  87        __u8    reserved54[2];          /* 0x0054 */
  88        __u16   ipa;                    /* 0x0056 */
  89        __u32   ipb;                    /* 0x0058 */
  90        __u32   scaoh;                  /* 0x005c */
  91        __u8    reserved60;             /* 0x0060 */
  92        __u8    ecb;                    /* 0x0061 */
  93        __u8    reserved62[2];          /* 0x0062 */
  94        __u32   scaol;                  /* 0x0064 */
  95        __u8    reserved68[4];          /* 0x0068 */
  96        __u32   todpr;                  /* 0x006c */
  97        __u8    reserved70[32];         /* 0x0070 */
  98        psw_t   gpsw;                   /* 0x0090 */
  99        __u64   gg14;                   /* 0x00a0 */
 100        __u64   gg15;                   /* 0x00a8 */
 101        __u8    reservedb0[30];         /* 0x00b0 */
 102        __u16   iprcc;                  /* 0x00ce */
 103        __u8    reservedd0[48];         /* 0x00d0 */
 104        __u64   gcr[16];                /* 0x0100 */
 105        __u64   gbea;                   /* 0x0180 */
 106        __u8    reserved188[24];        /* 0x0188 */
 107        __u32   fac;                    /* 0x01a0 */
 108        __u8    reserved1a4[92];        /* 0x01a4 */
 109} __attribute__((packed));
 110
 111struct kvm_vcpu_stat {
 112        u32 exit_userspace;
 113        u32 exit_null;
 114        u32 exit_external_request;
 115        u32 exit_external_interrupt;
 116        u32 exit_stop_request;
 117        u32 exit_validity;
 118        u32 exit_instruction;
 119        u32 instruction_lctl;
 120        u32 instruction_lctlg;
 121        u32 exit_program_interruption;
 122        u32 exit_instr_and_program;
 123        u32 deliver_external_call;
 124        u32 deliver_emergency_signal;
 125        u32 deliver_service_signal;
 126        u32 deliver_virtio_interrupt;
 127        u32 deliver_stop_signal;
 128        u32 deliver_prefix_signal;
 129        u32 deliver_restart_signal;
 130        u32 deliver_program_int;
 131        u32 deliver_io_int;
 132        u32 exit_wait_state;
 133        u32 instruction_stidp;
 134        u32 instruction_spx;
 135        u32 instruction_stpx;
 136        u32 instruction_stap;
 137        u32 instruction_storage_key;
 138        u32 instruction_stsch;
 139        u32 instruction_chsc;
 140        u32 instruction_stsi;
 141        u32 instruction_stfl;
 142        u32 instruction_tprot;
 143        u32 instruction_sigp_sense;
 144        u32 instruction_sigp_sense_running;
 145        u32 instruction_sigp_external_call;
 146        u32 instruction_sigp_emergency;
 147        u32 instruction_sigp_stop;
 148        u32 instruction_sigp_arch;
 149        u32 instruction_sigp_prefix;
 150        u32 instruction_sigp_restart;
 151        u32 diagnose_10;
 152        u32 diagnose_44;
 153        u32 diagnose_9c;
 154};
 155
 156struct kvm_s390_io_info {
 157        __u16        subchannel_id;            /* 0x0b8 */
 158        __u16        subchannel_nr;            /* 0x0ba */
 159        __u32        io_int_parm;              /* 0x0bc */
 160        __u32        io_int_word;              /* 0x0c0 */
 161};
 162
 163struct kvm_s390_ext_info {
 164        __u32 ext_params;
 165        __u64 ext_params2;
 166};
 167
 168#define PGM_OPERATION            0x01
 169#define PGM_PRIVILEGED_OPERATION 0x02
 170#define PGM_EXECUTE              0x03
 171#define PGM_PROTECTION           0x04
 172#define PGM_ADDRESSING           0x05
 173#define PGM_SPECIFICATION        0x06
 174#define PGM_DATA                 0x07
 175
 176struct kvm_s390_pgm_info {
 177        __u16 code;
 178};
 179
 180struct kvm_s390_prefix_info {
 181        __u32 address;
 182};
 183
 184struct kvm_s390_extcall_info {
 185        __u16 code;
 186};
 187
 188struct kvm_s390_emerg_info {
 189        __u16 code;
 190};
 191
 192struct kvm_s390_mchk_info {
 193        __u64 cr14;
 194        __u64 mcic;
 195};
 196
 197struct kvm_s390_interrupt_info {
 198        struct list_head list;
 199        u64     type;
 200        union {
 201                struct kvm_s390_io_info io;
 202                struct kvm_s390_ext_info ext;
 203                struct kvm_s390_pgm_info pgm;
 204                struct kvm_s390_emerg_info emerg;
 205                struct kvm_s390_extcall_info extcall;
 206                struct kvm_s390_prefix_info prefix;
 207                struct kvm_s390_mchk_info mchk;
 208        };
 209};
 210
 211/* for local_interrupt.action_flags */
 212#define ACTION_STORE_ON_STOP            (1<<0)
 213#define ACTION_STOP_ON_STOP             (1<<1)
 214#define ACTION_RELOADVCPU_ON_STOP       (1<<2)
 215
 216struct kvm_s390_local_interrupt {
 217        spinlock_t lock;
 218        struct list_head list;
 219        atomic_t active;
 220        struct kvm_s390_float_interrupt *float_int;
 221        int timer_due; /* event indicator for waitqueue below */
 222        wait_queue_head_t wq;
 223        atomic_t *cpuflags;
 224        unsigned int action_bits;
 225};
 226
 227struct kvm_s390_float_interrupt {
 228        spinlock_t lock;
 229        struct list_head list;
 230        atomic_t active;
 231        int next_rr_cpu;
 232        unsigned long idle_mask[(KVM_MAX_VCPUS + sizeof(long) - 1)
 233                                / sizeof(long)];
 234        struct kvm_s390_local_interrupt *local_int[KVM_MAX_VCPUS];
 235};
 236
 237
 238struct kvm_vcpu_arch {
 239        struct kvm_s390_sie_block *sie_block;
 240        s390_fp_regs      host_fpregs;
 241        unsigned int      host_acrs[NUM_ACRS];
 242        s390_fp_regs      guest_fpregs;
 243        struct kvm_s390_local_interrupt local_int;
 244        struct hrtimer    ckc_timer;
 245        struct tasklet_struct tasklet;
 246        union  {
 247                struct cpuid    cpu_id;
 248                u64             stidp_data;
 249        };
 250        struct gmap *gmap;
 251};
 252
 253struct kvm_vm_stat {
 254        u32 remote_tlb_flush;
 255};
 256
 257struct kvm_arch_memory_slot {
 258};
 259
 260struct kvm_arch{
 261        struct sca_block *sca;
 262        debug_info_t *dbf;
 263        struct kvm_s390_float_interrupt float_int;
 264        struct gmap *gmap;
 265        int css_support;
 266};
 267
 268extern int sie64a(struct kvm_s390_sie_block *, u64 *);
 269#endif
 270