book3s.c 25.7 KB
Newer Older
A
Alexander Graf 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/*
 * Copyright (C) 2009. SUSE Linux Products GmbH. All rights reserved.
 *
 * Authors:
 *    Alexander Graf <agraf@suse.de>
 *    Kevin Wolf <mail@kevin-wolf.de>
 *
 * Description:
 * This file is derived from arch/powerpc/kvm/44x.c,
 * by Hollis Blanchard <hollisb@us.ibm.com>.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License, version 2, as
 * published by the Free Software Foundation.
 */

#include <linux/kvm_host.h>
#include <linux/err.h>
19
#include <linux/export.h>
20
#include <linux/slab.h>
21 22
#include <linux/module.h>
#include <linux/miscdevice.h>
23 24 25 26
#include <linux/gfp.h>
#include <linux/sched.h>
#include <linux/vmalloc.h>
#include <linux/highmem.h>
A
Alexander Graf 已提交
27 28 29 30

#include <asm/reg.h>
#include <asm/cputable.h>
#include <asm/cacheflush.h>
31
#include <linux/uaccess.h>
A
Alexander Graf 已提交
32 33 34 35
#include <asm/io.h>
#include <asm/kvm_ppc.h>
#include <asm/kvm_book3s.h>
#include <asm/mmu_context.h>
36
#include <asm/page.h>
37
#include <asm/xive.h>
A
Alexander Graf 已提交
38

39
#include "book3s.h"
40 41
#include "trace.h"

A
Alexander Graf 已提交
42 43 44
#define VCPU_STAT(x) offsetof(struct kvm_vcpu, stat.x), KVM_STAT_VCPU

/* #define EXIT_DEBUG */
45

A
Alexander Graf 已提交
46 47 48 49 50 51 52 53 54
struct kvm_stats_debugfs_item debugfs_entries[] = {
	{ "exits",       VCPU_STAT(sum_exits) },
	{ "mmio",        VCPU_STAT(mmio_exits) },
	{ "sig",         VCPU_STAT(signal_exits) },
	{ "sysc",        VCPU_STAT(syscall_exits) },
	{ "inst_emu",    VCPU_STAT(emulated_inst_exits) },
	{ "dec",         VCPU_STAT(dec_exits) },
	{ "ext_intr",    VCPU_STAT(ext_intr_exits) },
	{ "queue_intr",  VCPU_STAT(queue_intr) },
55 56 57
	{ "halt_poll_success_ns",	VCPU_STAT(halt_poll_success_ns) },
	{ "halt_poll_fail_ns",		VCPU_STAT(halt_poll_fail_ns) },
	{ "halt_wait_ns",		VCPU_STAT(halt_wait_ns) },
58
	{ "halt_successful_poll", VCPU_STAT(halt_successful_poll), },
59
	{ "halt_attempted_poll", VCPU_STAT(halt_attempted_poll), },
60
	{ "halt_successful_wait",	VCPU_STAT(halt_successful_wait) },
61
	{ "halt_poll_invalid", VCPU_STAT(halt_poll_invalid) },
A
Alexander Graf 已提交
62 63 64 65 66 67 68 69 70
	{ "halt_wakeup", VCPU_STAT(halt_wakeup) },
	{ "pf_storage",  VCPU_STAT(pf_storage) },
	{ "sp_storage",  VCPU_STAT(sp_storage) },
	{ "pf_instruc",  VCPU_STAT(pf_instruc) },
	{ "sp_instruc",  VCPU_STAT(sp_instruc) },
	{ "ld",          VCPU_STAT(ld) },
	{ "ld_slow",     VCPU_STAT(ld_slow) },
	{ "st",          VCPU_STAT(st) },
	{ "st_slow",     VCPU_STAT(st_slow) },
71 72 73
	{ "pthru_all",       VCPU_STAT(pthru_all) },
	{ "pthru_host",      VCPU_STAT(pthru_host) },
	{ "pthru_bad_aff",   VCPU_STAT(pthru_bad_aff) },
A
Alexander Graf 已提交
74 75 76
	{ NULL }
};

77 78 79 80 81 82 83 84 85 86 87
void kvmppc_unfixup_split_real(struct kvm_vcpu *vcpu)
{
	if (vcpu->arch.hflags & BOOK3S_HFLAG_SPLIT_HACK) {
		ulong pc = kvmppc_get_pc(vcpu);
		if ((pc & SPLIT_HACK_MASK) == SPLIT_HACK_OFFS)
			kvmppc_set_pc(vcpu, pc & ~SPLIT_HACK_MASK);
		vcpu->arch.hflags &= ~BOOK3S_HFLAG_SPLIT_HACK;
	}
}
EXPORT_SYMBOL_GPL(kvmppc_unfixup_split_real);

88 89
static inline unsigned long kvmppc_interrupt_offset(struct kvm_vcpu *vcpu)
{
90
	if (!is_kvmppc_hv_enabled(vcpu->kvm))
91 92 93 94 95 96 97
		return to_book3s(vcpu)->hior;
	return 0;
}

static inline void kvmppc_update_int_pending(struct kvm_vcpu *vcpu,
			unsigned long pending_now, unsigned long old_pending)
{
98
	if (is_kvmppc_hv_enabled(vcpu->kvm))
99 100
		return;
	if (pending_now)
101
		kvmppc_set_int_pending(vcpu, 1);
102
	else if (old_pending)
103
		kvmppc_set_int_pending(vcpu, 0);
104 105 106 107 108 109 110 111
}

static inline bool kvmppc_critical_section(struct kvm_vcpu *vcpu)
{
	ulong crit_raw;
	ulong crit_r1;
	bool crit;

112
	if (is_kvmppc_hv_enabled(vcpu->kvm))
113 114
		return false;

115
	crit_raw = kvmppc_get_critical(vcpu);
116 117 118
	crit_r1 = kvmppc_get_gpr(vcpu, 1);

	/* Truncate crit indicators in 32 bit mode */
119
	if (!(kvmppc_get_msr(vcpu) & MSR_SF)) {
120 121 122 123 124 125 126
		crit_raw &= 0xffffffff;
		crit_r1 &= 0xffffffff;
	}

	/* Critical section when crit == r1 */
	crit = (crit_raw == crit_r1);
	/* ... and we're in supervisor mode */
127
	crit = crit && !(kvmppc_get_msr(vcpu) & MSR_PR);
128 129 130 131

	return crit;
}

A
Alexander Graf 已提交
132 133
void kvmppc_inject_interrupt(struct kvm_vcpu *vcpu, int vec, u64 flags)
{
134
	kvmppc_unfixup_split_real(vcpu);
135
	kvmppc_set_srr0(vcpu, kvmppc_get_pc(vcpu));
136
	kvmppc_set_srr1(vcpu, (kvmppc_get_msr(vcpu) & ~0x783f0000ul) | flags);
137
	kvmppc_set_pc(vcpu, kvmppc_interrupt_offset(vcpu) + vec);
A
Alexander Graf 已提交
138 139 140
	vcpu->arch.mmu.reset_msr(vcpu);
}

141
static int kvmppc_book3s_vec2irqprio(unsigned int vec)
A
Alexander Graf 已提交
142 143 144 145 146 147 148 149 150 151 152
{
	unsigned int prio;

	switch (vec) {
	case 0x100: prio = BOOK3S_IRQPRIO_SYSTEM_RESET;		break;
	case 0x200: prio = BOOK3S_IRQPRIO_MACHINE_CHECK;	break;
	case 0x300: prio = BOOK3S_IRQPRIO_DATA_STORAGE;		break;
	case 0x380: prio = BOOK3S_IRQPRIO_DATA_SEGMENT;		break;
	case 0x400: prio = BOOK3S_IRQPRIO_INST_STORAGE;		break;
	case 0x480: prio = BOOK3S_IRQPRIO_INST_SEGMENT;		break;
	case 0x500: prio = BOOK3S_IRQPRIO_EXTERNAL;		break;
153
	case 0x501: prio = BOOK3S_IRQPRIO_EXTERNAL_LEVEL;	break;
A
Alexander Graf 已提交
154 155 156 157 158 159 160 161
	case 0x600: prio = BOOK3S_IRQPRIO_ALIGNMENT;		break;
	case 0x700: prio = BOOK3S_IRQPRIO_PROGRAM;		break;
	case 0x800: prio = BOOK3S_IRQPRIO_FP_UNAVAIL;		break;
	case 0x900: prio = BOOK3S_IRQPRIO_DECREMENTER;		break;
	case 0xc00: prio = BOOK3S_IRQPRIO_SYSCALL;		break;
	case 0xd00: prio = BOOK3S_IRQPRIO_DEBUG;		break;
	case 0xf20: prio = BOOK3S_IRQPRIO_ALTIVEC;		break;
	case 0xf40: prio = BOOK3S_IRQPRIO_VSX;			break;
162
	case 0xf60: prio = BOOK3S_IRQPRIO_FAC_UNAVAIL;		break;
A
Alexander Graf 已提交
163 164 165
	default:    prio = BOOK3S_IRQPRIO_MAX;			break;
	}

166 167 168
	return prio;
}

169
void kvmppc_book3s_dequeue_irqprio(struct kvm_vcpu *vcpu,
170 171
					  unsigned int vec)
{
172 173
	unsigned long old_pending = vcpu->arch.pending_exceptions;

174 175
	clear_bit(kvmppc_book3s_vec2irqprio(vec),
		  &vcpu->arch.pending_exceptions);
176

177 178
	kvmppc_update_int_pending(vcpu, vcpu->arch.pending_exceptions,
				  old_pending);
179 180
}

181 182 183 184 185 186
void kvmppc_book3s_queue_irqprio(struct kvm_vcpu *vcpu, unsigned int vec)
{
	vcpu->stat.queue_intr++;

	set_bit(kvmppc_book3s_vec2irqprio(vec),
		&vcpu->arch.pending_exceptions);
A
Alexander Graf 已提交
187 188 189 190
#ifdef EXIT_DEBUG
	printk(KERN_INFO "Queueing interrupt %x\n", vec);
#endif
}
191
EXPORT_SYMBOL_GPL(kvmppc_book3s_queue_irqprio);
A
Alexander Graf 已提交
192

193
void kvmppc_core_queue_program(struct kvm_vcpu *vcpu, ulong flags)
A
Alexander Graf 已提交
194
{
195 196
	/* might as well deliver this straight away */
	kvmppc_inject_interrupt(vcpu, BOOK3S_INTERRUPT_PROGRAM, flags);
A
Alexander Graf 已提交
197
}
198
EXPORT_SYMBOL_GPL(kvmppc_core_queue_program);
A
Alexander Graf 已提交
199

200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
void kvmppc_core_queue_fpunavail(struct kvm_vcpu *vcpu)
{
	/* might as well deliver this straight away */
	kvmppc_inject_interrupt(vcpu, BOOK3S_INTERRUPT_FP_UNAVAIL, 0);
}

void kvmppc_core_queue_vec_unavail(struct kvm_vcpu *vcpu)
{
	/* might as well deliver this straight away */
	kvmppc_inject_interrupt(vcpu, BOOK3S_INTERRUPT_ALTIVEC, 0);
}

void kvmppc_core_queue_vsx_unavail(struct kvm_vcpu *vcpu)
{
	/* might as well deliver this straight away */
	kvmppc_inject_interrupt(vcpu, BOOK3S_INTERRUPT_VSX, 0);
}

A
Alexander Graf 已提交
218 219 220 221
void kvmppc_core_queue_dec(struct kvm_vcpu *vcpu)
{
	kvmppc_book3s_queue_irqprio(vcpu, BOOK3S_INTERRUPT_DECREMENTER);
}
222
EXPORT_SYMBOL_GPL(kvmppc_core_queue_dec);
A
Alexander Graf 已提交
223 224 225

int kvmppc_core_pending_dec(struct kvm_vcpu *vcpu)
{
226
	return test_bit(BOOK3S_IRQPRIO_DECREMENTER, &vcpu->arch.pending_exceptions);
A
Alexander Graf 已提交
227
}
228
EXPORT_SYMBOL_GPL(kvmppc_core_pending_dec);
A
Alexander Graf 已提交
229

230 231 232 233
void kvmppc_core_dequeue_dec(struct kvm_vcpu *vcpu)
{
	kvmppc_book3s_dequeue_irqprio(vcpu, BOOK3S_INTERRUPT_DECREMENTER);
}
234
EXPORT_SYMBOL_GPL(kvmppc_core_dequeue_dec);
235

A
Alexander Graf 已提交
236 237 238
void kvmppc_core_queue_external(struct kvm_vcpu *vcpu,
                                struct kvm_interrupt *irq)
{
239 240 241 242 243 244
	unsigned int vec = BOOK3S_INTERRUPT_EXTERNAL;

	if (irq->irq == KVM_INTERRUPT_SET_LEVEL)
		vec = BOOK3S_INTERRUPT_EXTERNAL_LEVEL;

	kvmppc_book3s_queue_irqprio(vcpu, vec);
A
Alexander Graf 已提交
245 246
}

247
void kvmppc_core_dequeue_external(struct kvm_vcpu *vcpu)
248 249
{
	kvmppc_book3s_dequeue_irqprio(vcpu, BOOK3S_INTERRUPT_EXTERNAL);
250
	kvmppc_book3s_dequeue_irqprio(vcpu, BOOK3S_INTERRUPT_EXTERNAL_LEVEL);
251 252
}

253 254 255 256 257
void kvmppc_core_queue_data_storage(struct kvm_vcpu *vcpu, ulong dar,
				    ulong flags)
{
	kvmppc_set_dar(vcpu, dar);
	kvmppc_set_dsisr(vcpu, flags);
258
	kvmppc_inject_interrupt(vcpu, BOOK3S_INTERRUPT_DATA_STORAGE, 0);
259
}
260
EXPORT_SYMBOL_GPL(kvmppc_core_queue_data_storage);
261 262 263

void kvmppc_core_queue_inst_storage(struct kvm_vcpu *vcpu, ulong flags)
{
264
	kvmppc_inject_interrupt(vcpu, BOOK3S_INTERRUPT_INST_STORAGE, flags);
265
}
266
EXPORT_SYMBOL_GPL(kvmppc_core_queue_inst_storage);
267

T
Thomas Huth 已提交
268 269
static int kvmppc_book3s_irqprio_deliver(struct kvm_vcpu *vcpu,
					 unsigned int priority)
A
Alexander Graf 已提交
270 271 272
{
	int deliver = 1;
	int vec = 0;
273
	bool crit = kvmppc_critical_section(vcpu);
A
Alexander Graf 已提交
274 275 276

	switch (priority) {
	case BOOK3S_IRQPRIO_DECREMENTER:
277
		deliver = (kvmppc_get_msr(vcpu) & MSR_EE) && !crit;
A
Alexander Graf 已提交
278 279 280
		vec = BOOK3S_INTERRUPT_DECREMENTER;
		break;
	case BOOK3S_IRQPRIO_EXTERNAL:
281
	case BOOK3S_IRQPRIO_EXTERNAL_LEVEL:
282
		deliver = (kvmppc_get_msr(vcpu) & MSR_EE) && !crit;
A
Alexander Graf 已提交
283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326
		vec = BOOK3S_INTERRUPT_EXTERNAL;
		break;
	case BOOK3S_IRQPRIO_SYSTEM_RESET:
		vec = BOOK3S_INTERRUPT_SYSTEM_RESET;
		break;
	case BOOK3S_IRQPRIO_MACHINE_CHECK:
		vec = BOOK3S_INTERRUPT_MACHINE_CHECK;
		break;
	case BOOK3S_IRQPRIO_DATA_STORAGE:
		vec = BOOK3S_INTERRUPT_DATA_STORAGE;
		break;
	case BOOK3S_IRQPRIO_INST_STORAGE:
		vec = BOOK3S_INTERRUPT_INST_STORAGE;
		break;
	case BOOK3S_IRQPRIO_DATA_SEGMENT:
		vec = BOOK3S_INTERRUPT_DATA_SEGMENT;
		break;
	case BOOK3S_IRQPRIO_INST_SEGMENT:
		vec = BOOK3S_INTERRUPT_INST_SEGMENT;
		break;
	case BOOK3S_IRQPRIO_ALIGNMENT:
		vec = BOOK3S_INTERRUPT_ALIGNMENT;
		break;
	case BOOK3S_IRQPRIO_PROGRAM:
		vec = BOOK3S_INTERRUPT_PROGRAM;
		break;
	case BOOK3S_IRQPRIO_VSX:
		vec = BOOK3S_INTERRUPT_VSX;
		break;
	case BOOK3S_IRQPRIO_ALTIVEC:
		vec = BOOK3S_INTERRUPT_ALTIVEC;
		break;
	case BOOK3S_IRQPRIO_FP_UNAVAIL:
		vec = BOOK3S_INTERRUPT_FP_UNAVAIL;
		break;
	case BOOK3S_IRQPRIO_SYSCALL:
		vec = BOOK3S_INTERRUPT_SYSCALL;
		break;
	case BOOK3S_IRQPRIO_DEBUG:
		vec = BOOK3S_INTERRUPT_TRACE;
		break;
	case BOOK3S_IRQPRIO_PERFORMANCE_MONITOR:
		vec = BOOK3S_INTERRUPT_PERFMON;
		break;
327 328 329
	case BOOK3S_IRQPRIO_FAC_UNAVAIL:
		vec = BOOK3S_INTERRUPT_FAC_UNAVAIL;
		break;
A
Alexander Graf 已提交
330 331 332 333 334 335 336 337 338 339 340
	default:
		deliver = 0;
		printk(KERN_ERR "KVM: Unknown interrupt: 0x%x\n", priority);
		break;
	}

#if 0
	printk(KERN_INFO "Deliver interrupt 0x%x? %x\n", vec, deliver);
#endif

	if (deliver)
341
		kvmppc_inject_interrupt(vcpu, vec, 0);
A
Alexander Graf 已提交
342 343 344 345

	return deliver;
}

346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362
/*
 * This function determines if an irqprio should be cleared once issued.
 */
static bool clear_irqprio(struct kvm_vcpu *vcpu, unsigned int priority)
{
	switch (priority) {
		case BOOK3S_IRQPRIO_DECREMENTER:
			/* DEC interrupts get cleared by mtdec */
			return false;
		case BOOK3S_IRQPRIO_EXTERNAL_LEVEL:
			/* External interrupts get cleared by userspace */
			return false;
	}

	return true;
}

363
int kvmppc_core_prepare_to_enter(struct kvm_vcpu *vcpu)
A
Alexander Graf 已提交
364 365
{
	unsigned long *pending = &vcpu->arch.pending_exceptions;
366
	unsigned long old_pending = vcpu->arch.pending_exceptions;
A
Alexander Graf 已提交
367 368 369 370 371 372 373
	unsigned int priority;

#ifdef EXIT_DEBUG
	if (vcpu->arch.pending_exceptions)
		printk(KERN_EMERG "KVM: Check pending: %lx\n", vcpu->arch.pending_exceptions);
#endif
	priority = __ffs(*pending);
A
Alexander Graf 已提交
374
	while (priority < BOOK3S_IRQPRIO_MAX) {
375
		if (kvmppc_book3s_irqprio_deliver(vcpu, priority) &&
376
		    clear_irqprio(vcpu, priority)) {
A
Alexander Graf 已提交
377 378 379 380 381 382 383 384
			clear_bit(priority, &vcpu->arch.pending_exceptions);
			break;
		}

		priority = find_next_bit(pending,
					 BITS_PER_BYTE * sizeof(*pending),
					 priority + 1);
	}
385 386

	/* Tell the guest about our interrupt status */
387
	kvmppc_update_int_pending(vcpu, *pending, old_pending);
388 389

	return 0;
A
Alexander Graf 已提交
390
}
391
EXPORT_SYMBOL_GPL(kvmppc_core_prepare_to_enter);
A
Alexander Graf 已提交
392

D
Dan Williams 已提交
393
kvm_pfn_t kvmppc_gpa_to_pfn(struct kvm_vcpu *vcpu, gpa_t gpa, bool writing,
394
			bool *writable)
395
{
396 397
	ulong mp_pa = vcpu->arch.magic_page_pa & KVM_PAM;
	gfn_t gfn = gpa >> PAGE_SHIFT;
398

399
	if (!(kvmppc_get_msr(vcpu) & MSR_SF))
400 401
		mp_pa = (uint32_t)mp_pa;

402
	/* Magic page override */
403 404
	gpa &= ~0xFFFULL;
	if (unlikely(mp_pa) && unlikely((gpa & KVM_PAM) == mp_pa)) {
405
		ulong shared_page = ((ulong)vcpu->arch.shared) & PAGE_MASK;
D
Dan Williams 已提交
406
		kvm_pfn_t pfn;
407

D
Dan Williams 已提交
408
		pfn = (kvm_pfn_t)virt_to_phys((void*)shared_page) >> PAGE_SHIFT;
409
		get_page(pfn_to_page(pfn));
410 411
		if (writable)
			*writable = true;
412 413 414
		return pfn;
	}

415
	return gfn_to_pfn_prot(vcpu->kvm, gfn, writing, writable);
416
}
417
EXPORT_SYMBOL_GPL(kvmppc_gpa_to_pfn);
418

419 420
int kvmppc_xlate(struct kvm_vcpu *vcpu, ulong eaddr, enum xlate_instdata xlid,
		 enum xlate_readwrite xlrw, struct kvmppc_pte *pte)
A
Alexander Graf 已提交
421
{
422 423
	bool data = (xlid == XLATE_DATA);
	bool iswrite = (xlrw == XLATE_WRITE);
424
	int relocated = (kvmppc_get_msr(vcpu) & (data ? MSR_DR : MSR_IR));
A
Alexander Graf 已提交
425 426 427
	int r;

	if (relocated) {
428
		r = vcpu->arch.mmu.xlate(vcpu, eaddr, pte, data, iswrite);
A
Alexander Graf 已提交
429 430
	} else {
		pte->eaddr = eaddr;
A
Alexander Graf 已提交
431
		pte->raddr = eaddr & KVM_PAM;
432
		pte->vpage = VSID_REAL | eaddr >> 12;
A
Alexander Graf 已提交
433 434 435 436
		pte->may_read = true;
		pte->may_write = true;
		pte->may_execute = true;
		r = 0;
437 438 439 440 441 442 443

		if ((kvmppc_get_msr(vcpu) & (MSR_IR | MSR_DR)) == MSR_DR &&
		    !data) {
			if ((vcpu->arch.hflags & BOOK3S_HFLAG_SPLIT_HACK) &&
			    ((eaddr & SPLIT_HACK_MASK) == SPLIT_HACK_OFFS))
			pte->raddr &= ~SPLIT_HACK_MASK;
		}
A
Alexander Graf 已提交
444 445 446 447 448
	}

	return r;
}

449 450
int kvmppc_load_last_inst(struct kvm_vcpu *vcpu,
		enum instruction_fetch_type type, u32 *inst)
451 452 453 454 455 456 457 458 459 460 461 462 463 464 465
{
	ulong pc = kvmppc_get_pc(vcpu);
	int r;

	if (type == INST_SC)
		pc -= 4;

	r = kvmppc_ld(vcpu, &pc, sizeof(u32), inst, false);
	if (r == EMULATE_DONE)
		return r;
	else
		return EMULATE_AGAIN;
}
EXPORT_SYMBOL_GPL(kvmppc_load_last_inst);

A
Alexander Graf 已提交
466 467 468 469 470
int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
{
	return 0;
}

471 472 473 474 475 476 477 478 479
int kvmppc_subarch_vcpu_init(struct kvm_vcpu *vcpu)
{
	return 0;
}

void kvmppc_subarch_vcpu_uninit(struct kvm_vcpu *vcpu)
{
}

480 481 482
int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,
				  struct kvm_sregs *sregs)
{
483 484 485 486 487 488 489
	int ret;

	vcpu_load(vcpu);
	ret = vcpu->kvm->arch.kvm_ops->get_sregs(vcpu, sregs);
	vcpu_put(vcpu);

	return ret;
490 491 492 493 494
}

int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
				  struct kvm_sregs *sregs)
{
495 496 497 498 499 500 501
	int ret;

	vcpu_load(vcpu);
	ret = vcpu->kvm->arch.kvm_ops->set_sregs(vcpu, sregs);
	vcpu_put(vcpu);

	return ret;
502 503
}

A
Alexander Graf 已提交
504 505 506 507
int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
{
	int i;

508
	regs->pc = kvmppc_get_pc(vcpu);
509
	regs->cr = kvmppc_get_cr(vcpu);
510 511
	regs->ctr = kvmppc_get_ctr(vcpu);
	regs->lr = kvmppc_get_lr(vcpu);
512
	regs->xer = kvmppc_get_xer(vcpu);
513 514 515
	regs->msr = kvmppc_get_msr(vcpu);
	regs->srr0 = kvmppc_get_srr0(vcpu);
	regs->srr1 = kvmppc_get_srr1(vcpu);
A
Alexander Graf 已提交
516
	regs->pid = vcpu->arch.pid;
517 518 519 520 521 522 523 524
	regs->sprg0 = kvmppc_get_sprg0(vcpu);
	regs->sprg1 = kvmppc_get_sprg1(vcpu);
	regs->sprg2 = kvmppc_get_sprg2(vcpu);
	regs->sprg3 = kvmppc_get_sprg3(vcpu);
	regs->sprg4 = kvmppc_get_sprg4(vcpu);
	regs->sprg5 = kvmppc_get_sprg5(vcpu);
	regs->sprg6 = kvmppc_get_sprg6(vcpu);
	regs->sprg7 = kvmppc_get_sprg7(vcpu);
A
Alexander Graf 已提交
525 526

	for (i = 0; i < ARRAY_SIZE(regs->gpr); i++)
527
		regs->gpr[i] = kvmppc_get_gpr(vcpu, i);
A
Alexander Graf 已提交
528 529 530 531 532 533 534 535

	return 0;
}

int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
{
	int i;

536
	kvmppc_set_pc(vcpu, regs->pc);
537
	kvmppc_set_cr(vcpu, regs->cr);
538 539
	kvmppc_set_ctr(vcpu, regs->ctr);
	kvmppc_set_lr(vcpu, regs->lr);
540
	kvmppc_set_xer(vcpu, regs->xer);
A
Alexander Graf 已提交
541
	kvmppc_set_msr(vcpu, regs->msr);
542 543 544 545 546 547 548 549 550 551
	kvmppc_set_srr0(vcpu, regs->srr0);
	kvmppc_set_srr1(vcpu, regs->srr1);
	kvmppc_set_sprg0(vcpu, regs->sprg0);
	kvmppc_set_sprg1(vcpu, regs->sprg1);
	kvmppc_set_sprg2(vcpu, regs->sprg2);
	kvmppc_set_sprg3(vcpu, regs->sprg3);
	kvmppc_set_sprg4(vcpu, regs->sprg4);
	kvmppc_set_sprg5(vcpu, regs->sprg5);
	kvmppc_set_sprg6(vcpu, regs->sprg6);
	kvmppc_set_sprg7(vcpu, regs->sprg7);
A
Alexander Graf 已提交
552

553 554
	for (i = 0; i < ARRAY_SIZE(regs->gpr); i++)
		kvmppc_set_gpr(vcpu, i, regs->gpr[i]);
A
Alexander Graf 已提交
555 556 557 558 559 560 561 562 563 564 565 566 567 568

	return 0;
}

int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
{
	return -ENOTSUPP;
}

int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
{
	return -ENOTSUPP;
}

569 570
int kvmppc_get_one_reg(struct kvm_vcpu *vcpu, u64 id,
			union kvmppc_one_reg *val)
571
{
572
	int r = 0;
573
	long int i;
574

575
	r = vcpu->kvm->arch.kvm_ops->get_one_reg(vcpu, id, val);
576 577
	if (r == -EINVAL) {
		r = 0;
578
		switch (id) {
579
		case KVM_REG_PPC_DAR:
580
			*val = get_reg_val(id, kvmppc_get_dar(vcpu));
581 582
			break;
		case KVM_REG_PPC_DSISR:
583
			*val = get_reg_val(id, kvmppc_get_dsisr(vcpu));
584
			break;
585
		case KVM_REG_PPC_FPR0 ... KVM_REG_PPC_FPR31:
586 587
			i = id - KVM_REG_PPC_FPR0;
			*val = get_reg_val(id, VCPU_FPR(vcpu, i));
588 589
			break;
		case KVM_REG_PPC_FPSCR:
590
			*val = get_reg_val(id, vcpu->arch.fp.fpscr);
591
			break;
592 593 594
#ifdef CONFIG_VSX
		case KVM_REG_PPC_VSR0 ... KVM_REG_PPC_VSR31:
			if (cpu_has_feature(CPU_FTR_VSX)) {
595 596 597
				i = id - KVM_REG_PPC_VSR0;
				val->vsxval[0] = vcpu->arch.fp.fpr[i][0];
				val->vsxval[1] = vcpu->arch.fp.fpr[i][1];
598 599 600 601 602
			} else {
				r = -ENXIO;
			}
			break;
#endif /* CONFIG_VSX */
603 604
		case KVM_REG_PPC_DEBUG_INST:
			*val = get_reg_val(id, INS_TW);
605
			break;
606 607
#ifdef CONFIG_KVM_XICS
		case KVM_REG_PPC_ICP_STATE:
608
			if (!vcpu->arch.icp && !vcpu->arch.xive_vcpu) {
609 610 611
				r = -ENXIO;
				break;
			}
612 613 614 615
			if (xive_enabled())
				*val = get_reg_val(id, kvmppc_xive_get_icp(vcpu));
			else
				*val = get_reg_val(id, kvmppc_xics_get_icp(vcpu));
616 617
			break;
#endif /* CONFIG_KVM_XICS */
618
		case KVM_REG_PPC_FSCR:
619
			*val = get_reg_val(id, vcpu->arch.fscr);
620
			break;
621
		case KVM_REG_PPC_TAR:
622
			*val = get_reg_val(id, vcpu->arch.tar);
623
			break;
624
		case KVM_REG_PPC_EBBHR:
625
			*val = get_reg_val(id, vcpu->arch.ebbhr);
626 627
			break;
		case KVM_REG_PPC_EBBRR:
628
			*val = get_reg_val(id, vcpu->arch.ebbrr);
629 630
			break;
		case KVM_REG_PPC_BESCR:
631
			*val = get_reg_val(id, vcpu->arch.bescr);
632
			break;
633
		case KVM_REG_PPC_IC:
634
			*val = get_reg_val(id, vcpu->arch.ic);
635
			break;
636 637 638 639 640 641 642 643 644
		default:
			r = -EINVAL;
			break;
		}
	}

	return r;
}

645 646
int kvmppc_set_one_reg(struct kvm_vcpu *vcpu, u64 id,
			union kvmppc_one_reg *val)
647
{
648
	int r = 0;
649
	long int i;
650

651
	r = vcpu->kvm->arch.kvm_ops->set_one_reg(vcpu, id, val);
652 653
	if (r == -EINVAL) {
		r = 0;
654
		switch (id) {
655
		case KVM_REG_PPC_DAR:
656
			kvmppc_set_dar(vcpu, set_reg_val(id, *val));
657 658
			break;
		case KVM_REG_PPC_DSISR:
659
			kvmppc_set_dsisr(vcpu, set_reg_val(id, *val));
660
			break;
661
		case KVM_REG_PPC_FPR0 ... KVM_REG_PPC_FPR31:
662 663
			i = id - KVM_REG_PPC_FPR0;
			VCPU_FPR(vcpu, i) = set_reg_val(id, *val);
664 665
			break;
		case KVM_REG_PPC_FPSCR:
666
			vcpu->arch.fp.fpscr = set_reg_val(id, *val);
667
			break;
668 669 670
#ifdef CONFIG_VSX
		case KVM_REG_PPC_VSR0 ... KVM_REG_PPC_VSR31:
			if (cpu_has_feature(CPU_FTR_VSX)) {
671 672 673
				i = id - KVM_REG_PPC_VSR0;
				vcpu->arch.fp.fpr[i][0] = val->vsxval[0];
				vcpu->arch.fp.fpr[i][1] = val->vsxval[1];
674 675 676 677 678
			} else {
				r = -ENXIO;
			}
			break;
#endif /* CONFIG_VSX */
679 680
#ifdef CONFIG_KVM_XICS
		case KVM_REG_PPC_ICP_STATE:
681
			if (!vcpu->arch.icp && !vcpu->arch.xive_vcpu) {
682 683 684
				r = -ENXIO;
				break;
			}
685 686 687 688
			if (xive_enabled())
				r = kvmppc_xive_set_icp(vcpu, set_reg_val(id, *val));
			else
				r = kvmppc_xics_set_icp(vcpu, set_reg_val(id, *val));
689 690
			break;
#endif /* CONFIG_KVM_XICS */
691
		case KVM_REG_PPC_FSCR:
692
			vcpu->arch.fscr = set_reg_val(id, *val);
693
			break;
694
		case KVM_REG_PPC_TAR:
695
			vcpu->arch.tar = set_reg_val(id, *val);
696
			break;
697
		case KVM_REG_PPC_EBBHR:
698
			vcpu->arch.ebbhr = set_reg_val(id, *val);
699 700
			break;
		case KVM_REG_PPC_EBBRR:
701
			vcpu->arch.ebbrr = set_reg_val(id, *val);
702 703
			break;
		case KVM_REG_PPC_BESCR:
704
			vcpu->arch.bescr = set_reg_val(id, *val);
705
			break;
706
		case KVM_REG_PPC_IC:
707
			vcpu->arch.ic = set_reg_val(id, *val);
708
			break;
709 710 711 712 713 714 715 716 717
		default:
			r = -EINVAL;
			break;
		}
	}

	return r;
}

718 719
void kvmppc_core_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
{
720
	vcpu->kvm->arch.kvm_ops->vcpu_load(vcpu, cpu);
721 722 723 724
}

void kvmppc_core_vcpu_put(struct kvm_vcpu *vcpu)
{
725
	vcpu->kvm->arch.kvm_ops->vcpu_put(vcpu);
726 727 728 729
}

void kvmppc_set_msr(struct kvm_vcpu *vcpu, u64 msr)
{
730
	vcpu->kvm->arch.kvm_ops->set_msr(vcpu, msr);
731
}
732
EXPORT_SYMBOL_GPL(kvmppc_set_msr);
733 734 735

int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
{
736
	return vcpu->kvm->arch.kvm_ops->vcpu_run(kvm_run, vcpu);
737 738
}

A
Alexander Graf 已提交
739 740 741 742 743 744
int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu,
                                  struct kvm_translation *tr)
{
	return 0;
}

745 746 747
int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
					struct kvm_guest_debug *dbg)
{
748
	vcpu_load(vcpu);
749
	vcpu->guest_debug = dbg->control;
750
	vcpu_put(vcpu);
751
	return 0;
752 753
}

754
void kvmppc_decrementer_func(struct kvm_vcpu *vcpu)
755 756 757 758
{
	kvmppc_core_queue_dec(vcpu);
	kvm_vcpu_kick(vcpu);
}
759 760 761

struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm, unsigned int id)
{
762
	return kvm->arch.kvm_ops->vcpu_create(kvm, id);
763 764 765 766
}

void kvmppc_core_vcpu_free(struct kvm_vcpu *vcpu)
{
767
	vcpu->kvm->arch.kvm_ops->vcpu_free(vcpu);
768 769 770 771
}

int kvmppc_core_check_requests(struct kvm_vcpu *vcpu)
{
772
	return vcpu->kvm->arch.kvm_ops->check_requests(vcpu);
773 774 775 776
}

int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, struct kvm_dirty_log *log)
{
777
	return kvm->arch.kvm_ops->get_dirty_log(kvm, log);
778 779
}

780
void kvmppc_core_free_memslot(struct kvm *kvm, struct kvm_memory_slot *free,
781 782
			      struct kvm_memory_slot *dont)
{
783
	kvm->arch.kvm_ops->free_memslot(free, dont);
784 785
}

786
int kvmppc_core_create_memslot(struct kvm *kvm, struct kvm_memory_slot *slot,
787 788
			       unsigned long npages)
{
789
	return kvm->arch.kvm_ops->create_memslot(slot, npages);
790 791 792 793
}

void kvmppc_core_flush_memslot(struct kvm *kvm, struct kvm_memory_slot *memslot)
{
794
	kvm->arch.kvm_ops->flush_memslot(kvm, memslot);
795 796 797 798
}

int kvmppc_core_prepare_memory_region(struct kvm *kvm,
				struct kvm_memory_slot *memslot,
799
				const struct kvm_userspace_memory_region *mem)
800
{
801
	return kvm->arch.kvm_ops->prepare_memory_region(kvm, memslot, mem);
802 803 804
}

void kvmppc_core_commit_memory_region(struct kvm *kvm,
805
				const struct kvm_userspace_memory_region *mem,
806 807
				const struct kvm_memory_slot *old,
				const struct kvm_memory_slot *new)
808
{
809
	kvm->arch.kvm_ops->commit_memory_region(kvm, mem, old, new);
810 811 812 813
}

int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end)
{
814
	return kvm->arch.kvm_ops->unmap_hva_range(kvm, start, end);
815 816
}

A
Andres Lagar-Cavilla 已提交
817
int kvm_age_hva(struct kvm *kvm, unsigned long start, unsigned long end)
818
{
A
Andres Lagar-Cavilla 已提交
819
	return kvm->arch.kvm_ops->age_hva(kvm, start, end);
820 821 822 823
}

int kvm_test_age_hva(struct kvm *kvm, unsigned long hva)
{
824
	return kvm->arch.kvm_ops->test_age_hva(kvm, hva);
825 826 827 828
}

void kvm_set_spte_hva(struct kvm *kvm, unsigned long hva, pte_t pte)
{
829
	kvm->arch.kvm_ops->set_spte_hva(kvm, hva, pte);
830 831 832 833
}

void kvmppc_mmu_destroy(struct kvm_vcpu *vcpu)
{
834
	vcpu->kvm->arch.kvm_ops->mmu_destroy(vcpu);
835 836 837 838 839 840
}

int kvmppc_core_init_vm(struct kvm *kvm)
{

#ifdef CONFIG_PPC64
841
	INIT_LIST_HEAD_RCU(&kvm->arch.spapr_tce_tables);
842 843 844
	INIT_LIST_HEAD(&kvm->arch.rtas_tokens);
#endif

845
	return kvm->arch.kvm_ops->init_vm(kvm);
846 847 848 849
}

void kvmppc_core_destroy_vm(struct kvm *kvm)
{
850
	kvm->arch.kvm_ops->destroy_vm(kvm);
851 852 853 854 855 856 857

#ifdef CONFIG_PPC64
	kvmppc_rtas_tokens_free(kvm);
	WARN_ON(!list_empty(&kvm->arch.spapr_tce_tables));
#endif
}

858 859 860 861 862
int kvmppc_h_logical_ci_load(struct kvm_vcpu *vcpu)
{
	unsigned long size = kvmppc_get_gpr(vcpu, 4);
	unsigned long addr = kvmppc_get_gpr(vcpu, 5);
	u64 buf;
863
	int srcu_idx;
864 865 866 867 868
	int ret;

	if (!is_power_of_2(size) || (size > sizeof(buf)))
		return H_TOO_HARD;

869
	srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
870
	ret = kvm_io_bus_read(vcpu, KVM_MMIO_BUS, addr, size, &buf);
871
	srcu_read_unlock(&vcpu->kvm->srcu, srcu_idx);
872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905
	if (ret != 0)
		return H_TOO_HARD;

	switch (size) {
	case 1:
		kvmppc_set_gpr(vcpu, 4, *(u8 *)&buf);
		break;

	case 2:
		kvmppc_set_gpr(vcpu, 4, be16_to_cpu(*(__be16 *)&buf));
		break;

	case 4:
		kvmppc_set_gpr(vcpu, 4, be32_to_cpu(*(__be32 *)&buf));
		break;

	case 8:
		kvmppc_set_gpr(vcpu, 4, be64_to_cpu(*(__be64 *)&buf));
		break;

	default:
		BUG();
	}

	return H_SUCCESS;
}
EXPORT_SYMBOL_GPL(kvmppc_h_logical_ci_load);

int kvmppc_h_logical_ci_store(struct kvm_vcpu *vcpu)
{
	unsigned long size = kvmppc_get_gpr(vcpu, 4);
	unsigned long addr = kvmppc_get_gpr(vcpu, 5);
	unsigned long val = kvmppc_get_gpr(vcpu, 6);
	u64 buf;
906
	int srcu_idx;
907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929
	int ret;

	switch (size) {
	case 1:
		*(u8 *)&buf = val;
		break;

	case 2:
		*(__be16 *)&buf = cpu_to_be16(val);
		break;

	case 4:
		*(__be32 *)&buf = cpu_to_be32(val);
		break;

	case 8:
		*(__be64 *)&buf = cpu_to_be64(val);
		break;

	default:
		return H_TOO_HARD;
	}

930
	srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
931
	ret = kvm_io_bus_write(vcpu, KVM_MMIO_BUS, addr, size, &buf);
932
	srcu_read_unlock(&vcpu->kvm->srcu, srcu_idx);
933 934 935 936 937 938 939
	if (ret != 0)
		return H_TOO_HARD;

	return H_SUCCESS;
}
EXPORT_SYMBOL_GPL(kvmppc_h_logical_ci_store);

940 941
int kvmppc_core_check_processor_compat(void)
{
942 943
	/*
	 * We always return 0 for book3s. We check
944
	 * for compatibility while loading the HV
945 946 947 948 949
	 * or PR module
	 */
	return 0;
}

950 951 952 953 954
int kvmppc_book3s_hcall_implemented(struct kvm *kvm, unsigned long hcall)
{
	return kvm->arch.kvm_ops->hcall_implemented(hcall);
}

955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998
#ifdef CONFIG_KVM_XICS
int kvm_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level,
		bool line_status)
{
	if (xive_enabled())
		return kvmppc_xive_set_irq(kvm, irq_source_id, irq, level,
					   line_status);
	else
		return kvmppc_xics_set_irq(kvm, irq_source_id, irq, level,
					   line_status);
}

int kvm_arch_set_irq_inatomic(struct kvm_kernel_irq_routing_entry *irq_entry,
			      struct kvm *kvm, int irq_source_id,
			      int level, bool line_status)
{
	return kvm_set_irq(kvm, irq_source_id, irq_entry->gsi,
			   level, line_status);
}
static int kvmppc_book3s_set_irq(struct kvm_kernel_irq_routing_entry *e,
				 struct kvm *kvm, int irq_source_id, int level,
				 bool line_status)
{
	return kvm_set_irq(kvm, irq_source_id, e->gsi, level, line_status);
}

int kvm_irq_map_gsi(struct kvm *kvm,
		    struct kvm_kernel_irq_routing_entry *entries, int gsi)
{
	entries->gsi = gsi;
	entries->type = KVM_IRQ_ROUTING_IRQCHIP;
	entries->set = kvmppc_book3s_set_irq;
	entries->irqchip.irqchip = 0;
	entries->irqchip.pin = gsi;
	return 1;
}

int kvm_irq_map_chip_pin(struct kvm *kvm, unsigned irqchip, unsigned pin)
{
	return pin;
}

#endif /* CONFIG_KVM_XICS */

999 1000 1001 1002 1003 1004 1005
static int kvmppc_book3s_init(void)
{
	int r;

	r = kvm_init(NULL, sizeof(struct kvm_vcpu), 0, THIS_MODULE);
	if (r)
		return r;
1006
#ifdef CONFIG_KVM_BOOK3S_32_HANDLER
1007 1008 1009
	r = kvmppc_book3s_init_pr();
#endif

1010 1011 1012 1013 1014 1015 1016 1017 1018 1019
#ifdef CONFIG_KVM_XICS
#ifdef CONFIG_KVM_XIVE
	if (xive_enabled()) {
		kvmppc_xive_init_module();
		kvm_register_device_ops(&kvm_xive_ops, KVM_DEV_TYPE_XICS);
	} else
#endif
		kvm_register_device_ops(&kvm_xics_ops, KVM_DEV_TYPE_XICS);
#endif
	return r;
1020 1021 1022 1023
}

static void kvmppc_book3s_exit(void)
{
1024 1025 1026 1027
#ifdef CONFIG_KVM_XICS
	if (xive_enabled())
		kvmppc_xive_exit_module();
#endif
1028
#ifdef CONFIG_KVM_BOOK3S_32_HANDLER
1029 1030 1031
	kvmppc_book3s_exit_pr();
#endif
	kvm_exit();
1032
}
1033 1034 1035

module_init(kvmppc_book3s_init);
module_exit(kvmppc_book3s_exit);
1036 1037

/* On 32bit this is our one and only kernel module */
1038
#ifdef CONFIG_KVM_BOOK3S_32_HANDLER
1039 1040 1041
MODULE_ALIAS_MISCDEV(KVM_MINOR);
MODULE_ALIAS("devname:kvm");
#endif