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