kvm_host.h 11.6 KB
Newer Older
1
/*
2
 * definition for kernel virtual machines on s390
3
 *
4
 * Copyright IBM Corp. 2008, 2009
5 6 7 8 9 10 11 12 13 14 15
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License (version 2 only)
 * as published by the Free Software Foundation.
 *
 *    Author(s): Carsten Otte <cotte@de.ibm.com>
 */


#ifndef ASM_KVM_HOST_H
#define ASM_KVM_HOST_H
16 17
#include <linux/hrtimer.h>
#include <linux/interrupt.h>
18
#include <linux/kvm_host.h>
19
#include <linux/kvm.h>
20
#include <asm/debug.h>
21
#include <asm/cpu.h>
22
#include <asm/isc.h>
23 24

#define KVM_MAX_VCPUS 64
25
#define KVM_USER_MEM_SLOTS 32
26

27 28 29 30 31 32 33 34
/*
 * These seem to be used for allocating ->chip in the routing table,
 * which we don't use. 4096 is an out-of-thin-air value. If we need
 * to look at ->chip later on, we'll need to revisit this.
 */
#define KVM_NR_IRQCHIPS 1
#define KVM_IRQCHIP_NUM_PINS 4096

35 36
#define SIGP_CTRL_C	0x00800000

37
struct sca_entry {
38
	atomic_t ctrl;
39
	__u32	reserved;
40 41 42 43
	__u64	sda;
	__u64	reserved2[2];
} __attribute__((packed));

44 45 46 47 48 49 50 51
union ipte_control {
	unsigned long val;
	struct {
		unsigned long k  : 1;
		unsigned long kh : 31;
		unsigned long kg : 32;
	};
};
52 53

struct sca_block {
54
	union ipte_control ipte_control;
55 56 57 58 59 60
	__u64	reserved[5];
	__u64	mcn;
	__u64	reserved2;
	struct sca_entry cpu[64];
} __attribute__((packed));

61
#define CPUSTAT_STOPPED    0x80000000
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
#define CPUSTAT_WAIT       0x10000000
#define CPUSTAT_ECALL_PEND 0x08000000
#define CPUSTAT_STOP_INT   0x04000000
#define CPUSTAT_IO_INT     0x02000000
#define CPUSTAT_EXT_INT    0x01000000
#define CPUSTAT_RUNNING    0x00800000
#define CPUSTAT_RETAINED   0x00400000
#define CPUSTAT_TIMING_SUB 0x00020000
#define CPUSTAT_SIE_SUB    0x00010000
#define CPUSTAT_RRF        0x00008000
#define CPUSTAT_SLSV       0x00004000
#define CPUSTAT_SLSR       0x00002000
#define CPUSTAT_ZARCH      0x00000800
#define CPUSTAT_MCDS       0x00000100
#define CPUSTAT_SM         0x00000080
77
#define CPUSTAT_IBS        0x00000040
78
#define CPUSTAT_G          0x00000008
79
#define CPUSTAT_GED        0x00000004
80 81 82
#define CPUSTAT_J          0x00000002
#define CPUSTAT_P          0x00000001

83
struct kvm_s390_sie_block {
84
	atomic_t cpuflags;		/* 0x0000 */
85 86 87
	__u32 : 1;			/* 0x0004 */
	__u32 prefix : 18;
	__u32 : 13;
88 89 90
	__u8	reserved08[4];		/* 0x0008 */
#define PROG_IN_SIE (1<<0)
	__u32	prog0c;			/* 0x000c */
91 92 93 94
	__u8	reserved10[16];		/* 0x0010 */
#define PROG_BLOCK_SIE 0x00000001
	atomic_t prog20;		/* 0x0020 */
	__u8	reserved24[4];		/* 0x0024 */
95 96 97 98
	__u64	cputm;			/* 0x0028 */
	__u64	ckc;			/* 0x0030 */
	__u64	epoch;			/* 0x0038 */
	__u8	reserved40[4];		/* 0x0040 */
99
#define LCTL_CR0	0x8000
100
#define LCTL_CR6	0x0200
101 102 103
#define LCTL_CR9	0x0040
#define LCTL_CR10	0x0020
#define LCTL_CR11	0x0010
104
#define LCTL_CR14	0x0002
105 106
	__u16   lctl;			/* 0x0044 */
	__s16	icpua;			/* 0x0046 */
107 108 109 110 111 112
#define ICTL_PINT	0x20000000
#define ICTL_LPSW	0x00400000
#define ICTL_STCTL	0x00040000
#define ICTL_ISKE	0x00004000
#define ICTL_SSKE	0x00002000
#define ICTL_RRBE	0x00001000
113
#define ICTL_TPROT	0x00000200
114 115
	__u32	ictl;			/* 0x0048 */
	__u32	eca;			/* 0x004c */
116 117 118 119 120 121
#define ICPT_INST	0x04
#define ICPT_PROGI	0x08
#define ICPT_INSTPROGI	0x0C
#define ICPT_OPEREXC	0x2C
#define ICPT_PARTEXEC	0x38
#define ICPT_IOINST	0x40
122 123 124 125 126 127 128 129 130
	__u8	icptcode;		/* 0x0050 */
	__u8	reserved51;		/* 0x0051 */
	__u16	ihcpu;			/* 0x0052 */
	__u8	reserved54[2];		/* 0x0054 */
	__u16	ipa;			/* 0x0056 */
	__u32	ipb;			/* 0x0058 */
	__u32	scaoh;			/* 0x005c */
	__u8	reserved60;		/* 0x0060 */
	__u8	ecb;			/* 0x0061 */
131 132
	__u8    ecb2;                   /* 0x0062 */
	__u8    reserved63[1];          /* 0x0063 */
133 134 135
	__u32	scaol;			/* 0x0064 */
	__u8	reserved68[4];		/* 0x0068 */
	__u32	todpr;			/* 0x006c */
136
	__u8	reserved70[32];		/* 0x0070 */
137 138 139
	psw_t	gpsw;			/* 0x0090 */
	__u64	gg14;			/* 0x00a0 */
	__u64	gg15;			/* 0x00a8 */
140 141 142 143
	__u8	reservedb0[20];		/* 0x00b0 */
	__u16	extcpuaddr;		/* 0x00c4 */
	__u16	eic;			/* 0x00c6 */
	__u32	reservedc8;		/* 0x00c8 */
144 145 146 147 148 149 150 151 152 153 154 155 156 157
	__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 */
158 159
	__u64	gcr[16];		/* 0x0100 */
	__u64	gbea;			/* 0x0180 */
160 161
	__u8	reserved188[24];	/* 0x0188 */
	__u32	fac;			/* 0x01a0 */
162 163
	__u8	reserved1a4[20];	/* 0x01a4 */
	__u64	cbrlo;			/* 0x01b8 */
164
	__u8	reserved1c0[30];	/* 0x01c0 */
165 166
	__u64	pp;			/* 0x01de */
	__u8	reserved1e6[2];		/* 0x01e6 */
167 168
	__u64	itdba;			/* 0x01e8 */
	__u8	reserved1f0[16];	/* 0x01f0 */
169 170
} __attribute__((packed));

171 172 173 174 175 176 177 178 179 180 181
struct kvm_s390_itdb {
	__u8	data[256];
} __packed;

struct sie_page {
	struct kvm_s390_sie_block sie_block;
	__u8 reserved200[1024];		/* 0x0200 */
	struct kvm_s390_itdb itdb;	/* 0x0600 */
	__u8 reserved700[2304];		/* 0x0700 */
} __packed;

182 183
struct kvm_vcpu_stat {
	u32 exit_userspace;
184
	u32 exit_null;
185 186 187 188
	u32 exit_external_request;
	u32 exit_external_interrupt;
	u32 exit_stop_request;
	u32 exit_validity;
189 190
	u32 exit_instruction;
	u32 instruction_lctl;
191
	u32 instruction_lctlg;
192 193
	u32 instruction_stctl;
	u32 instruction_stctg;
194 195
	u32 exit_program_interruption;
	u32 exit_instr_and_program;
196
	u32 deliver_external_call;
197 198 199 200 201 202 203
	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;
204
	u32 deliver_io_int;
205
	u32 exit_wait_state;
206
	u32 instruction_pfmf;
207 208 209 210 211
	u32 instruction_stidp;
	u32 instruction_spx;
	u32 instruction_stpx;
	u32 instruction_stap;
	u32 instruction_storage_key;
212
	u32 instruction_ipte_interlock;
213 214 215 216
	u32 instruction_stsch;
	u32 instruction_chsc;
	u32 instruction_stsi;
	u32 instruction_stfl;
217
	u32 instruction_tprot;
218
	u32 instruction_essa;
219
	u32 instruction_sigp_sense;
220
	u32 instruction_sigp_sense_running;
221
	u32 instruction_sigp_external_call;
222 223 224 225 226
	u32 instruction_sigp_emergency;
	u32 instruction_sigp_stop;
	u32 instruction_sigp_arch;
	u32 instruction_sigp_prefix;
	u32 instruction_sigp_restart;
227
	u32 diagnose_10;
228
	u32 diagnose_44;
229
	u32 diagnose_9c;
230 231
};

232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283
#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
284

285
struct kvm_s390_interrupt_info {
286 287 288
	struct list_head list;
	u64	type;
	union {
289 290 291
		struct kvm_s390_io_info io;
		struct kvm_s390_ext_info ext;
		struct kvm_s390_pgm_info pgm;
292
		struct kvm_s390_emerg_info emerg;
293
		struct kvm_s390_extcall_info extcall;
294
		struct kvm_s390_prefix_info prefix;
295
		struct kvm_s390_mchk_info mchk;
296 297 298
	};
};

299
/* for local_interrupt.action_flags */
300 301
#define ACTION_STORE_ON_STOP		(1<<0)
#define ACTION_STOP_ON_STOP		(1<<1)
302

303
struct kvm_s390_local_interrupt {
304 305 306
	spinlock_t lock;
	struct list_head list;
	atomic_t active;
307
	struct kvm_s390_float_interrupt *float_int;
308
	wait_queue_head_t *wq;
309 310
	atomic_t *cpuflags;
	unsigned int action_bits;
311 312
};

313
struct kvm_s390_float_interrupt {
314 315 316 317
	spinlock_t lock;
	struct list_head list;
	atomic_t active;
	int next_rr_cpu;
318
	unsigned long idle_mask[BITS_TO_LONGS(KVM_MAX_VCPUS)];
J
Jens Freimann 已提交
319
	unsigned int irq_count;
320 321
};

322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360
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;
};
361

362
struct kvm_vcpu_arch {
363
	struct kvm_s390_sie_block *sie_block;
364 365 366
	s390_fp_regs      host_fpregs;
	unsigned int      host_acrs[NUM_ACRS];
	s390_fp_regs      guest_fpregs;
367
	struct kvm_s390_local_interrupt local_int;
368
	struct hrtimer    ckc_timer;
369
	struct kvm_s390_pgm_info pgm;
370
	union  {
371 372
		struct cpuid	cpu_id;
		u64		stidp_data;
373
	};
374
	struct gmap *gmap;
375
	struct kvm_guestdbg_info_arch guestdbg;
376 377 378 379
#define KVM_S390_PFAULT_TOKEN_INVALID	(-1UL)
	unsigned long pfault_token;
	unsigned long pfault_select;
	unsigned long pfault_compare;
380 381 382 383 384 385
};

struct kvm_vm_stat {
	u32 remote_tlb_flush;
};

386 387 388
struct kvm_arch_memory_slot {
};

389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409
struct s390_map_info {
	struct list_head list;
	__u64 guest_addr;
	__u64 addr;
	struct page *page;
};

struct s390_io_adapter {
	unsigned int id;
	int isc;
	bool maskable;
	bool masked;
	bool swap;
	struct rw_semaphore maps_lock;
	struct list_head maps;
	atomic_t nr_maps;
};

#define MAX_S390_IO_ADAPTERS ((MAX_ISC + 1) * 8)
#define MAX_S390_ADAPTER_MAPS 256

410 411 412
struct kvm_arch{
	struct sca_block *sca;
	debug_info_t *dbf;
413
	struct kvm_s390_float_interrupt float_int;
414
	struct kvm_device *flic;
415
	struct gmap *gmap;
416
	int css_support;
417
	int use_irqchip;
418
	int use_cmma;
419
	int user_cpu_state_ctrl;
420
	struct s390_io_adapter *adapters[MAX_S390_IO_ADAPTERS];
421
	wait_queue_head_t ipte_wq;
422
	spinlock_t start_stop_lock;
423 424
};

425 426 427 428 429 430 431 432
#define KVM_HVA_ERR_BAD		(-1UL)
#define KVM_HVA_ERR_RO_BAD	(-2UL)

static inline bool kvm_is_error_hva(unsigned long addr)
{
	return IS_ERR_VALUE(addr);
}

433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450
#define ASYNC_PF_PER_VCPU	64
struct kvm_vcpu;
struct kvm_async_pf;
struct kvm_arch_async_pf {
	unsigned long pfault_token;
};

bool kvm_arch_can_inject_async_page_present(struct kvm_vcpu *vcpu);

void kvm_arch_async_page_ready(struct kvm_vcpu *vcpu,
			       struct kvm_async_pf *work);

void kvm_arch_async_page_not_present(struct kvm_vcpu *vcpu,
				     struct kvm_async_pf *work);

void kvm_arch_async_page_present(struct kvm_vcpu *vcpu,
				 struct kvm_async_pf *work);

451
extern int sie64a(struct kvm_s390_sie_block *, u64 *);
452
extern char sie_exit;
453
#endif