book3s.c revision 2f4cf5e42d13974763276e918618f76a4188e391
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> 192f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 202f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#include <asm/reg.h> 212f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#include <asm/cputable.h> 222f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#include <asm/cacheflush.h> 232f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#include <asm/tlbflush.h> 242f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#include <asm/uaccess.h> 252f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#include <asm/io.h> 262f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#include <asm/kvm_ppc.h> 272f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#include <asm/kvm_book3s.h> 282f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#include <asm/mmu_context.h> 292f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#include <linux/sched.h> 302f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#include <linux/vmalloc.h> 312f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 322f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#define VCPU_STAT(x) offsetof(struct kvm_vcpu, stat.x), KVM_STAT_VCPU 332f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 342f4cf5e42d13974763276e918618f76a4188e391Alexander Graf/* #define EXIT_DEBUG */ 352f4cf5e42d13974763276e918618f76a4188e391Alexander Graf/* #define EXIT_DEBUG_SIMPLE */ 362f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 372f4cf5e42d13974763276e918618f76a4188e391Alexander Graf/* Without AGGRESSIVE_DEC we only fire off a DEC interrupt when DEC turns 0. 382f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * When set, we retrigger a DEC interrupt after that if DEC <= 0. 392f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * PPC32 Linux runs faster without AGGRESSIVE_DEC, PPC64 Linux requires it. */ 402f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 412f4cf5e42d13974763276e918618f76a4188e391Alexander Graf/* #define AGGRESSIVE_DEC */ 422f4cf5e42d13974763276e918618f76a4188e391Alexander 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_core_vcpu_load(struct kvm_vcpu *vcpu, int cpu) 732f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 742f4cf5e42d13974763276e918618f76a4188e391Alexander Graf memcpy(get_paca()->kvm_slb, to_book3s(vcpu)->slb_shadow, sizeof(get_paca()->kvm_slb)); 752f4cf5e42d13974763276e918618f76a4188e391Alexander Graf get_paca()->kvm_slb_max = to_book3s(vcpu)->slb_shadow_max; 762f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 772f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 782f4cf5e42d13974763276e918618f76a4188e391Alexander Grafvoid kvmppc_core_vcpu_put(struct kvm_vcpu *vcpu) 792f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 802f4cf5e42d13974763276e918618f76a4188e391Alexander Graf memcpy(to_book3s(vcpu)->slb_shadow, get_paca()->kvm_slb, sizeof(get_paca()->kvm_slb)); 812f4cf5e42d13974763276e918618f76a4188e391Alexander Graf to_book3s(vcpu)->slb_shadow_max = get_paca()->kvm_slb_max; 822f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 832f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 842f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#if defined(AGGRESSIVE_DEC) || defined(EXIT_DEBUG) 852f4cf5e42d13974763276e918618f76a4188e391Alexander Grafstatic u32 kvmppc_get_dec(struct kvm_vcpu *vcpu) 862f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 872f4cf5e42d13974763276e918618f76a4188e391Alexander Graf u64 jd = mftb() - vcpu->arch.dec_jiffies; 882f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return vcpu->arch.dec - jd; 892f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 902f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#endif 912f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 922f4cf5e42d13974763276e918618f76a4188e391Alexander Grafvoid kvmppc_set_msr(struct kvm_vcpu *vcpu, u64 msr) 932f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 942f4cf5e42d13974763276e918618f76a4188e391Alexander Graf ulong old_msr = vcpu->arch.msr; 952f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 962f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#ifdef EXIT_DEBUG 972f4cf5e42d13974763276e918618f76a4188e391Alexander Graf printk(KERN_INFO "KVM: Set MSR to 0x%llx\n", msr); 982f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#endif 992f4cf5e42d13974763276e918618f76a4188e391Alexander Graf msr &= to_book3s(vcpu)->msr_mask; 1002f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.msr = msr; 1012f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.shadow_msr = msr | MSR_USER32; 1022f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.shadow_msr &= ( MSR_VEC | MSR_VSX | MSR_FP | MSR_FE0 | 1032f4cf5e42d13974763276e918618f76a4188e391Alexander Graf MSR_USER64 | MSR_SE | MSR_BE | MSR_DE | 1042f4cf5e42d13974763276e918618f76a4188e391Alexander Graf MSR_FE1); 1052f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 1062f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (msr & (MSR_WE|MSR_POW)) { 1072f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (!vcpu->arch.pending_exceptions) { 1082f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvm_vcpu_block(vcpu); 1092f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->stat.halt_wakeup++; 1102f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 1112f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 1122f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 1132f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (((vcpu->arch.msr & (MSR_IR|MSR_DR)) != (old_msr & (MSR_IR|MSR_DR))) || 1142f4cf5e42d13974763276e918618f76a4188e391Alexander Graf (vcpu->arch.msr & MSR_PR) != (old_msr & MSR_PR)) { 1152f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_mmu_flush_segments(vcpu); 1162f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_mmu_map_segment(vcpu, vcpu->arch.pc); 1172f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 1182f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 1192f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 1202f4cf5e42d13974763276e918618f76a4188e391Alexander Grafvoid kvmppc_inject_interrupt(struct kvm_vcpu *vcpu, int vec, u64 flags) 1212f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 1222f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.srr0 = vcpu->arch.pc; 1232f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.srr1 = vcpu->arch.msr | flags; 1242f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.pc = to_book3s(vcpu)->hior + vec; 1252f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.mmu.reset_msr(vcpu); 1262f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 1272f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 1282f4cf5e42d13974763276e918618f76a4188e391Alexander Grafvoid kvmppc_book3s_queue_irqprio(struct kvm_vcpu *vcpu, unsigned int vec) 1292f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 1302f4cf5e42d13974763276e918618f76a4188e391Alexander Graf unsigned int prio; 1312f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 1322f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->stat.queue_intr++; 1332f4cf5e42d13974763276e918618f76a4188e391Alexander Graf switch (vec) { 1342f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case 0x100: prio = BOOK3S_IRQPRIO_SYSTEM_RESET; break; 1352f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case 0x200: prio = BOOK3S_IRQPRIO_MACHINE_CHECK; break; 1362f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case 0x300: prio = BOOK3S_IRQPRIO_DATA_STORAGE; break; 1372f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case 0x380: prio = BOOK3S_IRQPRIO_DATA_SEGMENT; break; 1382f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case 0x400: prio = BOOK3S_IRQPRIO_INST_STORAGE; break; 1392f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case 0x480: prio = BOOK3S_IRQPRIO_INST_SEGMENT; break; 1402f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case 0x500: prio = BOOK3S_IRQPRIO_EXTERNAL; break; 1412f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case 0x600: prio = BOOK3S_IRQPRIO_ALIGNMENT; break; 1422f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case 0x700: prio = BOOK3S_IRQPRIO_PROGRAM; break; 1432f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case 0x800: prio = BOOK3S_IRQPRIO_FP_UNAVAIL; break; 1442f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case 0x900: prio = BOOK3S_IRQPRIO_DECREMENTER; break; 1452f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case 0xc00: prio = BOOK3S_IRQPRIO_SYSCALL; break; 1462f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case 0xd00: prio = BOOK3S_IRQPRIO_DEBUG; break; 1472f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case 0xf20: prio = BOOK3S_IRQPRIO_ALTIVEC; break; 1482f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case 0xf40: prio = BOOK3S_IRQPRIO_VSX; break; 1492f4cf5e42d13974763276e918618f76a4188e391Alexander Graf default: prio = BOOK3S_IRQPRIO_MAX; break; 1502f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 1512f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 1522f4cf5e42d13974763276e918618f76a4188e391Alexander Graf set_bit(prio, &vcpu->arch.pending_exceptions); 1532f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#ifdef EXIT_DEBUG 1542f4cf5e42d13974763276e918618f76a4188e391Alexander Graf printk(KERN_INFO "Queueing interrupt %x\n", vec); 1552f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#endif 1562f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 1572f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 1582f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 1592f4cf5e42d13974763276e918618f76a4188e391Alexander Grafvoid kvmppc_core_queue_program(struct kvm_vcpu *vcpu) 1602f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 1612f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_book3s_queue_irqprio(vcpu, BOOK3S_INTERRUPT_PROGRAM); 1622f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 1632f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 1642f4cf5e42d13974763276e918618f76a4188e391Alexander Grafvoid kvmppc_core_queue_dec(struct kvm_vcpu *vcpu) 1652f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 1662f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_book3s_queue_irqprio(vcpu, BOOK3S_INTERRUPT_DECREMENTER); 1672f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 1682f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 1692f4cf5e42d13974763276e918618f76a4188e391Alexander Grafint kvmppc_core_pending_dec(struct kvm_vcpu *vcpu) 1702f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 1712f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return test_bit(BOOK3S_INTERRUPT_DECREMENTER >> 7, &vcpu->arch.pending_exceptions); 1722f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 1732f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 1742f4cf5e42d13974763276e918618f76a4188e391Alexander Grafvoid kvmppc_core_queue_external(struct kvm_vcpu *vcpu, 1752f4cf5e42d13974763276e918618f76a4188e391Alexander Graf struct kvm_interrupt *irq) 1762f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 1772f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_book3s_queue_irqprio(vcpu, BOOK3S_INTERRUPT_EXTERNAL); 1782f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 1792f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 1802f4cf5e42d13974763276e918618f76a4188e391Alexander Grafint kvmppc_book3s_irqprio_deliver(struct kvm_vcpu *vcpu, unsigned int priority) 1812f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 1822f4cf5e42d13974763276e918618f76a4188e391Alexander Graf int deliver = 1; 1832f4cf5e42d13974763276e918618f76a4188e391Alexander Graf int vec = 0; 1842f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 1852f4cf5e42d13974763276e918618f76a4188e391Alexander Graf switch (priority) { 1862f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_IRQPRIO_DECREMENTER: 1872f4cf5e42d13974763276e918618f76a4188e391Alexander Graf deliver = vcpu->arch.msr & MSR_EE; 1882f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vec = BOOK3S_INTERRUPT_DECREMENTER; 1892f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 1902f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_IRQPRIO_EXTERNAL: 1912f4cf5e42d13974763276e918618f76a4188e391Alexander Graf deliver = vcpu->arch.msr & MSR_EE; 1922f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vec = BOOK3S_INTERRUPT_EXTERNAL; 1932f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 1942f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_IRQPRIO_SYSTEM_RESET: 1952f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vec = BOOK3S_INTERRUPT_SYSTEM_RESET; 1962f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 1972f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_IRQPRIO_MACHINE_CHECK: 1982f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vec = BOOK3S_INTERRUPT_MACHINE_CHECK; 1992f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 2002f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_IRQPRIO_DATA_STORAGE: 2012f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vec = BOOK3S_INTERRUPT_DATA_STORAGE; 2022f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 2032f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_IRQPRIO_INST_STORAGE: 2042f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vec = BOOK3S_INTERRUPT_INST_STORAGE; 2052f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 2062f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_IRQPRIO_DATA_SEGMENT: 2072f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vec = BOOK3S_INTERRUPT_DATA_SEGMENT; 2082f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 2092f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_IRQPRIO_INST_SEGMENT: 2102f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vec = BOOK3S_INTERRUPT_INST_SEGMENT; 2112f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 2122f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_IRQPRIO_ALIGNMENT: 2132f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vec = BOOK3S_INTERRUPT_ALIGNMENT; 2142f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 2152f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_IRQPRIO_PROGRAM: 2162f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vec = BOOK3S_INTERRUPT_PROGRAM; 2172f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 2182f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_IRQPRIO_VSX: 2192f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vec = BOOK3S_INTERRUPT_VSX; 2202f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 2212f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_IRQPRIO_ALTIVEC: 2222f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vec = BOOK3S_INTERRUPT_ALTIVEC; 2232f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 2242f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_IRQPRIO_FP_UNAVAIL: 2252f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vec = BOOK3S_INTERRUPT_FP_UNAVAIL; 2262f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 2272f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_IRQPRIO_SYSCALL: 2282f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vec = BOOK3S_INTERRUPT_SYSCALL; 2292f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 2302f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_IRQPRIO_DEBUG: 2312f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vec = BOOK3S_INTERRUPT_TRACE; 2322f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 2332f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_IRQPRIO_PERFORMANCE_MONITOR: 2342f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vec = BOOK3S_INTERRUPT_PERFMON; 2352f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 2362f4cf5e42d13974763276e918618f76a4188e391Alexander Graf default: 2372f4cf5e42d13974763276e918618f76a4188e391Alexander Graf deliver = 0; 2382f4cf5e42d13974763276e918618f76a4188e391Alexander Graf printk(KERN_ERR "KVM: Unknown interrupt: 0x%x\n", priority); 2392f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 2402f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 2412f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 2422f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#if 0 2432f4cf5e42d13974763276e918618f76a4188e391Alexander Graf printk(KERN_INFO "Deliver interrupt 0x%x? %x\n", vec, deliver); 2442f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#endif 2452f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 2462f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (deliver) 2472f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_inject_interrupt(vcpu, vec, 0ULL); 2482f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 2492f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return deliver; 2502f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 2512f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 2522f4cf5e42d13974763276e918618f76a4188e391Alexander Grafvoid kvmppc_core_deliver_interrupts(struct kvm_vcpu *vcpu) 2532f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 2542f4cf5e42d13974763276e918618f76a4188e391Alexander Graf unsigned long *pending = &vcpu->arch.pending_exceptions; 2552f4cf5e42d13974763276e918618f76a4188e391Alexander Graf unsigned int priority; 2562f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 2572f4cf5e42d13974763276e918618f76a4188e391Alexander Graf /* XXX be more clever here - no need to mftb() on every entry */ 2582f4cf5e42d13974763276e918618f76a4188e391Alexander Graf /* Issue DEC again if it's still active */ 2592f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#ifdef AGGRESSIVE_DEC 2602f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (vcpu->arch.msr & MSR_EE) 2612f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (kvmppc_get_dec(vcpu) & 0x80000000) 2622f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_core_queue_dec(vcpu); 2632f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#endif 2642f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 2652f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#ifdef EXIT_DEBUG 2662f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (vcpu->arch.pending_exceptions) 2672f4cf5e42d13974763276e918618f76a4188e391Alexander Graf printk(KERN_EMERG "KVM: Check pending: %lx\n", vcpu->arch.pending_exceptions); 2682f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#endif 2692f4cf5e42d13974763276e918618f76a4188e391Alexander Graf priority = __ffs(*pending); 2702f4cf5e42d13974763276e918618f76a4188e391Alexander Graf while (priority <= (sizeof(unsigned int) * 8)) { 2712f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (kvmppc_book3s_irqprio_deliver(vcpu, priority)) { 2722f4cf5e42d13974763276e918618f76a4188e391Alexander Graf clear_bit(priority, &vcpu->arch.pending_exceptions); 2732f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 2742f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 2752f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 2762f4cf5e42d13974763276e918618f76a4188e391Alexander Graf priority = find_next_bit(pending, 2772f4cf5e42d13974763276e918618f76a4188e391Alexander Graf BITS_PER_BYTE * sizeof(*pending), 2782f4cf5e42d13974763276e918618f76a4188e391Alexander Graf priority + 1); 2792f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 2802f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 2812f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 2822f4cf5e42d13974763276e918618f76a4188e391Alexander Grafvoid kvmppc_set_pvr(struct kvm_vcpu *vcpu, u32 pvr) 2832f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 2842f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.pvr = pvr; 2852f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if ((pvr >= 0x330000) && (pvr < 0x70330000)) { 2862f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_mmu_book3s_64_init(vcpu); 2872f4cf5e42d13974763276e918618f76a4188e391Alexander Graf to_book3s(vcpu)->hior = 0xfff00000; 2882f4cf5e42d13974763276e918618f76a4188e391Alexander Graf to_book3s(vcpu)->msr_mask = 0xffffffffffffffffULL; 2892f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } else { 2902f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_mmu_book3s_32_init(vcpu); 2912f4cf5e42d13974763276e918618f76a4188e391Alexander Graf to_book3s(vcpu)->hior = 0; 2922f4cf5e42d13974763276e918618f76a4188e391Alexander Graf to_book3s(vcpu)->msr_mask = 0xffffffffULL; 2932f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 2942f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 2952f4cf5e42d13974763276e918618f76a4188e391Alexander Graf /* If we are in hypervisor level on 970, we can tell the CPU to 2962f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * treat DCBZ as 32 bytes store */ 2972f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.hflags &= ~BOOK3S_HFLAG_DCBZ32; 2982f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (vcpu->arch.mmu.is_dcbz32(vcpu) && (mfmsr() & MSR_HV) && 2992f4cf5e42d13974763276e918618f76a4188e391Alexander Graf !strcmp(cur_cpu_spec->platform, "ppc970")) 3002f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.hflags |= BOOK3S_HFLAG_DCBZ32; 3012f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 3022f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 3032f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 3042f4cf5e42d13974763276e918618f76a4188e391Alexander Graf/* Book3s_32 CPUs always have 32 bytes cache line size, which Linux assumes. To 3052f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * make Book3s_32 Linux work on Book3s_64, we have to make sure we trap dcbz to 3062f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * emulate 32 bytes dcbz length. 3072f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * 3082f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * The Book3s_64 inventors also realized this case and implemented a special bit 3092f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * in the HID5 register, which is a hypervisor ressource. Thus we can't use it. 3102f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * 3112f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * My approach here is to patch the dcbz instruction on executing pages. 3122f4cf5e42d13974763276e918618f76a4188e391Alexander Graf */ 3132f4cf5e42d13974763276e918618f76a4188e391Alexander Grafstatic void kvmppc_patch_dcbz(struct kvm_vcpu *vcpu, struct kvmppc_pte *pte) 3142f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 3152f4cf5e42d13974763276e918618f76a4188e391Alexander Graf bool touched = false; 3162f4cf5e42d13974763276e918618f76a4188e391Alexander Graf hva_t hpage; 3172f4cf5e42d13974763276e918618f76a4188e391Alexander Graf u32 *page; 3182f4cf5e42d13974763276e918618f76a4188e391Alexander Graf int i; 3192f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 3202f4cf5e42d13974763276e918618f76a4188e391Alexander Graf hpage = gfn_to_hva(vcpu->kvm, pte->raddr >> PAGE_SHIFT); 3212f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (kvm_is_error_hva(hpage)) 3222f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return; 3232f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 3242f4cf5e42d13974763276e918618f76a4188e391Alexander Graf hpage |= pte->raddr & ~PAGE_MASK; 3252f4cf5e42d13974763276e918618f76a4188e391Alexander Graf hpage &= ~0xFFFULL; 3262f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 3272f4cf5e42d13974763276e918618f76a4188e391Alexander Graf page = vmalloc(HW_PAGE_SIZE); 3282f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 3292f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (copy_from_user(page, (void __user *)hpage, HW_PAGE_SIZE)) 3302f4cf5e42d13974763276e918618f76a4188e391Alexander Graf goto out; 3312f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 3322f4cf5e42d13974763276e918618f76a4188e391Alexander Graf for (i=0; i < HW_PAGE_SIZE / 4; i++) 3332f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if ((page[i] & 0xff0007ff) == INS_DCBZ) { 3342f4cf5e42d13974763276e918618f76a4188e391Alexander Graf page[i] &= 0xfffffff7; // reserved instruction, so we trap 3352f4cf5e42d13974763276e918618f76a4188e391Alexander Graf touched = true; 3362f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 3372f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 3382f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (touched) 3392f4cf5e42d13974763276e918618f76a4188e391Alexander Graf copy_to_user((void __user *)hpage, page, HW_PAGE_SIZE); 3402f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 3412f4cf5e42d13974763276e918618f76a4188e391Alexander Grafout: 3422f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vfree(page); 3432f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 3442f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 3452f4cf5e42d13974763276e918618f76a4188e391Alexander Grafstatic int kvmppc_xlate(struct kvm_vcpu *vcpu, ulong eaddr, bool data, 3462f4cf5e42d13974763276e918618f76a4188e391Alexander Graf struct kvmppc_pte *pte) 3472f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 3482f4cf5e42d13974763276e918618f76a4188e391Alexander Graf int relocated = (vcpu->arch.msr & (data ? MSR_DR : MSR_IR)); 3492f4cf5e42d13974763276e918618f76a4188e391Alexander Graf int r; 3502f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 3512f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (relocated) { 3522f4cf5e42d13974763276e918618f76a4188e391Alexander Graf r = vcpu->arch.mmu.xlate(vcpu, eaddr, pte, data); 3532f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } else { 3542f4cf5e42d13974763276e918618f76a4188e391Alexander Graf pte->eaddr = eaddr; 3552f4cf5e42d13974763276e918618f76a4188e391Alexander Graf pte->raddr = eaddr & 0xffffffff; 3562f4cf5e42d13974763276e918618f76a4188e391Alexander Graf pte->vpage = eaddr >> 12; 3572f4cf5e42d13974763276e918618f76a4188e391Alexander Graf switch (vcpu->arch.msr & (MSR_DR|MSR_IR)) { 3582f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case 0: 3592f4cf5e42d13974763276e918618f76a4188e391Alexander Graf pte->vpage |= VSID_REAL; 3602f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case MSR_DR: 3612f4cf5e42d13974763276e918618f76a4188e391Alexander Graf pte->vpage |= VSID_REAL_DR; 3622f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case MSR_IR: 3632f4cf5e42d13974763276e918618f76a4188e391Alexander Graf pte->vpage |= VSID_REAL_IR; 3642f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 3652f4cf5e42d13974763276e918618f76a4188e391Alexander Graf pte->may_read = true; 3662f4cf5e42d13974763276e918618f76a4188e391Alexander Graf pte->may_write = true; 3672f4cf5e42d13974763276e918618f76a4188e391Alexander Graf pte->may_execute = true; 3682f4cf5e42d13974763276e918618f76a4188e391Alexander Graf r = 0; 3692f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 3702f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 3712f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return r; 3722f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 3732f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 3742f4cf5e42d13974763276e918618f76a4188e391Alexander Grafstatic hva_t kvmppc_bad_hva(void) 3752f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 3762f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return PAGE_OFFSET; 3772f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 3782f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 3792f4cf5e42d13974763276e918618f76a4188e391Alexander Grafstatic hva_t kvmppc_pte_to_hva(struct kvm_vcpu *vcpu, struct kvmppc_pte *pte, 3802f4cf5e42d13974763276e918618f76a4188e391Alexander Graf bool read) 3812f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 3822f4cf5e42d13974763276e918618f76a4188e391Alexander Graf hva_t hpage; 3832f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 3842f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (read && !pte->may_read) 3852f4cf5e42d13974763276e918618f76a4188e391Alexander Graf goto err; 3862f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 3872f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (!read && !pte->may_write) 3882f4cf5e42d13974763276e918618f76a4188e391Alexander Graf goto err; 3892f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 3902f4cf5e42d13974763276e918618f76a4188e391Alexander Graf hpage = gfn_to_hva(vcpu->kvm, pte->raddr >> PAGE_SHIFT); 3912f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (kvm_is_error_hva(hpage)) 3922f4cf5e42d13974763276e918618f76a4188e391Alexander Graf goto err; 3932f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 3942f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return hpage | (pte->raddr & ~PAGE_MASK); 3952f4cf5e42d13974763276e918618f76a4188e391Alexander Graferr: 3962f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return kvmppc_bad_hva(); 3972f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 3982f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 3992f4cf5e42d13974763276e918618f76a4188e391Alexander Grafint kvmppc_st(struct kvm_vcpu *vcpu, ulong eaddr, int size, void *ptr) 4002f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 4012f4cf5e42d13974763276e918618f76a4188e391Alexander Graf struct kvmppc_pte pte; 4022f4cf5e42d13974763276e918618f76a4188e391Alexander Graf hva_t hva = eaddr; 4032f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 4042f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->stat.st++; 4052f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 4062f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (kvmppc_xlate(vcpu, eaddr, false, &pte)) 4072f4cf5e42d13974763276e918618f76a4188e391Alexander Graf goto err; 4082f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 4092f4cf5e42d13974763276e918618f76a4188e391Alexander Graf hva = kvmppc_pte_to_hva(vcpu, &pte, false); 4102f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (kvm_is_error_hva(hva)) 4112f4cf5e42d13974763276e918618f76a4188e391Alexander Graf goto err; 4122f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 4132f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (copy_to_user((void __user *)hva, ptr, size)) { 4142f4cf5e42d13974763276e918618f76a4188e391Alexander Graf printk(KERN_INFO "kvmppc_st at 0x%lx failed\n", hva); 4152f4cf5e42d13974763276e918618f76a4188e391Alexander Graf goto err; 4162f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 4172f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 4182f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return 0; 4192f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 4202f4cf5e42d13974763276e918618f76a4188e391Alexander Graferr: 4212f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return -ENOENT; 4222f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 4232f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 4242f4cf5e42d13974763276e918618f76a4188e391Alexander Grafint kvmppc_ld(struct kvm_vcpu *vcpu, ulong eaddr, int size, void *ptr, 4252f4cf5e42d13974763276e918618f76a4188e391Alexander Graf bool data) 4262f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 4272f4cf5e42d13974763276e918618f76a4188e391Alexander Graf struct kvmppc_pte pte; 4282f4cf5e42d13974763276e918618f76a4188e391Alexander Graf hva_t hva = eaddr; 4292f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 4302f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->stat.ld++; 4312f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 4322f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (kvmppc_xlate(vcpu, eaddr, data, &pte)) 4332f4cf5e42d13974763276e918618f76a4188e391Alexander Graf goto err; 4342f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 4352f4cf5e42d13974763276e918618f76a4188e391Alexander Graf hva = kvmppc_pte_to_hva(vcpu, &pte, true); 4362f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (kvm_is_error_hva(hva)) 4372f4cf5e42d13974763276e918618f76a4188e391Alexander Graf goto err; 4382f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 4392f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (copy_from_user(ptr, (void __user *)hva, size)) { 4402f4cf5e42d13974763276e918618f76a4188e391Alexander Graf printk(KERN_INFO "kvmppc_ld at 0x%lx failed\n", hva); 4412f4cf5e42d13974763276e918618f76a4188e391Alexander Graf goto err; 4422f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 4432f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 4442f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return 0; 4452f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 4462f4cf5e42d13974763276e918618f76a4188e391Alexander Graferr: 4472f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return -ENOENT; 4482f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 4492f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 4502f4cf5e42d13974763276e918618f76a4188e391Alexander Grafstatic int kvmppc_visible_gfn(struct kvm_vcpu *vcpu, gfn_t gfn) 4512f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 4522f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return kvm_is_visible_gfn(vcpu->kvm, gfn); 4532f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 4542f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 4552f4cf5e42d13974763276e918618f76a4188e391Alexander Grafint kvmppc_handle_pagefault(struct kvm_run *run, struct kvm_vcpu *vcpu, 4562f4cf5e42d13974763276e918618f76a4188e391Alexander Graf ulong eaddr, int vec) 4572f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 4582f4cf5e42d13974763276e918618f76a4188e391Alexander Graf bool data = (vec == BOOK3S_INTERRUPT_DATA_STORAGE); 4592f4cf5e42d13974763276e918618f76a4188e391Alexander Graf int r = RESUME_GUEST; 4602f4cf5e42d13974763276e918618f76a4188e391Alexander Graf int relocated; 4612f4cf5e42d13974763276e918618f76a4188e391Alexander Graf int page_found = 0; 4622f4cf5e42d13974763276e918618f76a4188e391Alexander Graf struct kvmppc_pte pte; 4632f4cf5e42d13974763276e918618f76a4188e391Alexander Graf bool is_mmio = false; 4642f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 4652f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if ( vec == BOOK3S_INTERRUPT_DATA_STORAGE ) { 4662f4cf5e42d13974763276e918618f76a4188e391Alexander Graf relocated = (vcpu->arch.msr & MSR_DR); 4672f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } else { 4682f4cf5e42d13974763276e918618f76a4188e391Alexander Graf relocated = (vcpu->arch.msr & MSR_IR); 4692f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 4702f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 4712f4cf5e42d13974763276e918618f76a4188e391Alexander Graf /* Resolve real address if translation turned on */ 4722f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (relocated) { 4732f4cf5e42d13974763276e918618f76a4188e391Alexander Graf page_found = vcpu->arch.mmu.xlate(vcpu, eaddr, &pte, data); 4742f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } else { 4752f4cf5e42d13974763276e918618f76a4188e391Alexander Graf pte.may_execute = true; 4762f4cf5e42d13974763276e918618f76a4188e391Alexander Graf pte.may_read = true; 4772f4cf5e42d13974763276e918618f76a4188e391Alexander Graf pte.may_write = true; 4782f4cf5e42d13974763276e918618f76a4188e391Alexander Graf pte.raddr = eaddr & 0xffffffff; 4792f4cf5e42d13974763276e918618f76a4188e391Alexander Graf pte.eaddr = eaddr; 4802f4cf5e42d13974763276e918618f76a4188e391Alexander Graf pte.vpage = eaddr >> 12; 4812f4cf5e42d13974763276e918618f76a4188e391Alexander Graf switch (vcpu->arch.msr & (MSR_DR|MSR_IR)) { 4822f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case 0: 4832f4cf5e42d13974763276e918618f76a4188e391Alexander Graf pte.vpage |= VSID_REAL; 4842f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case MSR_DR: 4852f4cf5e42d13974763276e918618f76a4188e391Alexander Graf pte.vpage |= VSID_REAL_DR; 4862f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case MSR_IR: 4872f4cf5e42d13974763276e918618f76a4188e391Alexander Graf pte.vpage |= VSID_REAL_IR; 4882f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 4892f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 4902f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 4912f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (vcpu->arch.mmu.is_dcbz32(vcpu) && 4922f4cf5e42d13974763276e918618f76a4188e391Alexander Graf (!(vcpu->arch.hflags & BOOK3S_HFLAG_DCBZ32))) { 4932f4cf5e42d13974763276e918618f76a4188e391Alexander Graf /* 4942f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * If we do the dcbz hack, we have to NX on every execution, 4952f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * so we can patch the executing code. This renders our guest 4962f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * NX-less. 4972f4cf5e42d13974763276e918618f76a4188e391Alexander Graf */ 4982f4cf5e42d13974763276e918618f76a4188e391Alexander Graf pte.may_execute = !data; 4992f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 5002f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 5012f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (page_found == -ENOENT) { 5022f4cf5e42d13974763276e918618f76a4188e391Alexander Graf /* Page not found in guest PTE entries */ 5032f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.dear = vcpu->arch.fault_dear; 5042f4cf5e42d13974763276e918618f76a4188e391Alexander Graf to_book3s(vcpu)->dsisr = vcpu->arch.fault_dsisr; 5052f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.msr |= (vcpu->arch.shadow_msr & 0x00000000f8000000ULL); 5062f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_book3s_queue_irqprio(vcpu, vec); 5072f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } else if (page_found == -EPERM) { 5082f4cf5e42d13974763276e918618f76a4188e391Alexander Graf /* Storage protection */ 5092f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.dear = vcpu->arch.fault_dear; 5102f4cf5e42d13974763276e918618f76a4188e391Alexander Graf to_book3s(vcpu)->dsisr = vcpu->arch.fault_dsisr & ~DSISR_NOHPTE; 5112f4cf5e42d13974763276e918618f76a4188e391Alexander Graf to_book3s(vcpu)->dsisr |= DSISR_PROTFAULT; 5122f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.msr |= (vcpu->arch.shadow_msr & 0x00000000f8000000ULL); 5132f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_book3s_queue_irqprio(vcpu, vec); 5142f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } else if (page_found == -EINVAL) { 5152f4cf5e42d13974763276e918618f76a4188e391Alexander Graf /* Page not found in guest SLB */ 5162f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.dear = vcpu->arch.fault_dear; 5172f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_book3s_queue_irqprio(vcpu, vec + 0x80); 5182f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } else if (!is_mmio && 5192f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_visible_gfn(vcpu, pte.raddr >> PAGE_SHIFT)) { 5202f4cf5e42d13974763276e918618f76a4188e391Alexander Graf /* The guest's PTE is not mapped yet. Map on the host */ 5212f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_mmu_map_page(vcpu, &pte); 5222f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (data) 5232f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->stat.sp_storage++; 5242f4cf5e42d13974763276e918618f76a4188e391Alexander Graf else if (vcpu->arch.mmu.is_dcbz32(vcpu) && 5252f4cf5e42d13974763276e918618f76a4188e391Alexander Graf (!(vcpu->arch.hflags & BOOK3S_HFLAG_DCBZ32))) 5262f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_patch_dcbz(vcpu, &pte); 5272f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } else { 5282f4cf5e42d13974763276e918618f76a4188e391Alexander Graf /* MMIO */ 5292f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->stat.mmio_exits++; 5302f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.paddr_accessed = pte.raddr; 5312f4cf5e42d13974763276e918618f76a4188e391Alexander Graf r = kvmppc_emulate_mmio(run, vcpu); 5322f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if ( r == RESUME_HOST_NV ) 5332f4cf5e42d13974763276e918618f76a4188e391Alexander Graf r = RESUME_HOST; 5342f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if ( r == RESUME_GUEST_NV ) 5352f4cf5e42d13974763276e918618f76a4188e391Alexander Graf r = RESUME_GUEST; 5362f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 5372f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 5382f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return r; 5392f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 5402f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 5412f4cf5e42d13974763276e918618f76a4188e391Alexander Grafint kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu, 5422f4cf5e42d13974763276e918618f76a4188e391Alexander Graf unsigned int exit_nr) 5432f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 5442f4cf5e42d13974763276e918618f76a4188e391Alexander Graf int r = RESUME_HOST; 5452f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 5462f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->stat.sum_exits++; 5472f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 5482f4cf5e42d13974763276e918618f76a4188e391Alexander Graf run->exit_reason = KVM_EXIT_UNKNOWN; 5492f4cf5e42d13974763276e918618f76a4188e391Alexander Graf run->ready_for_interrupt_injection = 1; 5502f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#ifdef EXIT_DEBUG 5512f4cf5e42d13974763276e918618f76a4188e391Alexander Graf printk(KERN_EMERG "exit_nr=0x%x | pc=0x%lx | dar=0x%lx | dec=0x%x | msr=0x%lx\n", 5522f4cf5e42d13974763276e918618f76a4188e391Alexander Graf exit_nr, vcpu->arch.pc, vcpu->arch.fault_dear, 5532f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_get_dec(vcpu), vcpu->arch.msr); 5542f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#elif defined (EXIT_DEBUG_SIMPLE) 5552f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if ((exit_nr != 0x900) && (exit_nr != 0x500)) 5562f4cf5e42d13974763276e918618f76a4188e391Alexander Graf printk(KERN_EMERG "exit_nr=0x%x | pc=0x%lx | dar=0x%lx | msr=0x%lx\n", 5572f4cf5e42d13974763276e918618f76a4188e391Alexander Graf exit_nr, vcpu->arch.pc, vcpu->arch.fault_dear, 5582f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.msr); 5592f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#endif 5602f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvm_resched(vcpu); 5612f4cf5e42d13974763276e918618f76a4188e391Alexander Graf switch (exit_nr) { 5622f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_INTERRUPT_INST_STORAGE: 5632f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->stat.pf_instruc++; 5642f4cf5e42d13974763276e918618f76a4188e391Alexander Graf /* only care about PTEG not found errors, but leave NX alone */ 5652f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (vcpu->arch.shadow_msr & 0x40000000) { 5662f4cf5e42d13974763276e918618f76a4188e391Alexander Graf r = kvmppc_handle_pagefault(run, vcpu, vcpu->arch.pc, exit_nr); 5672f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->stat.sp_instruc++; 5682f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } else if (vcpu->arch.mmu.is_dcbz32(vcpu) && 5692f4cf5e42d13974763276e918618f76a4188e391Alexander Graf (!(vcpu->arch.hflags & BOOK3S_HFLAG_DCBZ32))) { 5702f4cf5e42d13974763276e918618f76a4188e391Alexander Graf /* 5712f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * XXX If we do the dcbz hack we use the NX bit to flush&patch the page, 5722f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * so we can't use the NX bit inside the guest. Let's cross our fingers, 5732f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * that no guest that needs the dcbz hack does NX. 5742f4cf5e42d13974763276e918618f76a4188e391Alexander Graf */ 5752f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_mmu_pte_flush(vcpu, vcpu->arch.pc, ~0xFFFULL); 5762f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } else { 5772f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.msr |= (vcpu->arch.shadow_msr & 0x58000000); 5782f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_book3s_queue_irqprio(vcpu, exit_nr); 5792f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_mmu_pte_flush(vcpu, vcpu->arch.pc, ~0xFFFULL); 5802f4cf5e42d13974763276e918618f76a4188e391Alexander Graf r = RESUME_GUEST; 5812f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 5822f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 5832f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_INTERRUPT_DATA_STORAGE: 5842f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->stat.pf_storage++; 5852f4cf5e42d13974763276e918618f76a4188e391Alexander Graf /* The only case we need to handle is missing shadow PTEs */ 5862f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (vcpu->arch.fault_dsisr & DSISR_NOHPTE) { 5872f4cf5e42d13974763276e918618f76a4188e391Alexander Graf r = kvmppc_handle_pagefault(run, vcpu, vcpu->arch.fault_dear, exit_nr); 5882f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } else { 5892f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.dear = vcpu->arch.fault_dear; 5902f4cf5e42d13974763276e918618f76a4188e391Alexander Graf to_book3s(vcpu)->dsisr = vcpu->arch.fault_dsisr; 5912f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_book3s_queue_irqprio(vcpu, exit_nr); 5922f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_mmu_pte_flush(vcpu, vcpu->arch.dear, ~0xFFFULL); 5932f4cf5e42d13974763276e918618f76a4188e391Alexander Graf r = RESUME_GUEST; 5942f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 5952f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 5962f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_INTERRUPT_DATA_SEGMENT: 5972f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (kvmppc_mmu_map_segment(vcpu, vcpu->arch.fault_dear) < 0) { 5982f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.dear = vcpu->arch.fault_dear; 5992f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_book3s_queue_irqprio(vcpu, 6002f4cf5e42d13974763276e918618f76a4188e391Alexander Graf BOOK3S_INTERRUPT_DATA_SEGMENT); 6012f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 6022f4cf5e42d13974763276e918618f76a4188e391Alexander Graf r = RESUME_GUEST; 6032f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 6042f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_INTERRUPT_INST_SEGMENT: 6052f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (kvmppc_mmu_map_segment(vcpu, vcpu->arch.pc) < 0) { 6062f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_book3s_queue_irqprio(vcpu, 6072f4cf5e42d13974763276e918618f76a4188e391Alexander Graf BOOK3S_INTERRUPT_INST_SEGMENT); 6082f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 6092f4cf5e42d13974763276e918618f76a4188e391Alexander Graf r = RESUME_GUEST; 6102f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 6112f4cf5e42d13974763276e918618f76a4188e391Alexander Graf /* We're good on these - the host merely wanted to get our attention */ 6122f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_INTERRUPT_DECREMENTER: 6132f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->stat.dec_exits++; 6142f4cf5e42d13974763276e918618f76a4188e391Alexander Graf r = RESUME_GUEST; 6152f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 6162f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_INTERRUPT_EXTERNAL: 6172f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->stat.ext_intr_exits++; 6182f4cf5e42d13974763276e918618f76a4188e391Alexander Graf r = RESUME_GUEST; 6192f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 6202f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_INTERRUPT_PROGRAM: 6212f4cf5e42d13974763276e918618f76a4188e391Alexander Graf { 6222f4cf5e42d13974763276e918618f76a4188e391Alexander Graf enum emulation_result er; 6232f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 6242f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (vcpu->arch.msr & MSR_PR) { 6252f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#ifdef EXIT_DEBUG 6262f4cf5e42d13974763276e918618f76a4188e391Alexander Graf printk(KERN_INFO "Userspace triggered 0x700 exception at 0x%lx (0x%x)\n", vcpu->arch.pc, vcpu->arch.last_inst); 6272f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#endif 6282f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if ((vcpu->arch.last_inst & 0xff0007ff) != 6292f4cf5e42d13974763276e918618f76a4188e391Alexander Graf (INS_DCBZ & 0xfffffff7)) { 6302f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_book3s_queue_irqprio(vcpu, exit_nr); 6312f4cf5e42d13974763276e918618f76a4188e391Alexander Graf r = RESUME_GUEST; 6322f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 6332f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 6342f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 6352f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 6362f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->stat.emulated_inst_exits++; 6372f4cf5e42d13974763276e918618f76a4188e391Alexander Graf er = kvmppc_emulate_instruction(run, vcpu); 6382f4cf5e42d13974763276e918618f76a4188e391Alexander Graf switch (er) { 6392f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case EMULATE_DONE: 6402f4cf5e42d13974763276e918618f76a4188e391Alexander Graf r = RESUME_GUEST; 6412f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 6422f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case EMULATE_FAIL: 6432f4cf5e42d13974763276e918618f76a4188e391Alexander Graf printk(KERN_CRIT "%s: emulation at %lx failed (%08x)\n", 6442f4cf5e42d13974763276e918618f76a4188e391Alexander Graf __func__, vcpu->arch.pc, vcpu->arch.last_inst); 6452f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_book3s_queue_irqprio(vcpu, exit_nr); 6462f4cf5e42d13974763276e918618f76a4188e391Alexander Graf r = RESUME_GUEST; 6472f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 6482f4cf5e42d13974763276e918618f76a4188e391Alexander Graf default: 6492f4cf5e42d13974763276e918618f76a4188e391Alexander Graf BUG(); 6502f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 6512f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 6522f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 6532f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_INTERRUPT_SYSCALL: 6542f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#ifdef EXIT_DEBUG 6552f4cf5e42d13974763276e918618f76a4188e391Alexander Graf printk(KERN_INFO "Syscall Nr %d\n", (int)vcpu->arch.gpr[0]); 6562f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#endif 6572f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->stat.syscall_exits++; 6582f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_book3s_queue_irqprio(vcpu, exit_nr); 6592f4cf5e42d13974763276e918618f76a4188e391Alexander Graf r = RESUME_GUEST; 6602f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 6612f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_INTERRUPT_MACHINE_CHECK: 6622f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_INTERRUPT_FP_UNAVAIL: 6632f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_INTERRUPT_TRACE: 6642f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_INTERRUPT_ALTIVEC: 6652f4cf5e42d13974763276e918618f76a4188e391Alexander Graf case BOOK3S_INTERRUPT_VSX: 6662f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_book3s_queue_irqprio(vcpu, exit_nr); 6672f4cf5e42d13974763276e918618f76a4188e391Alexander Graf r = RESUME_GUEST; 6682f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 6692f4cf5e42d13974763276e918618f76a4188e391Alexander Graf default: 6702f4cf5e42d13974763276e918618f76a4188e391Alexander Graf /* Ugh - bork here! What did we get? */ 6712f4cf5e42d13974763276e918618f76a4188e391Alexander Graf printk(KERN_EMERG "exit_nr=0x%x | pc=0x%lx | msr=0x%lx\n", exit_nr, vcpu->arch.pc, vcpu->arch.shadow_msr); 6722f4cf5e42d13974763276e918618f76a4188e391Alexander Graf r = RESUME_HOST; 6732f4cf5e42d13974763276e918618f76a4188e391Alexander Graf BUG(); 6742f4cf5e42d13974763276e918618f76a4188e391Alexander Graf break; 6752f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 6762f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 6772f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 6782f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (!(r & RESUME_HOST)) { 6792f4cf5e42d13974763276e918618f76a4188e391Alexander Graf /* To avoid clobbering exit_reason, only check for signals if 6802f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * we aren't already exiting to userspace for some other 6812f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * reason. */ 6822f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (signal_pending(current)) { 6832f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#ifdef EXIT_DEBUG 6842f4cf5e42d13974763276e918618f76a4188e391Alexander Graf printk(KERN_EMERG "KVM: Going back to host\n"); 6852f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#endif 6862f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->stat.signal_exits++; 6872f4cf5e42d13974763276e918618f76a4188e391Alexander Graf run->exit_reason = KVM_EXIT_INTR; 6882f4cf5e42d13974763276e918618f76a4188e391Alexander Graf r = -EINTR; 6892f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } else { 6902f4cf5e42d13974763276e918618f76a4188e391Alexander Graf /* In case an interrupt came in that was triggered 6912f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * from userspace (like DEC), we need to check what 6922f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * to inject now! */ 6932f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_core_deliver_interrupts(vcpu); 6942f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 6952f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 6962f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 6972f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#ifdef EXIT_DEBUG 6982f4cf5e42d13974763276e918618f76a4188e391Alexander Graf printk(KERN_EMERG "KVM exit: vcpu=0x%p pc=0x%lx r=0x%x\n", vcpu, vcpu->arch.pc, r); 6992f4cf5e42d13974763276e918618f76a4188e391Alexander Graf#endif 7002f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 7012f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return r; 7022f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 7032f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 7042f4cf5e42d13974763276e918618f76a4188e391Alexander Grafint kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu) 7052f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 7062f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return 0; 7072f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 7082f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 7092f4cf5e42d13974763276e918618f76a4188e391Alexander Grafint kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) 7102f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 7112f4cf5e42d13974763276e918618f76a4188e391Alexander Graf int i; 7122f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 7132f4cf5e42d13974763276e918618f76a4188e391Alexander Graf regs->pc = vcpu->arch.pc; 7142f4cf5e42d13974763276e918618f76a4188e391Alexander Graf regs->cr = vcpu->arch.cr; 7152f4cf5e42d13974763276e918618f76a4188e391Alexander Graf regs->ctr = vcpu->arch.ctr; 7162f4cf5e42d13974763276e918618f76a4188e391Alexander Graf regs->lr = vcpu->arch.lr; 7172f4cf5e42d13974763276e918618f76a4188e391Alexander Graf regs->xer = vcpu->arch.xer; 7182f4cf5e42d13974763276e918618f76a4188e391Alexander Graf regs->msr = vcpu->arch.msr; 7192f4cf5e42d13974763276e918618f76a4188e391Alexander Graf regs->srr0 = vcpu->arch.srr0; 7202f4cf5e42d13974763276e918618f76a4188e391Alexander Graf regs->srr1 = vcpu->arch.srr1; 7212f4cf5e42d13974763276e918618f76a4188e391Alexander Graf regs->pid = vcpu->arch.pid; 7222f4cf5e42d13974763276e918618f76a4188e391Alexander Graf regs->sprg0 = vcpu->arch.sprg0; 7232f4cf5e42d13974763276e918618f76a4188e391Alexander Graf regs->sprg1 = vcpu->arch.sprg1; 7242f4cf5e42d13974763276e918618f76a4188e391Alexander Graf regs->sprg2 = vcpu->arch.sprg2; 7252f4cf5e42d13974763276e918618f76a4188e391Alexander Graf regs->sprg3 = vcpu->arch.sprg3; 7262f4cf5e42d13974763276e918618f76a4188e391Alexander Graf regs->sprg5 = vcpu->arch.sprg4; 7272f4cf5e42d13974763276e918618f76a4188e391Alexander Graf regs->sprg6 = vcpu->arch.sprg5; 7282f4cf5e42d13974763276e918618f76a4188e391Alexander Graf regs->sprg7 = vcpu->arch.sprg6; 7292f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 7302f4cf5e42d13974763276e918618f76a4188e391Alexander Graf for (i = 0; i < ARRAY_SIZE(regs->gpr); i++) 7312f4cf5e42d13974763276e918618f76a4188e391Alexander Graf regs->gpr[i] = vcpu->arch.gpr[i]; 7322f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 7332f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return 0; 7342f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 7352f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 7362f4cf5e42d13974763276e918618f76a4188e391Alexander Grafint kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) 7372f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 7382f4cf5e42d13974763276e918618f76a4188e391Alexander Graf int i; 7392f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 7402f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.pc = regs->pc; 7412f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.cr = regs->cr; 7422f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.ctr = regs->ctr; 7432f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.lr = regs->lr; 7442f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.xer = regs->xer; 7452f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_set_msr(vcpu, regs->msr); 7462f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.srr0 = regs->srr0; 7472f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.srr1 = regs->srr1; 7482f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.sprg0 = regs->sprg0; 7492f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.sprg1 = regs->sprg1; 7502f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.sprg2 = regs->sprg2; 7512f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.sprg3 = regs->sprg3; 7522f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.sprg5 = regs->sprg4; 7532f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.sprg6 = regs->sprg5; 7542f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.sprg7 = regs->sprg6; 7552f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 7562f4cf5e42d13974763276e918618f76a4188e391Alexander Graf for (i = 0; i < ARRAY_SIZE(vcpu->arch.gpr); i++) 7572f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.gpr[i] = regs->gpr[i]; 7582f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 7592f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return 0; 7602f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 7612f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 7622f4cf5e42d13974763276e918618f76a4188e391Alexander Grafint kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu, 7632f4cf5e42d13974763276e918618f76a4188e391Alexander Graf struct kvm_sregs *sregs) 7642f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 7652f4cf5e42d13974763276e918618f76a4188e391Alexander Graf sregs->pvr = vcpu->arch.pvr; 7662f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return 0; 7672f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 7682f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 7692f4cf5e42d13974763276e918618f76a4188e391Alexander Grafint kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, 7702f4cf5e42d13974763276e918618f76a4188e391Alexander Graf struct kvm_sregs *sregs) 7712f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 7722f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_set_pvr(vcpu, sregs->pvr); 7732f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return 0; 7742f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 7752f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 7762f4cf5e42d13974763276e918618f76a4188e391Alexander Grafint kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu) 7772f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 7782f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return -ENOTSUPP; 7792f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 7802f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 7812f4cf5e42d13974763276e918618f76a4188e391Alexander Grafint kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu) 7822f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 7832f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return -ENOTSUPP; 7842f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 7852f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 7862f4cf5e42d13974763276e918618f76a4188e391Alexander Grafint kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu, 7872f4cf5e42d13974763276e918618f76a4188e391Alexander Graf struct kvm_translation *tr) 7882f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 7892f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return 0; 7902f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 7912f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 7922f4cf5e42d13974763276e918618f76a4188e391Alexander Graf/* 7932f4cf5e42d13974763276e918618f76a4188e391Alexander Graf * Get (and clear) the dirty memory log for a memory slot. 7942f4cf5e42d13974763276e918618f76a4188e391Alexander Graf */ 7952f4cf5e42d13974763276e918618f76a4188e391Alexander Grafint kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, 7962f4cf5e42d13974763276e918618f76a4188e391Alexander Graf struct kvm_dirty_log *log) 7972f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 7982f4cf5e42d13974763276e918618f76a4188e391Alexander Graf struct kvm_memory_slot *memslot; 7992f4cf5e42d13974763276e918618f76a4188e391Alexander Graf struct kvm_vcpu *vcpu; 8002f4cf5e42d13974763276e918618f76a4188e391Alexander Graf ulong ga, ga_end; 8012f4cf5e42d13974763276e918618f76a4188e391Alexander Graf int is_dirty = 0; 8022f4cf5e42d13974763276e918618f76a4188e391Alexander Graf int r, n; 8032f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 8042f4cf5e42d13974763276e918618f76a4188e391Alexander Graf down_write(&kvm->slots_lock); 8052f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 8062f4cf5e42d13974763276e918618f76a4188e391Alexander Graf r = kvm_get_dirty_log(kvm, log, &is_dirty); 8072f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (r) 8082f4cf5e42d13974763276e918618f76a4188e391Alexander Graf goto out; 8092f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 8102f4cf5e42d13974763276e918618f76a4188e391Alexander Graf /* If nothing is dirty, don't bother messing with page tables. */ 8112f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (is_dirty) { 8122f4cf5e42d13974763276e918618f76a4188e391Alexander Graf memslot = &kvm->memslots[log->slot]; 8132f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 8142f4cf5e42d13974763276e918618f76a4188e391Alexander Graf ga = memslot->base_gfn << PAGE_SHIFT; 8152f4cf5e42d13974763276e918618f76a4188e391Alexander Graf ga_end = ga + (memslot->npages << PAGE_SHIFT); 8162f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 8172f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvm_for_each_vcpu(n, vcpu, kvm) 8182f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_mmu_pte_pflush(vcpu, ga, ga_end); 8192f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 8202f4cf5e42d13974763276e918618f76a4188e391Alexander Graf n = ALIGN(memslot->npages, BITS_PER_LONG) / 8; 8212f4cf5e42d13974763276e918618f76a4188e391Alexander Graf memset(memslot->dirty_bitmap, 0, n); 8222f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 8232f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 8242f4cf5e42d13974763276e918618f76a4188e391Alexander Graf r = 0; 8252f4cf5e42d13974763276e918618f76a4188e391Alexander Grafout: 8262f4cf5e42d13974763276e918618f76a4188e391Alexander Graf up_write(&kvm->slots_lock); 8272f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return r; 8282f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 8292f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 8302f4cf5e42d13974763276e918618f76a4188e391Alexander Grafint kvmppc_core_check_processor_compat(void) 8312f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 8322f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return 0; 8332f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 8342f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 8352f4cf5e42d13974763276e918618f76a4188e391Alexander Grafstruct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm, unsigned int id) 8362f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 8372f4cf5e42d13974763276e918618f76a4188e391Alexander Graf struct kvmppc_vcpu_book3s *vcpu_book3s; 8382f4cf5e42d13974763276e918618f76a4188e391Alexander Graf struct kvm_vcpu *vcpu; 8392f4cf5e42d13974763276e918618f76a4188e391Alexander Graf int err; 8402f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 8412f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu_book3s = (struct kvmppc_vcpu_book3s *)__get_free_pages( GFP_KERNEL | __GFP_ZERO, 8422f4cf5e42d13974763276e918618f76a4188e391Alexander Graf get_order(sizeof(struct kvmppc_vcpu_book3s))); 8432f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (!vcpu_book3s) { 8442f4cf5e42d13974763276e918618f76a4188e391Alexander Graf err = -ENOMEM; 8452f4cf5e42d13974763276e918618f76a4188e391Alexander Graf goto out; 8462f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 8472f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 8482f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu = &vcpu_book3s->vcpu; 8492f4cf5e42d13974763276e918618f76a4188e391Alexander Graf err = kvm_vcpu_init(vcpu, kvm, id); 8502f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (err) 8512f4cf5e42d13974763276e918618f76a4188e391Alexander Graf goto free_vcpu; 8522f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 8532f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.host_retip = kvm_return_point; 8542f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.host_msr = mfmsr(); 8552f4cf5e42d13974763276e918618f76a4188e391Alexander Graf /* default to book3s_64 (970fx) */ 8562f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.pvr = 0x3C0301; 8572f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvmppc_set_pvr(vcpu, vcpu->arch.pvr); 8582f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu_book3s->slb_nr = 64; 8592f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 8602f4cf5e42d13974763276e918618f76a4188e391Alexander Graf /* remember where some real-mode handlers are */ 8612f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.trampoline_lowmem = kvmppc_trampoline_lowmem; 8622f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.trampoline_enter = kvmppc_trampoline_enter; 8632f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.highmem_handler = (ulong)kvmppc_handler_highmem; 8642f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 8652f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu->arch.shadow_msr = MSR_USER64; 8662f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 8672f4cf5e42d13974763276e918618f76a4188e391Alexander Graf err = __init_new_context(); 8682f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (err < 0) 8692f4cf5e42d13974763276e918618f76a4188e391Alexander Graf goto free_vcpu; 8702f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu_book3s->context_id = err; 8712f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 8722f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu_book3s->vsid_max = ((vcpu_book3s->context_id + 1) << USER_ESID_BITS) - 1; 8732f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu_book3s->vsid_first = vcpu_book3s->context_id << USER_ESID_BITS; 8742f4cf5e42d13974763276e918618f76a4188e391Alexander Graf vcpu_book3s->vsid_next = vcpu_book3s->vsid_first; 8752f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 8762f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return vcpu; 8772f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 8782f4cf5e42d13974763276e918618f76a4188e391Alexander Graffree_vcpu: 8792f4cf5e42d13974763276e918618f76a4188e391Alexander Graf free_pages((long)vcpu_book3s, get_order(sizeof(struct kvmppc_vcpu_book3s))); 8802f4cf5e42d13974763276e918618f76a4188e391Alexander Grafout: 8812f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return ERR_PTR(err); 8822f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 8832f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 8842f4cf5e42d13974763276e918618f76a4188e391Alexander Grafvoid kvmppc_core_vcpu_free(struct kvm_vcpu *vcpu) 8852f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 8862f4cf5e42d13974763276e918618f76a4188e391Alexander Graf struct kvmppc_vcpu_book3s *vcpu_book3s = to_book3s(vcpu); 8872f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 8882f4cf5e42d13974763276e918618f76a4188e391Alexander Graf __destroy_context(vcpu_book3s->context_id); 8892f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvm_vcpu_uninit(vcpu); 8902f4cf5e42d13974763276e918618f76a4188e391Alexander Graf free_pages((long)vcpu_book3s, get_order(sizeof(struct kvmppc_vcpu_book3s))); 8912f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 8922f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 8932f4cf5e42d13974763276e918618f76a4188e391Alexander Grafextern int __kvmppc_vcpu_entry(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu); 8942f4cf5e42d13974763276e918618f76a4188e391Alexander Grafint __kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) 8952f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 8962f4cf5e42d13974763276e918618f76a4188e391Alexander Graf int ret; 8972f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 8982f4cf5e42d13974763276e918618f76a4188e391Alexander Graf /* No need to go into the guest when all we do is going out */ 8992f4cf5e42d13974763276e918618f76a4188e391Alexander Graf if (signal_pending(current)) { 9002f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvm_run->exit_reason = KVM_EXIT_INTR; 9012f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return -EINTR; 9022f4cf5e42d13974763276e918618f76a4188e391Alexander Graf } 9032f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 9042f4cf5e42d13974763276e918618f76a4188e391Alexander Graf /* XXX we get called with irq disabled - change that! */ 9052f4cf5e42d13974763276e918618f76a4188e391Alexander Graf local_irq_enable(); 9062f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 9072f4cf5e42d13974763276e918618f76a4188e391Alexander Graf ret = __kvmppc_vcpu_entry(kvm_run, vcpu); 9082f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 9092f4cf5e42d13974763276e918618f76a4188e391Alexander Graf local_irq_disable(); 9102f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 9112f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return ret; 9122f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 9132f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 9142f4cf5e42d13974763276e918618f76a4188e391Alexander Grafstatic int kvmppc_book3s_init(void) 9152f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 9162f4cf5e42d13974763276e918618f76a4188e391Alexander Graf return kvm_init(NULL, sizeof(struct kvmppc_vcpu_book3s), THIS_MODULE); 9172f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 9182f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 9192f4cf5e42d13974763276e918618f76a4188e391Alexander Grafstatic void kvmppc_book3s_exit(void) 9202f4cf5e42d13974763276e918618f76a4188e391Alexander Graf{ 9212f4cf5e42d13974763276e918618f76a4188e391Alexander Graf kvm_exit(); 9222f4cf5e42d13974763276e918618f76a4188e391Alexander Graf} 9232f4cf5e42d13974763276e918618f76a4188e391Alexander Graf 9242f4cf5e42d13974763276e918618f76a4188e391Alexander Grafmodule_init(kvmppc_book3s_init); 9252f4cf5e42d13974763276e918618f76a4188e391Alexander Grafmodule_exit(kvmppc_book3s_exit); 926