book3s.c 23.0 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>
A
Alexander Graf 已提交
23 24 25 26 27 28 29 30 31 32

#include <asm/reg.h>
#include <asm/cputable.h>
#include <asm/cacheflush.h>
#include <asm/tlbflush.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <asm/kvm_ppc.h>
#include <asm/kvm_book3s.h>
#include <asm/mmu_context.h>
33
#include <asm/page.h>
34
#include <linux/gfp.h>
A
Alexander Graf 已提交
35 36
#include <linux/sched.h>
#include <linux/vmalloc.h>
A
Alexander Graf 已提交
37
#include <linux/highmem.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
	{ "halt_successful_poll", VCPU_STAT(halt_successful_poll), },
A
Alexander Graf 已提交
56 57 58 59 60 61 62 63 64 65 66 67
	{ "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) },
	{ NULL }
};

68 69 70 71 72 73 74 75 76 77 78
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);

79 80
static inline unsigned long kvmppc_interrupt_offset(struct kvm_vcpu *vcpu)
{
81
	if (!is_kvmppc_hv_enabled(vcpu->kvm))
82 83 84 85 86 87 88
		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)
{
89
	if (is_kvmppc_hv_enabled(vcpu->kvm))
90 91
		return;
	if (pending_now)
92
		kvmppc_set_int_pending(vcpu, 1);
93
	else if (old_pending)
94
		kvmppc_set_int_pending(vcpu, 0);
95 96 97 98 99 100 101 102
}

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

103
	if (is_kvmppc_hv_enabled(vcpu->kvm))
104 105
		return false;

106
	crit_raw = kvmppc_get_critical(vcpu);
107 108 109
	crit_r1 = kvmppc_get_gpr(vcpu, 1);

	/* Truncate crit indicators in 32 bit mode */
110
	if (!(kvmppc_get_msr(vcpu) & MSR_SF)) {
111 112 113 114 115 116 117
		crit_raw &= 0xffffffff;
		crit_r1 &= 0xffffffff;
	}

	/* Critical section when crit == r1 */
	crit = (crit_raw == crit_r1);
	/* ... and we're in supervisor mode */
118
	crit = crit && !(kvmppc_get_msr(vcpu) & MSR_PR);
119 120 121 122

	return crit;
}

A
Alexander Graf 已提交
123 124
void kvmppc_inject_interrupt(struct kvm_vcpu *vcpu, int vec, u64 flags)
{
125
	kvmppc_unfixup_split_real(vcpu);
126 127
	kvmppc_set_srr0(vcpu, kvmppc_get_pc(vcpu));
	kvmppc_set_srr1(vcpu, kvmppc_get_msr(vcpu) | flags);
128
	kvmppc_set_pc(vcpu, kvmppc_interrupt_offset(vcpu) + vec);
A
Alexander Graf 已提交
129 130 131
	vcpu->arch.mmu.reset_msr(vcpu);
}

132
static int kvmppc_book3s_vec2irqprio(unsigned int vec)
A
Alexander Graf 已提交
133 134 135 136 137 138 139 140 141 142 143
{
	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;
144
	case 0x501: prio = BOOK3S_IRQPRIO_EXTERNAL_LEVEL;	break;
A
Alexander Graf 已提交
145 146 147 148 149 150 151 152
	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;
153
	case 0xf60: prio = BOOK3S_IRQPRIO_FAC_UNAVAIL;		break;
A
Alexander Graf 已提交
154 155 156
	default:    prio = BOOK3S_IRQPRIO_MAX;			break;
	}

157 158 159
	return prio;
}

160
void kvmppc_book3s_dequeue_irqprio(struct kvm_vcpu *vcpu,
161 162
					  unsigned int vec)
{
163 164
	unsigned long old_pending = vcpu->arch.pending_exceptions;

165 166
	clear_bit(kvmppc_book3s_vec2irqprio(vec),
		  &vcpu->arch.pending_exceptions);
167

168 169
	kvmppc_update_int_pending(vcpu, vcpu->arch.pending_exceptions,
				  old_pending);
170 171
}

172 173 174 175 176 177
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 已提交
178 179 180 181
#ifdef EXIT_DEBUG
	printk(KERN_INFO "Queueing interrupt %x\n", vec);
#endif
}
182
EXPORT_SYMBOL_GPL(kvmppc_book3s_queue_irqprio);
A
Alexander Graf 已提交
183

184
void kvmppc_core_queue_program(struct kvm_vcpu *vcpu, ulong flags)
A
Alexander Graf 已提交
185
{
186 187
	/* might as well deliver this straight away */
	kvmppc_inject_interrupt(vcpu, BOOK3S_INTERRUPT_PROGRAM, flags);
A
Alexander Graf 已提交
188
}
189
EXPORT_SYMBOL_GPL(kvmppc_core_queue_program);
A
Alexander Graf 已提交
190 191 192 193 194

void kvmppc_core_queue_dec(struct kvm_vcpu *vcpu)
{
	kvmppc_book3s_queue_irqprio(vcpu, BOOK3S_INTERRUPT_DECREMENTER);
}
195
EXPORT_SYMBOL_GPL(kvmppc_core_queue_dec);
A
Alexander Graf 已提交
196 197 198

int kvmppc_core_pending_dec(struct kvm_vcpu *vcpu)
{
199
	return test_bit(BOOK3S_IRQPRIO_DECREMENTER, &vcpu->arch.pending_exceptions);
A
Alexander Graf 已提交
200
}
201
EXPORT_SYMBOL_GPL(kvmppc_core_pending_dec);
A
Alexander Graf 已提交
202

203 204 205 206
void kvmppc_core_dequeue_dec(struct kvm_vcpu *vcpu)
{
	kvmppc_book3s_dequeue_irqprio(vcpu, BOOK3S_INTERRUPT_DECREMENTER);
}
207
EXPORT_SYMBOL_GPL(kvmppc_core_dequeue_dec);
208

A
Alexander Graf 已提交
209 210 211
void kvmppc_core_queue_external(struct kvm_vcpu *vcpu,
                                struct kvm_interrupt *irq)
{
212 213 214 215 216 217
	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 已提交
218 219
}

220
void kvmppc_core_dequeue_external(struct kvm_vcpu *vcpu)
221 222
{
	kvmppc_book3s_dequeue_irqprio(vcpu, BOOK3S_INTERRUPT_EXTERNAL);
223
	kvmppc_book3s_dequeue_irqprio(vcpu, BOOK3S_INTERRUPT_EXTERNAL_LEVEL);
224 225
}

226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242
void kvmppc_core_queue_data_storage(struct kvm_vcpu *vcpu, ulong dar,
				    ulong flags)
{
	kvmppc_set_dar(vcpu, dar);
	kvmppc_set_dsisr(vcpu, flags);
	kvmppc_book3s_queue_irqprio(vcpu, BOOK3S_INTERRUPT_DATA_STORAGE);
}

void kvmppc_core_queue_inst_storage(struct kvm_vcpu *vcpu, ulong flags)
{
	u64 msr = kvmppc_get_msr(vcpu);
	msr &= ~(SRR1_ISI_NOPT | SRR1_ISI_N_OR_G | SRR1_ISI_PROT);
	msr |= flags & (SRR1_ISI_NOPT | SRR1_ISI_N_OR_G | SRR1_ISI_PROT);
	kvmppc_set_msr_fast(vcpu, msr);
	kvmppc_book3s_queue_irqprio(vcpu, BOOK3S_INTERRUPT_INST_STORAGE);
}

A
Alexander Graf 已提交
243 244 245 246
int kvmppc_book3s_irqprio_deliver(struct kvm_vcpu *vcpu, unsigned int priority)
{
	int deliver = 1;
	int vec = 0;
247
	bool crit = kvmppc_critical_section(vcpu);
A
Alexander Graf 已提交
248 249 250

	switch (priority) {
	case BOOK3S_IRQPRIO_DECREMENTER:
251
		deliver = (kvmppc_get_msr(vcpu) & MSR_EE) && !crit;
A
Alexander Graf 已提交
252 253 254
		vec = BOOK3S_INTERRUPT_DECREMENTER;
		break;
	case BOOK3S_IRQPRIO_EXTERNAL:
255
	case BOOK3S_IRQPRIO_EXTERNAL_LEVEL:
256
		deliver = (kvmppc_get_msr(vcpu) & MSR_EE) && !crit;
A
Alexander Graf 已提交
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 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300
		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;
301 302 303
	case BOOK3S_IRQPRIO_FAC_UNAVAIL:
		vec = BOOK3S_INTERRUPT_FAC_UNAVAIL;
		break;
A
Alexander Graf 已提交
304 305 306 307 308 309 310 311 312 313 314
	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)
315
		kvmppc_inject_interrupt(vcpu, vec, 0);
A
Alexander Graf 已提交
316 317 318 319

	return deliver;
}

320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336
/*
 * 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;
}

337
int kvmppc_core_prepare_to_enter(struct kvm_vcpu *vcpu)
A
Alexander Graf 已提交
338 339
{
	unsigned long *pending = &vcpu->arch.pending_exceptions;
340
	unsigned long old_pending = vcpu->arch.pending_exceptions;
A
Alexander Graf 已提交
341 342 343 344 345 346 347
	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 已提交
348
	while (priority < BOOK3S_IRQPRIO_MAX) {
349
		if (kvmppc_book3s_irqprio_deliver(vcpu, priority) &&
350
		    clear_irqprio(vcpu, priority)) {
A
Alexander Graf 已提交
351 352 353 354 355 356 357 358
			clear_bit(priority, &vcpu->arch.pending_exceptions);
			break;
		}

		priority = find_next_bit(pending,
					 BITS_PER_BYTE * sizeof(*pending),
					 priority + 1);
	}
359 360

	/* Tell the guest about our interrupt status */
361
	kvmppc_update_int_pending(vcpu, *pending, old_pending);
362 363

	return 0;
A
Alexander Graf 已提交
364
}
365
EXPORT_SYMBOL_GPL(kvmppc_core_prepare_to_enter);
A
Alexander Graf 已提交
366

367
pfn_t kvmppc_gpa_to_pfn(struct kvm_vcpu *vcpu, gpa_t gpa, bool writing,
368
			bool *writable)
369
{
370 371
	ulong mp_pa = vcpu->arch.magic_page_pa & KVM_PAM;
	gfn_t gfn = gpa >> PAGE_SHIFT;
372

373
	if (!(kvmppc_get_msr(vcpu) & MSR_SF))
374 375
		mp_pa = (uint32_t)mp_pa;

376
	/* Magic page override */
377 378
	gpa &= ~0xFFFULL;
	if (unlikely(mp_pa) && unlikely((gpa & KVM_PAM) == mp_pa)) {
379 380 381 382 383
		ulong shared_page = ((ulong)vcpu->arch.shared) & PAGE_MASK;
		pfn_t pfn;

		pfn = (pfn_t)virt_to_phys((void*)shared_page) >> PAGE_SHIFT;
		get_page(pfn_to_page(pfn));
384 385
		if (writable)
			*writable = true;
386 387 388
		return pfn;
	}

389
	return gfn_to_pfn_prot(vcpu->kvm, gfn, writing, writable);
390
}
391
EXPORT_SYMBOL_GPL(kvmppc_gpa_to_pfn);
392

393 394
int kvmppc_xlate(struct kvm_vcpu *vcpu, ulong eaddr, enum xlate_instdata xlid,
		 enum xlate_readwrite xlrw, struct kvmppc_pte *pte)
A
Alexander Graf 已提交
395
{
396 397
	bool data = (xlid == XLATE_DATA);
	bool iswrite = (xlrw == XLATE_WRITE);
398
	int relocated = (kvmppc_get_msr(vcpu) & (data ? MSR_DR : MSR_IR));
A
Alexander Graf 已提交
399 400 401
	int r;

	if (relocated) {
402
		r = vcpu->arch.mmu.xlate(vcpu, eaddr, pte, data, iswrite);
A
Alexander Graf 已提交
403 404
	} else {
		pte->eaddr = eaddr;
A
Alexander Graf 已提交
405
		pte->raddr = eaddr & KVM_PAM;
406
		pte->vpage = VSID_REAL | eaddr >> 12;
A
Alexander Graf 已提交
407 408 409 410
		pte->may_read = true;
		pte->may_write = true;
		pte->may_execute = true;
		r = 0;
411 412 413 414 415 416 417

		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 已提交
418 419 420 421 422
	}

	return r;
}

423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439
int kvmppc_load_last_inst(struct kvm_vcpu *vcpu, enum instruction_type type,
					 u32 *inst)
{
	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 已提交
440 441 442 443 444
int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
{
	return 0;
}

445 446 447 448 449 450 451 452 453
int kvmppc_subarch_vcpu_init(struct kvm_vcpu *vcpu)
{
	return 0;
}

void kvmppc_subarch_vcpu_uninit(struct kvm_vcpu *vcpu)
{
}

454 455 456
int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,
				  struct kvm_sregs *sregs)
{
457
	return vcpu->kvm->arch.kvm_ops->get_sregs(vcpu, sregs);
458 459 460 461 462
}

int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
				  struct kvm_sregs *sregs)
{
463
	return vcpu->kvm->arch.kvm_ops->set_sregs(vcpu, sregs);
464 465
}

A
Alexander Graf 已提交
466 467 468 469
int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
{
	int i;

470
	regs->pc = kvmppc_get_pc(vcpu);
471
	regs->cr = kvmppc_get_cr(vcpu);
472 473
	regs->ctr = kvmppc_get_ctr(vcpu);
	regs->lr = kvmppc_get_lr(vcpu);
474
	regs->xer = kvmppc_get_xer(vcpu);
475 476 477
	regs->msr = kvmppc_get_msr(vcpu);
	regs->srr0 = kvmppc_get_srr0(vcpu);
	regs->srr1 = kvmppc_get_srr1(vcpu);
A
Alexander Graf 已提交
478
	regs->pid = vcpu->arch.pid;
479 480 481 482 483 484 485 486
	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 已提交
487 488

	for (i = 0; i < ARRAY_SIZE(regs->gpr); i++)
489
		regs->gpr[i] = kvmppc_get_gpr(vcpu, i);
A
Alexander Graf 已提交
490 491 492 493 494 495 496 497

	return 0;
}

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

498
	kvmppc_set_pc(vcpu, regs->pc);
499
	kvmppc_set_cr(vcpu, regs->cr);
500 501
	kvmppc_set_ctr(vcpu, regs->ctr);
	kvmppc_set_lr(vcpu, regs->lr);
502
	kvmppc_set_xer(vcpu, regs->xer);
A
Alexander Graf 已提交
503
	kvmppc_set_msr(vcpu, regs->msr);
504 505 506 507 508 509 510 511 512 513
	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 已提交
514

515 516
	for (i = 0; i < ARRAY_SIZE(regs->gpr); i++)
		kvmppc_set_gpr(vcpu, i, regs->gpr[i]);
A
Alexander Graf 已提交
517 518 519 520 521 522 523 524 525 526 527 528 529 530

	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;
}

531 532
int kvmppc_get_one_reg(struct kvm_vcpu *vcpu, u64 id,
			union kvmppc_one_reg *val)
533
{
534
	int r = 0;
535
	long int i;
536

537
	r = vcpu->kvm->arch.kvm_ops->get_one_reg(vcpu, id, val);
538 539
	if (r == -EINVAL) {
		r = 0;
540
		switch (id) {
541
		case KVM_REG_PPC_DAR:
542
			*val = get_reg_val(id, kvmppc_get_dar(vcpu));
543 544
			break;
		case KVM_REG_PPC_DSISR:
545
			*val = get_reg_val(id, kvmppc_get_dsisr(vcpu));
546
			break;
547
		case KVM_REG_PPC_FPR0 ... KVM_REG_PPC_FPR31:
548 549
			i = id - KVM_REG_PPC_FPR0;
			*val = get_reg_val(id, VCPU_FPR(vcpu, i));
550 551
			break;
		case KVM_REG_PPC_FPSCR:
552
			*val = get_reg_val(id, vcpu->arch.fp.fpscr);
553
			break;
554 555 556
#ifdef CONFIG_VSX
		case KVM_REG_PPC_VSR0 ... KVM_REG_PPC_VSR31:
			if (cpu_has_feature(CPU_FTR_VSX)) {
557 558 559
				i = id - KVM_REG_PPC_VSR0;
				val->vsxval[0] = vcpu->arch.fp.fpr[i][0];
				val->vsxval[1] = vcpu->arch.fp.fpr[i][1];
560 561 562 563 564
			} else {
				r = -ENXIO;
			}
			break;
#endif /* CONFIG_VSX */
565 566
		case KVM_REG_PPC_DEBUG_INST:
			*val = get_reg_val(id, INS_TW);
567
			break;
568 569 570 571 572 573
#ifdef CONFIG_KVM_XICS
		case KVM_REG_PPC_ICP_STATE:
			if (!vcpu->arch.icp) {
				r = -ENXIO;
				break;
			}
574
			*val = get_reg_val(id, kvmppc_xics_get_icp(vcpu));
575 576
			break;
#endif /* CONFIG_KVM_XICS */
577
		case KVM_REG_PPC_FSCR:
578
			*val = get_reg_val(id, vcpu->arch.fscr);
579
			break;
580
		case KVM_REG_PPC_TAR:
581
			*val = get_reg_val(id, vcpu->arch.tar);
582
			break;
583
		case KVM_REG_PPC_EBBHR:
584
			*val = get_reg_val(id, vcpu->arch.ebbhr);
585 586
			break;
		case KVM_REG_PPC_EBBRR:
587
			*val = get_reg_val(id, vcpu->arch.ebbrr);
588 589
			break;
		case KVM_REG_PPC_BESCR:
590
			*val = get_reg_val(id, vcpu->arch.bescr);
591
			break;
592
		case KVM_REG_PPC_VTB:
593
			*val = get_reg_val(id, vcpu->arch.vtb);
594
			break;
595
		case KVM_REG_PPC_IC:
596
			*val = get_reg_val(id, vcpu->arch.ic);
597
			break;
598 599 600 601 602 603 604 605 606
		default:
			r = -EINVAL;
			break;
		}
	}

	return r;
}

607 608
int kvmppc_set_one_reg(struct kvm_vcpu *vcpu, u64 id,
			union kvmppc_one_reg *val)
609
{
610
	int r = 0;
611
	long int i;
612

613
	r = vcpu->kvm->arch.kvm_ops->set_one_reg(vcpu, id, val);
614 615
	if (r == -EINVAL) {
		r = 0;
616
		switch (id) {
617
		case KVM_REG_PPC_DAR:
618
			kvmppc_set_dar(vcpu, set_reg_val(id, *val));
619 620
			break;
		case KVM_REG_PPC_DSISR:
621
			kvmppc_set_dsisr(vcpu, set_reg_val(id, *val));
622
			break;
623
		case KVM_REG_PPC_FPR0 ... KVM_REG_PPC_FPR31:
624 625
			i = id - KVM_REG_PPC_FPR0;
			VCPU_FPR(vcpu, i) = set_reg_val(id, *val);
626 627
			break;
		case KVM_REG_PPC_FPSCR:
628
			vcpu->arch.fp.fpscr = set_reg_val(id, *val);
629
			break;
630 631 632
#ifdef CONFIG_VSX
		case KVM_REG_PPC_VSR0 ... KVM_REG_PPC_VSR31:
			if (cpu_has_feature(CPU_FTR_VSX)) {
633 634 635
				i = id - KVM_REG_PPC_VSR0;
				vcpu->arch.fp.fpr[i][0] = val->vsxval[0];
				vcpu->arch.fp.fpr[i][1] = val->vsxval[1];
636 637 638 639 640
			} else {
				r = -ENXIO;
			}
			break;
#endif /* CONFIG_VSX */
641 642 643 644 645 646 647
#ifdef CONFIG_KVM_XICS
		case KVM_REG_PPC_ICP_STATE:
			if (!vcpu->arch.icp) {
				r = -ENXIO;
				break;
			}
			r = kvmppc_xics_set_icp(vcpu,
648
						set_reg_val(id, *val));
649 650
			break;
#endif /* CONFIG_KVM_XICS */
651
		case KVM_REG_PPC_FSCR:
652
			vcpu->arch.fscr = set_reg_val(id, *val);
653
			break;
654
		case KVM_REG_PPC_TAR:
655
			vcpu->arch.tar = set_reg_val(id, *val);
656
			break;
657
		case KVM_REG_PPC_EBBHR:
658
			vcpu->arch.ebbhr = set_reg_val(id, *val);
659 660
			break;
		case KVM_REG_PPC_EBBRR:
661
			vcpu->arch.ebbrr = set_reg_val(id, *val);
662 663
			break;
		case KVM_REG_PPC_BESCR:
664
			vcpu->arch.bescr = set_reg_val(id, *val);
665
			break;
666
		case KVM_REG_PPC_VTB:
667
			vcpu->arch.vtb = set_reg_val(id, *val);
668
			break;
669
		case KVM_REG_PPC_IC:
670
			vcpu->arch.ic = set_reg_val(id, *val);
671
			break;
672 673 674 675 676 677 678 679 680
		default:
			r = -EINVAL;
			break;
		}
	}

	return r;
}

681 682
void kvmppc_core_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
{
683
	vcpu->kvm->arch.kvm_ops->vcpu_load(vcpu, cpu);
684 685 686 687
}

void kvmppc_core_vcpu_put(struct kvm_vcpu *vcpu)
{
688
	vcpu->kvm->arch.kvm_ops->vcpu_put(vcpu);
689 690 691 692
}

void kvmppc_set_msr(struct kvm_vcpu *vcpu, u64 msr)
{
693
	vcpu->kvm->arch.kvm_ops->set_msr(vcpu, msr);
694
}
695
EXPORT_SYMBOL_GPL(kvmppc_set_msr);
696 697 698

int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
{
699
	return vcpu->kvm->arch.kvm_ops->vcpu_run(kvm_run, vcpu);
700 701
}

A
Alexander Graf 已提交
702 703 704 705 706 707
int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu,
                                  struct kvm_translation *tr)
{
	return 0;
}

708 709 710
int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
					struct kvm_guest_debug *dbg)
{
711 712
	vcpu->guest_debug = dbg->control;
	return 0;
713 714
}

715
void kvmppc_decrementer_func(struct kvm_vcpu *vcpu)
716 717 718 719
{
	kvmppc_core_queue_dec(vcpu);
	kvm_vcpu_kick(vcpu);
}
720 721 722

struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm, unsigned int id)
{
723
	return kvm->arch.kvm_ops->vcpu_create(kvm, id);
724 725 726 727
}

void kvmppc_core_vcpu_free(struct kvm_vcpu *vcpu)
{
728
	vcpu->kvm->arch.kvm_ops->vcpu_free(vcpu);
729 730 731 732
}

int kvmppc_core_check_requests(struct kvm_vcpu *vcpu)
{
733
	return vcpu->kvm->arch.kvm_ops->check_requests(vcpu);
734 735 736 737
}

int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, struct kvm_dirty_log *log)
{
738
	return kvm->arch.kvm_ops->get_dirty_log(kvm, log);
739 740
}

741
void kvmppc_core_free_memslot(struct kvm *kvm, struct kvm_memory_slot *free,
742 743
			      struct kvm_memory_slot *dont)
{
744
	kvm->arch.kvm_ops->free_memslot(free, dont);
745 746
}

747
int kvmppc_core_create_memslot(struct kvm *kvm, struct kvm_memory_slot *slot,
748 749
			       unsigned long npages)
{
750
	return kvm->arch.kvm_ops->create_memslot(slot, npages);
751 752 753 754
}

void kvmppc_core_flush_memslot(struct kvm *kvm, struct kvm_memory_slot *memslot)
{
755
	kvm->arch.kvm_ops->flush_memslot(kvm, memslot);
756 757 758 759
}

int kvmppc_core_prepare_memory_region(struct kvm *kvm,
				struct kvm_memory_slot *memslot,
760
				const struct kvm_userspace_memory_region *mem)
761
{
762
	return kvm->arch.kvm_ops->prepare_memory_region(kvm, memslot, mem);
763 764 765
}

void kvmppc_core_commit_memory_region(struct kvm *kvm,
766
				const struct kvm_userspace_memory_region *mem,
767 768
				const struct kvm_memory_slot *old)
{
769
	kvm->arch.kvm_ops->commit_memory_region(kvm, mem, old);
770 771 772 773
}

int kvm_unmap_hva(struct kvm *kvm, unsigned long hva)
{
774
	return kvm->arch.kvm_ops->unmap_hva(kvm, hva);
775
}
776
EXPORT_SYMBOL_GPL(kvm_unmap_hva);
777 778 779

int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end)
{
780
	return kvm->arch.kvm_ops->unmap_hva_range(kvm, start, end);
781 782
}

A
Andres Lagar-Cavilla 已提交
783
int kvm_age_hva(struct kvm *kvm, unsigned long start, unsigned long end)
784
{
A
Andres Lagar-Cavilla 已提交
785
	return kvm->arch.kvm_ops->age_hva(kvm, start, end);
786 787 788 789
}

int kvm_test_age_hva(struct kvm *kvm, unsigned long hva)
{
790
	return kvm->arch.kvm_ops->test_age_hva(kvm, hva);
791 792 793 794
}

void kvm_set_spte_hva(struct kvm *kvm, unsigned long hva, pte_t pte)
{
795
	kvm->arch.kvm_ops->set_spte_hva(kvm, hva, pte);
796 797 798 799
}

void kvmppc_mmu_destroy(struct kvm_vcpu *vcpu)
{
800
	vcpu->kvm->arch.kvm_ops->mmu_destroy(vcpu);
801 802 803 804 805 806 807 808 809 810
}

int kvmppc_core_init_vm(struct kvm *kvm)
{

#ifdef CONFIG_PPC64
	INIT_LIST_HEAD(&kvm->arch.spapr_tce_tables);
	INIT_LIST_HEAD(&kvm->arch.rtas_tokens);
#endif

811
	return kvm->arch.kvm_ops->init_vm(kvm);
812 813 814 815
}

void kvmppc_core_destroy_vm(struct kvm *kvm)
{
816
	kvm->arch.kvm_ops->destroy_vm(kvm);
817 818 819 820 821 822 823

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

824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 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
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;
	int ret;

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

	ret = kvm_io_bus_read(vcpu, KVM_MMIO_BUS, addr, size, &buf);
	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;
	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;
	}

	ret = kvm_io_bus_write(vcpu, KVM_MMIO_BUS, addr, size, &buf);
	if (ret != 0)
		return H_TOO_HARD;

	return H_SUCCESS;
}
EXPORT_SYMBOL_GPL(kvmppc_h_logical_ci_store);

900 901
int kvmppc_core_check_processor_compat(void)
{
902 903 904 905 906 907 908 909
	/*
	 * We always return 0 for book3s. We check
	 * for compatability while loading the HV
	 * or PR module
	 */
	return 0;
}

910 911 912 913 914
int kvmppc_book3s_hcall_implemented(struct kvm *kvm, unsigned long hcall)
{
	return kvm->arch.kvm_ops->hcall_implemented(hcall);
}

915 916 917 918 919 920 921
static int kvmppc_book3s_init(void)
{
	int r;

	r = kvm_init(NULL, sizeof(struct kvm_vcpu), 0, THIS_MODULE);
	if (r)
		return r;
922
#ifdef CONFIG_KVM_BOOK3S_32_HANDLER
923 924 925 926 927 928 929 930
	r = kvmppc_book3s_init_pr();
#endif
	return r;

}

static void kvmppc_book3s_exit(void)
{
931
#ifdef CONFIG_KVM_BOOK3S_32_HANDLER
932 933 934
	kvmppc_book3s_exit_pr();
#endif
	kvm_exit();
935
}
936 937 938

module_init(kvmppc_book3s_init);
module_exit(kvmppc_book3s_exit);
939 940

/* On 32bit this is our one and only kernel module */
941
#ifdef CONFIG_KVM_BOOK3S_32_HANDLER
942 943 944
MODULE_ALIAS_MISCDEV(KVM_MINOR);
MODULE_ALIAS("devname:kvm");
#endif