linux/arch/s390/include/asm/kvm_host.h
<<
>>
Prefs
   1/*
   2 * asm-s390/kvm_host.h - 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_MEMORY_SLOTS 32
  24/* memory slots that does not exposed to userspace */
  25#define KVM_PRIVATE_MEM_SLOTS 4
  26
  27struct sca_entry {
  28        atomic_t scn;
  29        __u64   reserved;
  30        __u64   sda;
  31        __u64   reserved2[2];
  32} __attribute__((packed));
  33
  34
  35struct sca_block {
  36        __u64   ipte_control;
  37        __u64   reserved[5];
  38        __u64   mcn;
  39        __u64   reserved2;
  40        struct sca_entry cpu[64];
  41} __attribute__((packed));
  42
  43#define KVM_NR_PAGE_SIZES 2
  44#define KVM_HPAGE_SHIFT(x) (PAGE_SHIFT + ((x) - 1) * 8)
  45#define KVM_HPAGE_SIZE(x) (1UL << KVM_HPAGE_SHIFT(x))
  46#define KVM_HPAGE_MASK(x)       (~(KVM_HPAGE_SIZE(x) - 1))
  47#define KVM_PAGES_PER_HPAGE(x)  (KVM_HPAGE_SIZE(x) / PAGE_SIZE)
  48
  49#define CPUSTAT_HOST       0x80000000
  50#define CPUSTAT_WAIT       0x10000000
  51#define CPUSTAT_ECALL_PEND 0x08000000
  52#define CPUSTAT_STOP_INT   0x04000000
  53#define CPUSTAT_IO_INT     0x02000000
  54#define CPUSTAT_EXT_INT    0x01000000
  55#define CPUSTAT_RUNNING    0x00800000
  56#define CPUSTAT_RETAINED   0x00400000
  57#define CPUSTAT_TIMING_SUB 0x00020000
  58#define CPUSTAT_SIE_SUB    0x00010000
  59#define CPUSTAT_RRF        0x00008000
  60#define CPUSTAT_SLSV       0x00004000
  61#define CPUSTAT_SLSR       0x00002000
  62#define CPUSTAT_ZARCH      0x00000800
  63#define CPUSTAT_MCDS       0x00000100
  64#define CPUSTAT_SM         0x00000080
  65#define CPUSTAT_G          0x00000008
  66#define CPUSTAT_J          0x00000002
  67#define CPUSTAT_P          0x00000001
  68
  69struct kvm_s390_sie_block {
  70        atomic_t cpuflags;              /* 0x0000 */
  71        __u32   prefix;                 /* 0x0004 */
  72        __u8    reserved8[32];          /* 0x0008 */
  73        __u64   cputm;                  /* 0x0028 */
  74        __u64   ckc;                    /* 0x0030 */
  75        __u64   epoch;                  /* 0x0038 */
  76        __u8    reserved40[4];          /* 0x0040 */
  77#define LCTL_CR0        0x8000
  78        __u16   lctl;                   /* 0x0044 */
  79        __s16   icpua;                  /* 0x0046 */
  80        __u32   ictl;                   /* 0x0048 */
  81        __u32   eca;                    /* 0x004c */
  82        __u8    icptcode;               /* 0x0050 */
  83        __u8    reserved51;             /* 0x0051 */
  84        __u16   ihcpu;                  /* 0x0052 */
  85        __u8    reserved54[2];          /* 0x0054 */
  86        __u16   ipa;                    /* 0x0056 */
  87        __u32   ipb;                    /* 0x0058 */
  88        __u32   scaoh;                  /* 0x005c */
  89        __u8    reserved60;             /* 0x0060 */
  90        __u8    ecb;                    /* 0x0061 */
  91        __u8    reserved62[2];          /* 0x0062 */
  92        __u32   scaol;                  /* 0x0064 */
  93        __u8    reserved68[4];          /* 0x0068 */
  94        __u32   todpr;                  /* 0x006c */
  95        __u8    reserved70[16];         /* 0x0070 */
  96        __u64   gmsor;                  /* 0x0080 */
  97        __u64   gmslm;                  /* 0x0088 */
  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_emergency_signal;
 124        u32 deliver_service_signal;
 125        u32 deliver_virtio_interrupt;
 126        u32 deliver_stop_signal;
 127        u32 deliver_prefix_signal;
 128        u32 deliver_restart_signal;
 129        u32 deliver_program_int;
 130        u32 exit_wait_state;
 131        u32 instruction_stidp;
 132        u32 instruction_spx;
 133        u32 instruction_stpx;
 134        u32 instruction_stap;
 135        u32 instruction_storage_key;
 136        u32 instruction_stsch;
 137        u32 instruction_chsc;
 138        u32 instruction_stsi;
 139        u32 instruction_stfl;
 140        u32 instruction_sigp_sense;
 141        u32 instruction_sigp_emergency;
 142        u32 instruction_sigp_stop;
 143        u32 instruction_sigp_arch;
 144        u32 instruction_sigp_prefix;
 145        u32 instruction_sigp_restart;
 146        u32 diagnose_44;
 147};
 148
 149struct kvm_s390_io_info {
 150        __u16        subchannel_id;            /* 0x0b8 */
 151        __u16        subchannel_nr;            /* 0x0ba */
 152        __u32        io_int_parm;              /* 0x0bc */
 153        __u32        io_int_word;              /* 0x0c0 */
 154};
 155
 156struct kvm_s390_ext_info {
 157        __u32 ext_params;
 158        __u64 ext_params2;
 159};
 160
 161#define PGM_OPERATION            0x01
 162#define PGM_PRIVILEGED_OPERATION 0x02
 163#define PGM_EXECUTE              0x03
 164#define PGM_PROTECTION           0x04
 165#define PGM_ADDRESSING           0x05
 166#define PGM_SPECIFICATION        0x06
 167#define PGM_DATA                 0x07
 168
 169struct kvm_s390_pgm_info {
 170        __u16 code;
 171};
 172
 173struct kvm_s390_prefix_info {
 174        __u32 address;
 175};
 176
 177struct kvm_s390_interrupt_info {
 178        struct list_head list;
 179        u64     type;
 180        union {
 181                struct kvm_s390_io_info io;
 182                struct kvm_s390_ext_info ext;
 183                struct kvm_s390_pgm_info pgm;
 184                struct kvm_s390_prefix_info prefix;
 185        };
 186};
 187
 188/* for local_interrupt.action_flags */
 189#define ACTION_STORE_ON_STOP            (1<<0)
 190#define ACTION_STOP_ON_STOP             (1<<1)
 191#define ACTION_RELOADVCPU_ON_STOP       (1<<2)
 192
 193struct kvm_s390_local_interrupt {
 194        spinlock_t lock;
 195        struct list_head list;
 196        atomic_t active;
 197        struct kvm_s390_float_interrupt *float_int;
 198        int timer_due; /* event indicator for waitqueue below */
 199        wait_queue_head_t wq;
 200        atomic_t *cpuflags;
 201        unsigned int action_bits;
 202};
 203
 204struct kvm_s390_float_interrupt {
 205        spinlock_t lock;
 206        struct list_head list;
 207        atomic_t active;
 208        int next_rr_cpu;
 209        unsigned long idle_mask [(64 + sizeof(long) - 1) / sizeof(long)];
 210        struct kvm_s390_local_interrupt *local_int[64];
 211};
 212
 213
 214struct kvm_vcpu_arch {
 215        struct kvm_s390_sie_block *sie_block;
 216        unsigned long     guest_gprs[16];
 217        s390_fp_regs      host_fpregs;
 218        unsigned int      host_acrs[NUM_ACRS];
 219        s390_fp_regs      guest_fpregs;
 220        unsigned int      guest_acrs[NUM_ACRS];
 221        struct kvm_s390_local_interrupt local_int;
 222        struct hrtimer    ckc_timer;
 223        struct tasklet_struct tasklet;
 224        union  {
 225                struct cpuid    cpu_id;
 226                u64             stidp_data;
 227        };
 228};
 229
 230struct kvm_vm_stat {
 231        u32 remote_tlb_flush;
 232};
 233
 234struct kvm_arch{
 235        struct sca_block *sca;
 236        debug_info_t *dbf;
 237        struct kvm_s390_float_interrupt float_int;
 238};
 239
 240extern int sie64a(struct kvm_s390_sie_block *, unsigned long *);
 241#endif
 242