12f4cf5e42d13974763276e918618f76a4188e391Alexander Graf/*
22f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * Copyright (C) 2009. SUSE Linux Products GmbH. All rights reserved.
32f4cf5e42d13974763276e918618f76a4188e391Alexander Graf *
42f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * Authors:
52f4cf5e42d13974763276e918618f76a4188e391Alexander Graf *    Alexander Graf <agraf@suse.de>
62f4cf5e42d13974763276e918618f76a4188e391Alexander Graf *    Kevin Wolf <mail@kevin-wolf.de>
72f4cf5e42d13974763276e918618f76a4188e391Alexander Graf *
82f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * Description:
92f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * This file is derived from arch/powerpc/kvm/44x.c,
102f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * by Hollis Blanchard <hollisb@us.ibm.com>.
112f4cf5e42d13974763276e918618f76a4188e391Alexander Graf *
122f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * This program is free software; you can redistribute it and/or modify
132f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * it under the terms of the GNU General Public License, version 2, as
142f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * published by the Free Software Foundation.
152f4cf5e42d13974763276e918618f76a4188e391Alexander Graf */
162f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
172f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#include <linux/kvm_host.h>
182f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#include <linux/err.h>
1966b15db69c2553036cc25f6e2e74fe7e3aa2761ePaul Gortmaker#include <linux/export.h>
20329d20ba451b5a9fd17a4ce9471e4d335b3b8c74Stephen Rothwell#include <linux/slab.h>
212f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
222f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#include <asm/reg.h>
232f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#include <asm/cputable.h>
242f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#include <asm/cacheflush.h>
252f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#include <asm/tlbflush.h>
262f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#include <asm/uaccess.h>
272f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#include <asm/io.h>
282f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#include <asm/kvm_ppc.h>
292f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#include <asm/kvm_book3s.h>
302f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#include <asm/mmu_context.h>
31149dbdb1859be46a063a5b1b0aa99a5f999b7632Paul Mackerras#include <asm/page.h>
325a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/gfp.h>
332f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#include <linux/sched.h>
342f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#include <linux/vmalloc.h>
359fb244a2c215d1e16ee92cb164b7b61c8dfa3909Alexander Graf#include <linux/highmem.h>
362f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
37c4befc58a0cc5a8cc5b4a7234d67b6b16dec4e70Paul Mackerras#include "trace.h"
38c4befc58a0cc5a8cc5b4a7234d67b6b16dec4e70Paul Mackerras
392f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#define VCPU_STAT(x) offsetof(struct kvm_vcpu, stat.x), KVM_STAT_VCPU
402f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
412f4cf5e42d13974763276e918618f76a4188e391Alexander Graf/* #define EXIT_DEBUG */
4207b0907db19d28dc74e7927d565655690b96daf7Alexander Graf
432f4cf5e42d13974763276e918618f76a4188e391Alexander Grafstruct kvm_stats_debugfs_item debugfs_entries[] = {
442f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	{ "exits",       VCPU_STAT(sum_exits) },
452f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	{ "mmio",        VCPU_STAT(mmio_exits) },
462f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	{ "sig",         VCPU_STAT(signal_exits) },
472f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	{ "sysc",        VCPU_STAT(syscall_exits) },
482f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	{ "inst_emu",    VCPU_STAT(emulated_inst_exits) },
492f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	{ "dec",         VCPU_STAT(dec_exits) },
502f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	{ "ext_intr",    VCPU_STAT(ext_intr_exits) },
512f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	{ "queue_intr",  VCPU_STAT(queue_intr) },
522f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	{ "halt_wakeup", VCPU_STAT(halt_wakeup) },
532f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	{ "pf_storage",  VCPU_STAT(pf_storage) },
542f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	{ "sp_storage",  VCPU_STAT(sp_storage) },
552f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	{ "pf_instruc",  VCPU_STAT(pf_instruc) },
562f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	{ "sp_instruc",  VCPU_STAT(sp_instruc) },
572f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	{ "ld",          VCPU_STAT(ld) },
582f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	{ "ld_slow",     VCPU_STAT(ld_slow) },
592f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	{ "st",          VCPU_STAT(st) },
602f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	{ "st_slow",     VCPU_STAT(st_slow) },
612f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	{ NULL }
622f4cf5e42d13974763276e918618f76a4188e391Alexander Graf};
632f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
642f4cf5e42d13974763276e918618f76a4188e391Alexander Grafvoid kvmppc_core_load_host_debugstate(struct kvm_vcpu *vcpu)
652f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{
662f4cf5e42d13974763276e918618f76a4188e391Alexander Graf}
672f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
682f4cf5e42d13974763276e918618f76a4188e391Alexander Grafvoid kvmppc_core_load_guest_debugstate(struct kvm_vcpu *vcpu)
692f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{
702f4cf5e42d13974763276e918618f76a4188e391Alexander Graf}
712f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
722f4cf5e42d13974763276e918618f76a4188e391Alexander Grafvoid kvmppc_inject_interrupt(struct kvm_vcpu *vcpu, int vec, u64 flags)
732f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{
74de7906c36ca1e22a3e3600e95c6a4e2c1e4e2e9cAlexander Graf	vcpu->arch.shared->srr0 = kvmppc_get_pc(vcpu);
75de7906c36ca1e22a3e3600e95c6a4e2c1e4e2e9cAlexander Graf	vcpu->arch.shared->srr1 = vcpu->arch.shared->msr | flags;
76f05ed4d56e9cff1c46d2b3049ba0c72e7e29392fPaul Mackerras	kvmppc_set_pc(vcpu, kvmppc_interrupt_offset(vcpu) + vec);
772f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	vcpu->arch.mmu.reset_msr(vcpu);
782f4cf5e42d13974763276e918618f76a4188e391Alexander Graf}
792f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
80583617b7866cfcc0b3830a4b7ab20f218d180f67Alexander Grafstatic int kvmppc_book3s_vec2irqprio(unsigned int vec)
812f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{
822f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	unsigned int prio;
832f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
842f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	switch (vec) {
852f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case 0x100: prio = BOOK3S_IRQPRIO_SYSTEM_RESET;		break;
862f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case 0x200: prio = BOOK3S_IRQPRIO_MACHINE_CHECK;	break;
872f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case 0x300: prio = BOOK3S_IRQPRIO_DATA_STORAGE;		break;
882f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case 0x380: prio = BOOK3S_IRQPRIO_DATA_SEGMENT;		break;
892f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case 0x400: prio = BOOK3S_IRQPRIO_INST_STORAGE;		break;
902f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case 0x480: prio = BOOK3S_IRQPRIO_INST_SEGMENT;		break;
912f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case 0x500: prio = BOOK3S_IRQPRIO_EXTERNAL;		break;
9217bd158006a33615270f9dba15c62f49bd447435Alexander Graf	case 0x501: prio = BOOK3S_IRQPRIO_EXTERNAL_LEVEL;	break;
932f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case 0x600: prio = BOOK3S_IRQPRIO_ALIGNMENT;		break;
942f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case 0x700: prio = BOOK3S_IRQPRIO_PROGRAM;		break;
952f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case 0x800: prio = BOOK3S_IRQPRIO_FP_UNAVAIL;		break;
962f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case 0x900: prio = BOOK3S_IRQPRIO_DECREMENTER;		break;
972f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case 0xc00: prio = BOOK3S_IRQPRIO_SYSCALL;		break;
982f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case 0xd00: prio = BOOK3S_IRQPRIO_DEBUG;		break;
992f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case 0xf20: prio = BOOK3S_IRQPRIO_ALTIVEC;		break;
1002f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case 0xf40: prio = BOOK3S_IRQPRIO_VSX;			break;
1012f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	default:    prio = BOOK3S_IRQPRIO_MAX;			break;
1022f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	}
1032f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
104583617b7866cfcc0b3830a4b7ab20f218d180f67Alexander Graf	return prio;
105583617b7866cfcc0b3830a4b7ab20f218d180f67Alexander Graf}
106583617b7866cfcc0b3830a4b7ab20f218d180f67Alexander Graf
1077706664d39a8eb8555408a24b1f17bd2086189c6Alexander Grafstatic void kvmppc_book3s_dequeue_irqprio(struct kvm_vcpu *vcpu,
1087706664d39a8eb8555408a24b1f17bd2086189c6Alexander Graf					  unsigned int vec)
1097706664d39a8eb8555408a24b1f17bd2086189c6Alexander Graf{
110f05ed4d56e9cff1c46d2b3049ba0c72e7e29392fPaul Mackerras	unsigned long old_pending = vcpu->arch.pending_exceptions;
111f05ed4d56e9cff1c46d2b3049ba0c72e7e29392fPaul Mackerras
1127706664d39a8eb8555408a24b1f17bd2086189c6Alexander Graf	clear_bit(kvmppc_book3s_vec2irqprio(vec),
1137706664d39a8eb8555408a24b1f17bd2086189c6Alexander Graf		  &vcpu->arch.pending_exceptions);
1149ee18b1e08e6a5648aeaaf998eabc72b5304cc17Alexander Graf
115f05ed4d56e9cff1c46d2b3049ba0c72e7e29392fPaul Mackerras	kvmppc_update_int_pending(vcpu, vcpu->arch.pending_exceptions,
116f05ed4d56e9cff1c46d2b3049ba0c72e7e29392fPaul Mackerras				  old_pending);
1177706664d39a8eb8555408a24b1f17bd2086189c6Alexander Graf}
1187706664d39a8eb8555408a24b1f17bd2086189c6Alexander Graf
119583617b7866cfcc0b3830a4b7ab20f218d180f67Alexander Grafvoid kvmppc_book3s_queue_irqprio(struct kvm_vcpu *vcpu, unsigned int vec)
120583617b7866cfcc0b3830a4b7ab20f218d180f67Alexander Graf{
121583617b7866cfcc0b3830a4b7ab20f218d180f67Alexander Graf	vcpu->stat.queue_intr++;
122583617b7866cfcc0b3830a4b7ab20f218d180f67Alexander Graf
123583617b7866cfcc0b3830a4b7ab20f218d180f67Alexander Graf	set_bit(kvmppc_book3s_vec2irqprio(vec),
124583617b7866cfcc0b3830a4b7ab20f218d180f67Alexander Graf		&vcpu->arch.pending_exceptions);
1252f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#ifdef EXIT_DEBUG
1262f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	printk(KERN_INFO "Queueing interrupt %x\n", vec);
1272f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#endif
1282f4cf5e42d13974763276e918618f76a4188e391Alexander Graf}
1292f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
1302f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
13125a8a02d26a71c28e26417a3520c653c2d40af6bAlexander Grafvoid kvmppc_core_queue_program(struct kvm_vcpu *vcpu, ulong flags)
1322f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{
1333cf658b605393d793ea52416c2306b86fbde9d9aPaul Mackerras	/* might as well deliver this straight away */
1343cf658b605393d793ea52416c2306b86fbde9d9aPaul Mackerras	kvmppc_inject_interrupt(vcpu, BOOK3S_INTERRUPT_PROGRAM, flags);
1352f4cf5e42d13974763276e918618f76a4188e391Alexander Graf}
1362f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
1372f4cf5e42d13974763276e918618f76a4188e391Alexander Grafvoid kvmppc_core_queue_dec(struct kvm_vcpu *vcpu)
1382f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{
1392f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	kvmppc_book3s_queue_irqprio(vcpu, BOOK3S_INTERRUPT_DECREMENTER);
1402f4cf5e42d13974763276e918618f76a4188e391Alexander Graf}
1412f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
1422f4cf5e42d13974763276e918618f76a4188e391Alexander Grafint kvmppc_core_pending_dec(struct kvm_vcpu *vcpu)
1432f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{
14444075d95e2567ce7b454bc1a4cf264ff6afebe65Paul Mackerras	return test_bit(BOOK3S_IRQPRIO_DECREMENTER, &vcpu->arch.pending_exceptions);
1452f4cf5e42d13974763276e918618f76a4188e391Alexander Graf}
1462f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
1477706664d39a8eb8555408a24b1f17bd2086189c6Alexander Grafvoid kvmppc_core_dequeue_dec(struct kvm_vcpu *vcpu)
1487706664d39a8eb8555408a24b1f17bd2086189c6Alexander Graf{
1497706664d39a8eb8555408a24b1f17bd2086189c6Alexander Graf	kvmppc_book3s_dequeue_irqprio(vcpu, BOOK3S_INTERRUPT_DECREMENTER);
1507706664d39a8eb8555408a24b1f17bd2086189c6Alexander Graf}
1517706664d39a8eb8555408a24b1f17bd2086189c6Alexander Graf
1522f4cf5e42d13974763276e918618f76a4188e391Alexander Grafvoid kvmppc_core_queue_external(struct kvm_vcpu *vcpu,
1532f4cf5e42d13974763276e918618f76a4188e391Alexander Graf                                struct kvm_interrupt *irq)
1542f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{
15517bd158006a33615270f9dba15c62f49bd447435Alexander Graf	unsigned int vec = BOOK3S_INTERRUPT_EXTERNAL;
15617bd158006a33615270f9dba15c62f49bd447435Alexander Graf
15717bd158006a33615270f9dba15c62f49bd447435Alexander Graf	if (irq->irq == KVM_INTERRUPT_SET_LEVEL)
15817bd158006a33615270f9dba15c62f49bd447435Alexander Graf		vec = BOOK3S_INTERRUPT_EXTERNAL_LEVEL;
15917bd158006a33615270f9dba15c62f49bd447435Alexander Graf
16017bd158006a33615270f9dba15c62f49bd447435Alexander Graf	kvmppc_book3s_queue_irqprio(vcpu, vec);
1612f4cf5e42d13974763276e918618f76a4188e391Alexander Graf}
1622f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
16318978768d89f638165646718c50ced19f2a10164Alexander Grafvoid kvmppc_core_dequeue_external(struct kvm_vcpu *vcpu,
16418978768d89f638165646718c50ced19f2a10164Alexander Graf                                  struct kvm_interrupt *irq)
16518978768d89f638165646718c50ced19f2a10164Alexander Graf{
16618978768d89f638165646718c50ced19f2a10164Alexander Graf	kvmppc_book3s_dequeue_irqprio(vcpu, BOOK3S_INTERRUPT_EXTERNAL);
16717bd158006a33615270f9dba15c62f49bd447435Alexander Graf	kvmppc_book3s_dequeue_irqprio(vcpu, BOOK3S_INTERRUPT_EXTERNAL_LEVEL);
16818978768d89f638165646718c50ced19f2a10164Alexander Graf}
16918978768d89f638165646718c50ced19f2a10164Alexander Graf
1702f4cf5e42d13974763276e918618f76a4188e391Alexander Grafint kvmppc_book3s_irqprio_deliver(struct kvm_vcpu *vcpu, unsigned int priority)
1712f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{
1722f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	int deliver = 1;
1732f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	int vec = 0;
174f05ed4d56e9cff1c46d2b3049ba0c72e7e29392fPaul Mackerras	bool crit = kvmppc_critical_section(vcpu);
1752f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
1762f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	switch (priority) {
1772f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case BOOK3S_IRQPRIO_DECREMENTER:
1785c6cedf488a1144ac4f683f3ea1a642533d1dcd2Alexander Graf		deliver = (vcpu->arch.shared->msr & MSR_EE) && !crit;
1792f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		vec = BOOK3S_INTERRUPT_DECREMENTER;
1802f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		break;
1812f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case BOOK3S_IRQPRIO_EXTERNAL:
18217bd158006a33615270f9dba15c62f49bd447435Alexander Graf	case BOOK3S_IRQPRIO_EXTERNAL_LEVEL:
1835c6cedf488a1144ac4f683f3ea1a642533d1dcd2Alexander Graf		deliver = (vcpu->arch.shared->msr & MSR_EE) && !crit;
1842f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		vec = BOOK3S_INTERRUPT_EXTERNAL;
1852f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		break;
1862f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case BOOK3S_IRQPRIO_SYSTEM_RESET:
1872f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		vec = BOOK3S_INTERRUPT_SYSTEM_RESET;
1882f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		break;
1892f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case BOOK3S_IRQPRIO_MACHINE_CHECK:
1902f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		vec = BOOK3S_INTERRUPT_MACHINE_CHECK;
1912f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		break;
1922f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case BOOK3S_IRQPRIO_DATA_STORAGE:
1932f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		vec = BOOK3S_INTERRUPT_DATA_STORAGE;
1942f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		break;
1952f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case BOOK3S_IRQPRIO_INST_STORAGE:
1962f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		vec = BOOK3S_INTERRUPT_INST_STORAGE;
1972f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		break;
1982f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case BOOK3S_IRQPRIO_DATA_SEGMENT:
1992f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		vec = BOOK3S_INTERRUPT_DATA_SEGMENT;
2002f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		break;
2012f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case BOOK3S_IRQPRIO_INST_SEGMENT:
2022f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		vec = BOOK3S_INTERRUPT_INST_SEGMENT;
2032f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		break;
2042f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case BOOK3S_IRQPRIO_ALIGNMENT:
2052f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		vec = BOOK3S_INTERRUPT_ALIGNMENT;
2062f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		break;
2072f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case BOOK3S_IRQPRIO_PROGRAM:
2082f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		vec = BOOK3S_INTERRUPT_PROGRAM;
2092f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		break;
2102f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case BOOK3S_IRQPRIO_VSX:
2112f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		vec = BOOK3S_INTERRUPT_VSX;
2122f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		break;
2132f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case BOOK3S_IRQPRIO_ALTIVEC:
2142f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		vec = BOOK3S_INTERRUPT_ALTIVEC;
2152f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		break;
2162f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case BOOK3S_IRQPRIO_FP_UNAVAIL:
2172f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		vec = BOOK3S_INTERRUPT_FP_UNAVAIL;
2182f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		break;
2192f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case BOOK3S_IRQPRIO_SYSCALL:
2202f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		vec = BOOK3S_INTERRUPT_SYSCALL;
2212f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		break;
2222f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case BOOK3S_IRQPRIO_DEBUG:
2232f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		vec = BOOK3S_INTERRUPT_TRACE;
2242f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		break;
2252f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	case BOOK3S_IRQPRIO_PERFORMANCE_MONITOR:
2262f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		vec = BOOK3S_INTERRUPT_PERFMON;
2272f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		break;
2282f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	default:
2292f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		deliver = 0;
2302f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		printk(KERN_ERR "KVM: Unknown interrupt: 0x%x\n", priority);
2312f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		break;
2322f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	}
2332f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
2342f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#if 0
2352f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	printk(KERN_INFO "Deliver interrupt 0x%x? %x\n", vec, deliver);
2362f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#endif
2372f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
2382f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	if (deliver)
2393cf658b605393d793ea52416c2306b86fbde9d9aPaul Mackerras		kvmppc_inject_interrupt(vcpu, vec, 0);
2402f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
2412f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	return deliver;
2422f4cf5e42d13974763276e918618f76a4188e391Alexander Graf}
2432f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
24417bd158006a33615270f9dba15c62f49bd447435Alexander Graf/*
24517bd158006a33615270f9dba15c62f49bd447435Alexander Graf * This function determines if an irqprio should be cleared once issued.
24617bd158006a33615270f9dba15c62f49bd447435Alexander Graf */
24717bd158006a33615270f9dba15c62f49bd447435Alexander Grafstatic bool clear_irqprio(struct kvm_vcpu *vcpu, unsigned int priority)
24817bd158006a33615270f9dba15c62f49bd447435Alexander Graf{
24917bd158006a33615270f9dba15c62f49bd447435Alexander Graf	switch (priority) {
25017bd158006a33615270f9dba15c62f49bd447435Alexander Graf		case BOOK3S_IRQPRIO_DECREMENTER:
25117bd158006a33615270f9dba15c62f49bd447435Alexander Graf			/* DEC interrupts get cleared by mtdec */
25217bd158006a33615270f9dba15c62f49bd447435Alexander Graf			return false;
25317bd158006a33615270f9dba15c62f49bd447435Alexander Graf		case BOOK3S_IRQPRIO_EXTERNAL_LEVEL:
25417bd158006a33615270f9dba15c62f49bd447435Alexander Graf			/* External interrupts get cleared by userspace */
25517bd158006a33615270f9dba15c62f49bd447435Alexander Graf			return false;
25617bd158006a33615270f9dba15c62f49bd447435Alexander Graf	}
25717bd158006a33615270f9dba15c62f49bd447435Alexander Graf
25817bd158006a33615270f9dba15c62f49bd447435Alexander Graf	return true;
25917bd158006a33615270f9dba15c62f49bd447435Alexander Graf}
26017bd158006a33615270f9dba15c62f49bd447435Alexander Graf
2617e28e60ef974d0eeb43112ef264d8c130f7b7bf4Scott Woodvoid kvmppc_core_prepare_to_enter(struct kvm_vcpu *vcpu)
2622f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{
2632f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	unsigned long *pending = &vcpu->arch.pending_exceptions;
26490bba358873dc96a6746f0df453a0a8ca3d6b86eAlexander Graf	unsigned long old_pending = vcpu->arch.pending_exceptions;
2652f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	unsigned int priority;
2662f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
2672f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#ifdef EXIT_DEBUG
2682f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	if (vcpu->arch.pending_exceptions)
2692f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		printk(KERN_EMERG "KVM: Check pending: %lx\n", vcpu->arch.pending_exceptions);
2702f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#endif
2712f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	priority = __ffs(*pending);
272ada7ba17b4054f303ad62d91ffd22bc4afad1657Alexander Graf	while (priority < BOOK3S_IRQPRIO_MAX) {
2737706664d39a8eb8555408a24b1f17bd2086189c6Alexander Graf		if (kvmppc_book3s_irqprio_deliver(vcpu, priority) &&
27417bd158006a33615270f9dba15c62f49bd447435Alexander Graf		    clear_irqprio(vcpu, priority)) {
2752f4cf5e42d13974763276e918618f76a4188e391Alexander Graf			clear_bit(priority, &vcpu->arch.pending_exceptions);
2762f4cf5e42d13974763276e918618f76a4188e391Alexander Graf			break;
2772f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		}
2782f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
2792f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		priority = find_next_bit(pending,
2802f4cf5e42d13974763276e918618f76a4188e391Alexander Graf					 BITS_PER_BYTE * sizeof(*pending),
2812f4cf5e42d13974763276e918618f76a4188e391Alexander Graf					 priority + 1);
2822f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	}
28390bba358873dc96a6746f0df453a0a8ca3d6b86eAlexander Graf
28490bba358873dc96a6746f0df453a0a8ca3d6b86eAlexander Graf	/* Tell the guest about our interrupt status */
285f05ed4d56e9cff1c46d2b3049ba0c72e7e29392fPaul Mackerras	kvmppc_update_int_pending(vcpu, *pending, old_pending);
2862f4cf5e42d13974763276e918618f76a4188e391Alexander Graf}
2872f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
288e8508940a88691ad3d1c46608cd968eb4be9cbc5Alexander Grafpfn_t kvmppc_gfn_to_pfn(struct kvm_vcpu *vcpu, gfn_t gfn)
289e8508940a88691ad3d1c46608cd968eb4be9cbc5Alexander Graf{
290e8508940a88691ad3d1c46608cd968eb4be9cbc5Alexander Graf	ulong mp_pa = vcpu->arch.magic_page_pa;
291e8508940a88691ad3d1c46608cd968eb4be9cbc5Alexander Graf
292e8508940a88691ad3d1c46608cd968eb4be9cbc5Alexander Graf	/* Magic page override */
293e8508940a88691ad3d1c46608cd968eb4be9cbc5Alexander Graf	if (unlikely(mp_pa) &&
294e8508940a88691ad3d1c46608cd968eb4be9cbc5Alexander Graf	    unlikely(((gfn << PAGE_SHIFT) & KVM_PAM) ==
295e8508940a88691ad3d1c46608cd968eb4be9cbc5Alexander Graf		     ((mp_pa & PAGE_MASK) & KVM_PAM))) {
296e8508940a88691ad3d1c46608cd968eb4be9cbc5Alexander Graf		ulong shared_page = ((ulong)vcpu->arch.shared) & PAGE_MASK;
297e8508940a88691ad3d1c46608cd968eb4be9cbc5Alexander Graf		pfn_t pfn;
298e8508940a88691ad3d1c46608cd968eb4be9cbc5Alexander Graf
299e8508940a88691ad3d1c46608cd968eb4be9cbc5Alexander Graf		pfn = (pfn_t)virt_to_phys((void*)shared_page) >> PAGE_SHIFT;
300e8508940a88691ad3d1c46608cd968eb4be9cbc5Alexander Graf		get_page(pfn_to_page(pfn));
301e8508940a88691ad3d1c46608cd968eb4be9cbc5Alexander Graf		return pfn;
302e8508940a88691ad3d1c46608cd968eb4be9cbc5Alexander Graf	}
303e8508940a88691ad3d1c46608cd968eb4be9cbc5Alexander Graf
304e8508940a88691ad3d1c46608cd968eb4be9cbc5Alexander Graf	return gfn_to_pfn(vcpu->kvm, gfn);
305e8508940a88691ad3d1c46608cd968eb4be9cbc5Alexander Graf}
306e8508940a88691ad3d1c46608cd968eb4be9cbc5Alexander Graf
3072f4cf5e42d13974763276e918618f76a4188e391Alexander Grafstatic int kvmppc_xlate(struct kvm_vcpu *vcpu, ulong eaddr, bool data,
3082f4cf5e42d13974763276e918618f76a4188e391Alexander Graf			 struct kvmppc_pte *pte)
3092f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{
310666e7252a15b7fc4a116e65deaf6da5e4ce660e3Alexander Graf	int relocated = (vcpu->arch.shared->msr & (data ? MSR_DR : MSR_IR));
3112f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	int r;
3122f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
3132f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	if (relocated) {
3142f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		r = vcpu->arch.mmu.xlate(vcpu, eaddr, pte, data);
3152f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	} else {
3162f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		pte->eaddr = eaddr;
31728e83b4fa7f8bd114940fa933ac8cbe80969eba2Alexander Graf		pte->raddr = eaddr & KVM_PAM;
3183eeafd7da2b0293b512abe95c86843fc4ab42addAlexander Graf		pte->vpage = VSID_REAL | eaddr >> 12;
3192f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		pte->may_read = true;
3202f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		pte->may_write = true;
3212f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		pte->may_execute = true;
3222f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		r = 0;
3232f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	}
3242f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
3252f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	return r;
3262f4cf5e42d13974763276e918618f76a4188e391Alexander Graf}
3272f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
3282f4cf5e42d13974763276e918618f76a4188e391Alexander Grafstatic hva_t kvmppc_bad_hva(void)
3292f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{
3302f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	return PAGE_OFFSET;
3312f4cf5e42d13974763276e918618f76a4188e391Alexander Graf}
3322f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
3332f4cf5e42d13974763276e918618f76a4188e391Alexander Grafstatic hva_t kvmppc_pte_to_hva(struct kvm_vcpu *vcpu, struct kvmppc_pte *pte,
3342f4cf5e42d13974763276e918618f76a4188e391Alexander Graf			       bool read)
3352f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{
3362f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	hva_t hpage;
3372f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
3382f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	if (read && !pte->may_read)
3392f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		goto err;
3402f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
3412f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	if (!read && !pte->may_write)
3422f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		goto err;
3432f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
3442f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	hpage = gfn_to_hva(vcpu->kvm, pte->raddr >> PAGE_SHIFT);
3452f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	if (kvm_is_error_hva(hpage))
3462f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		goto err;
3472f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
3482f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	return hpage | (pte->raddr & ~PAGE_MASK);
3492f4cf5e42d13974763276e918618f76a4188e391Alexander Graferr:
3502f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	return kvmppc_bad_hva();
3512f4cf5e42d13974763276e918618f76a4188e391Alexander Graf}
3522f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
3535467a97d0f0ac99d2db0281ce1762e85afe16da2Alexander Grafint kvmppc_st(struct kvm_vcpu *vcpu, ulong *eaddr, int size, void *ptr,
3545467a97d0f0ac99d2db0281ce1762e85afe16da2Alexander Graf	      bool data)
3552f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{
3562f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	struct kvmppc_pte pte;
3572f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
3582f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	vcpu->stat.st++;
3592f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
3605467a97d0f0ac99d2db0281ce1762e85afe16da2Alexander Graf	if (kvmppc_xlate(vcpu, *eaddr, data, &pte))
3619fb244a2c215d1e16ee92cb164b7b61c8dfa3909Alexander Graf		return -ENOENT;
3625467a97d0f0ac99d2db0281ce1762e85afe16da2Alexander Graf
3635467a97d0f0ac99d2db0281ce1762e85afe16da2Alexander Graf	*eaddr = pte.raddr;
3642f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
3659fb244a2c215d1e16ee92cb164b7b61c8dfa3909Alexander Graf	if (!pte.may_write)
3669fb244a2c215d1e16ee92cb164b7b61c8dfa3909Alexander Graf		return -EPERM;
3672f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
3689fb244a2c215d1e16ee92cb164b7b61c8dfa3909Alexander Graf	if (kvm_write_guest(vcpu->kvm, pte.raddr, ptr, size))
3699fb244a2c215d1e16ee92cb164b7b61c8dfa3909Alexander Graf		return EMULATE_DO_MMIO;
3702f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
3715467a97d0f0ac99d2db0281ce1762e85afe16da2Alexander Graf	return EMULATE_DONE;
3722f4cf5e42d13974763276e918618f76a4188e391Alexander Graf}
3732f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
3745467a97d0f0ac99d2db0281ce1762e85afe16da2Alexander Grafint kvmppc_ld(struct kvm_vcpu *vcpu, ulong *eaddr, int size, void *ptr,
3752f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		      bool data)
3762f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{
3772f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	struct kvmppc_pte pte;
3785467a97d0f0ac99d2db0281ce1762e85afe16da2Alexander Graf	hva_t hva = *eaddr;
3792f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
3802f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	vcpu->stat.ld++;
3812f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
3825467a97d0f0ac99d2db0281ce1762e85afe16da2Alexander Graf	if (kvmppc_xlate(vcpu, *eaddr, data, &pte))
3835467a97d0f0ac99d2db0281ce1762e85afe16da2Alexander Graf		goto nopte;
3845467a97d0f0ac99d2db0281ce1762e85afe16da2Alexander Graf
3855467a97d0f0ac99d2db0281ce1762e85afe16da2Alexander Graf	*eaddr = pte.raddr;
3862f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
3872f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	hva = kvmppc_pte_to_hva(vcpu, &pte, true);
3882f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	if (kvm_is_error_hva(hva))
3895467a97d0f0ac99d2db0281ce1762e85afe16da2Alexander Graf		goto mmio;
3902f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
3912f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	if (copy_from_user(ptr, (void __user *)hva, size)) {
3922f4cf5e42d13974763276e918618f76a4188e391Alexander Graf		printk(KERN_INFO "kvmppc_ld at 0x%lx failed\n", hva);
3935467a97d0f0ac99d2db0281ce1762e85afe16da2Alexander Graf		goto mmio;
3942f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	}
3952f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
3965467a97d0f0ac99d2db0281ce1762e85afe16da2Alexander Graf	return EMULATE_DONE;
3972f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
3985467a97d0f0ac99d2db0281ce1762e85afe16da2Alexander Grafnopte:
3992f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	return -ENOENT;
4005467a97d0f0ac99d2db0281ce1762e85afe16da2Alexander Grafmmio:
4015467a97d0f0ac99d2db0281ce1762e85afe16da2Alexander Graf	return EMULATE_DO_MMIO;
4022f4cf5e42d13974763276e918618f76a4188e391Alexander Graf}
4032f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
4042f4cf5e42d13974763276e918618f76a4188e391Alexander Grafint kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
4052f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{
4062f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	return 0;
4072f4cf5e42d13974763276e918618f76a4188e391Alexander Graf}
4082f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
4092f4cf5e42d13974763276e918618f76a4188e391Alexander Grafint kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
4102f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{
4112f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	int i;
4122f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
413c7f38f46f2a98d232147e47284cb4e7363296a3eAlexander Graf	regs->pc = kvmppc_get_pc(vcpu);
414992b5b29b5ae254c416c62faf98d59a6cf970027Alexander Graf	regs->cr = kvmppc_get_cr(vcpu);
415c7f38f46f2a98d232147e47284cb4e7363296a3eAlexander Graf	regs->ctr = kvmppc_get_ctr(vcpu);
416c7f38f46f2a98d232147e47284cb4e7363296a3eAlexander Graf	regs->lr = kvmppc_get_lr(vcpu);
417992b5b29b5ae254c416c62faf98d59a6cf970027Alexander Graf	regs->xer = kvmppc_get_xer(vcpu);
418666e7252a15b7fc4a116e65deaf6da5e4ce660e3Alexander Graf	regs->msr = vcpu->arch.shared->msr;
419de7906c36ca1e22a3e3600e95c6a4e2c1e4e2e9cAlexander Graf	regs->srr0 = vcpu->arch.shared->srr0;
420de7906c36ca1e22a3e3600e95c6a4e2c1e4e2e9cAlexander Graf	regs->srr1 = vcpu->arch.shared->srr1;
4212f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	regs->pid = vcpu->arch.pid;
422a73a9599e03eef1324d5aeecaebc1b339d2e1664Alexander Graf	regs->sprg0 = vcpu->arch.shared->sprg0;
423a73a9599e03eef1324d5aeecaebc1b339d2e1664Alexander Graf	regs->sprg1 = vcpu->arch.shared->sprg1;
424a73a9599e03eef1324d5aeecaebc1b339d2e1664Alexander Graf	regs->sprg2 = vcpu->arch.shared->sprg2;
425a73a9599e03eef1324d5aeecaebc1b339d2e1664Alexander Graf	regs->sprg3 = vcpu->arch.shared->sprg3;
426b59049720dd95021dfe0d9f4e1fa9458a67cfe29Scott Wood	regs->sprg4 = vcpu->arch.shared->sprg4;
427b59049720dd95021dfe0d9f4e1fa9458a67cfe29Scott Wood	regs->sprg5 = vcpu->arch.shared->sprg5;
428b59049720dd95021dfe0d9f4e1fa9458a67cfe29Scott Wood	regs->sprg6 = vcpu->arch.shared->sprg6;
429b59049720dd95021dfe0d9f4e1fa9458a67cfe29Scott Wood	regs->sprg7 = vcpu->arch.shared->sprg7;
4302f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
4312f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	for (i = 0; i < ARRAY_SIZE(regs->gpr); i++)
4328e5b26b55a8b6aee2c789b1d20ec715f9e4bea5cAlexander Graf		regs->gpr[i] = kvmppc_get_gpr(vcpu, i);
4332f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
4342f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	return 0;
4352f4cf5e42d13974763276e918618f76a4188e391Alexander Graf}
4362f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
4372f4cf5e42d13974763276e918618f76a4188e391Alexander Grafint kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
4382f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{
4392f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	int i;
4402f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
441c7f38f46f2a98d232147e47284cb4e7363296a3eAlexander Graf	kvmppc_set_pc(vcpu, regs->pc);
442992b5b29b5ae254c416c62faf98d59a6cf970027Alexander Graf	kvmppc_set_cr(vcpu, regs->cr);
443c7f38f46f2a98d232147e47284cb4e7363296a3eAlexander Graf	kvmppc_set_ctr(vcpu, regs->ctr);
444c7f38f46f2a98d232147e47284cb4e7363296a3eAlexander Graf	kvmppc_set_lr(vcpu, regs->lr);
445992b5b29b5ae254c416c62faf98d59a6cf970027Alexander Graf	kvmppc_set_xer(vcpu, regs->xer);
4462f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	kvmppc_set_msr(vcpu, regs->msr);
447de7906c36ca1e22a3e3600e95c6a4e2c1e4e2e9cAlexander Graf	vcpu->arch.shared->srr0 = regs->srr0;
448de7906c36ca1e22a3e3600e95c6a4e2c1e4e2e9cAlexander Graf	vcpu->arch.shared->srr1 = regs->srr1;
449a73a9599e03eef1324d5aeecaebc1b339d2e1664Alexander Graf	vcpu->arch.shared->sprg0 = regs->sprg0;
450a73a9599e03eef1324d5aeecaebc1b339d2e1664Alexander Graf	vcpu->arch.shared->sprg1 = regs->sprg1;
451a73a9599e03eef1324d5aeecaebc1b339d2e1664Alexander Graf	vcpu->arch.shared->sprg2 = regs->sprg2;
452a73a9599e03eef1324d5aeecaebc1b339d2e1664Alexander Graf	vcpu->arch.shared->sprg3 = regs->sprg3;
453b59049720dd95021dfe0d9f4e1fa9458a67cfe29Scott Wood	vcpu->arch.shared->sprg4 = regs->sprg4;
454b59049720dd95021dfe0d9f4e1fa9458a67cfe29Scott Wood	vcpu->arch.shared->sprg5 = regs->sprg5;
455b59049720dd95021dfe0d9f4e1fa9458a67cfe29Scott Wood	vcpu->arch.shared->sprg6 = regs->sprg6;
456b59049720dd95021dfe0d9f4e1fa9458a67cfe29Scott Wood	vcpu->arch.shared->sprg7 = regs->sprg7;
4572f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
4588e5b26b55a8b6aee2c789b1d20ec715f9e4bea5cAlexander Graf	for (i = 0; i < ARRAY_SIZE(regs->gpr); i++)
4598e5b26b55a8b6aee2c789b1d20ec715f9e4bea5cAlexander Graf		kvmppc_set_gpr(vcpu, i, regs->gpr[i]);
4602f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
4612f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	return 0;
4622f4cf5e42d13974763276e918618f76a4188e391Alexander Graf}
4632f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
4642f4cf5e42d13974763276e918618f76a4188e391Alexander Grafint kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
4652f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{
4662f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	return -ENOTSUPP;
4672f4cf5e42d13974763276e918618f76a4188e391Alexander Graf}
4682f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
4692f4cf5e42d13974763276e918618f76a4188e391Alexander Grafint kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
4702f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{
4712f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	return -ENOTSUPP;
4722f4cf5e42d13974763276e918618f76a4188e391Alexander Graf}
4732f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
4742f4cf5e42d13974763276e918618f76a4188e391Alexander Grafint kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu,
4752f4cf5e42d13974763276e918618f76a4188e391Alexander Graf                                  struct kvm_translation *tr)
4762f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{
4772f4cf5e42d13974763276e918618f76a4188e391Alexander Graf	return 0;
4782f4cf5e42d13974763276e918618f76a4188e391Alexander Graf}
4792f4cf5e42d13974763276e918618f76a4188e391Alexander Graf
480dfd4d47e9a71c5a35eb67a44cd311efbe1846b7eScott Woodvoid kvmppc_decrementer_func(unsigned long data)
481dfd4d47e9a71c5a35eb67a44cd311efbe1846b7eScott Wood{
482dfd4d47e9a71c5a35eb67a44cd311efbe1846b7eScott Wood	struct kvm_vcpu *vcpu = (struct kvm_vcpu *)data;
483dfd4d47e9a71c5a35eb67a44cd311efbe1846b7eScott Wood
484dfd4d47e9a71c5a35eb67a44cd311efbe1846b7eScott Wood	kvmppc_core_queue_dec(vcpu);
485dfd4d47e9a71c5a35eb67a44cd311efbe1846b7eScott Wood	kvm_vcpu_kick(vcpu);
486dfd4d47e9a71c5a35eb67a44cd311efbe1846b7eScott Wood}
487