···742742#define MMUBE1_VBE4 0x00000002743743#define MMUBE1_VBE5 0x00000001744744745745+#define TMRN_TMCFG0 16 /* Thread Management Configuration Register 0 */746746+#define TMRN_TMCFG0_NPRIBITS 0x003f0000 /* Bits of thread priority */747747+#define TMRN_TMCFG0_NPRIBITS_SHIFT 16748748+#define TMRN_TMCFG0_NATHRD 0x00003f00 /* Number of active threads */749749+#define TMRN_TMCFG0_NATHRD_SHIFT 8750750+#define TMRN_TMCFG0_NTHRD 0x0000003f /* Number of threads */745751#define TMRN_IMSR0 0x120 /* Initial MSR Register 0 (e6500) */746752#define TMRN_IMSR1 0x121 /* Initial MSR Register 1 (e6500) */747753#define TMRN_INIA0 0x140 /* Next Instruction Address Register 0 */
+2-1
arch/powerpc/kvm/book3s_64_mmu_hv.c
···7070 }71717272 /* Lastly try successively smaller sizes from the page allocator */7373- while (!hpt && order > PPC_MIN_HPT_ORDER) {7373+ /* Only do this if userspace didn't specify a size via ioctl */7474+ while (!hpt && order > PPC_MIN_HPT_ORDER && !htab_orderp) {7475 hpt = __get_free_pages(GFP_KERNEL|__GFP_ZERO|__GFP_REPEAT|7576 __GFP_NOWARN, order - PAGE_SHIFT);7677 if (!hpt)
+2
arch/powerpc/kvm/book3s_hv_rm_mmu.c
···470470 note_hpte_modification(kvm, rev);471471 unlock_hpte(hpte, 0);472472473473+ if (v & HPTE_V_ABSENT)474474+ v = (v & ~HPTE_V_ABSENT) | HPTE_V_VALID;473475 hpret[0] = v;474476 hpret[1] = r;475477 return H_SUCCESS;
+22-7
arch/powerpc/kvm/book3s_hv_rmhandlers.S
···150150 cmpwi cr1, r12, BOOK3S_INTERRUPT_MACHINE_CHECK151151 cmpwi r12, BOOK3S_INTERRUPT_EXTERNAL152152 beq 11f153153+ cmpwi r12, BOOK3S_INTERRUPT_H_DOORBELL154154+ beq 15f /* Invoke the H_DOORBELL handler */153155 cmpwi cr2, r12, BOOK3S_INTERRUPT_HMI154156 beq cr2, 14f /* HMI check */155157···17517314: mtspr SPRN_HSRR0, r8176174 mtspr SPRN_HSRR1, r7177175 b hmi_exception_after_realmode176176+177177+15: mtspr SPRN_HSRR0, r8178178+ mtspr SPRN_HSRR1, r7179179+ ba 0xe80178180179181kvmppc_primary_no_guest:180182 /* We handle this much like a ceded vcpu */···23832377 mr r3, r9 /* get vcpu pointer */23842378 bl kvmppc_realmode_machine_check23852379 nop23862386- cmpdi r3, 0 /* Did we handle MCE ? */23872380 ld r9, HSTATE_KVM_VCPU(r13)23882381 li r12, BOOK3S_INTERRUPT_MACHINE_CHECK23892382 /*···23952390 * The old code used to return to host for unhandled errors which23962391 * was causing guest to hang with soft lockups inside guest and23972392 * makes it difficult to recover guest instance.23932393+ *23942394+ * if we receive machine check with MSR(RI=0) then deliver it to23952395+ * guest as machine check causing guest to crash.23982396 */23992399- ld r10, VCPU_PC(r9)24002397 ld r11, VCPU_MSR(r9)23982398+ andi. r10, r11, MSR_RI /* check for unrecoverable exception */23992399+ beq 1f /* Deliver a machine check to guest */24002400+ ld r10, VCPU_PC(r9)24012401+ cmpdi r3, 0 /* Did we handle MCE ? */24012402 bne 2f /* Continue guest execution. */24022403 /* If not, deliver a machine check. SRR0/1 are already set */24032403- li r10, BOOK3S_INTERRUPT_MACHINE_CHECK24042404- ld r11, VCPU_MSR(r9)24042404+1: li r10, BOOK3S_INTERRUPT_MACHINE_CHECK24052405 bl kvmppc_msr_interrupt240624062: b fast_interrupt_c_return24072407···2446243624472437 /* hypervisor doorbell */244824383: li r12, BOOK3S_INTERRUPT_H_DOORBELL24392439+24402440+ /*24412441+ * Clear the doorbell as we will invoke the handler24422442+ * explicitly in the guest exit path.24432443+ */24442444+ lis r6, (PPC_DBELL_SERVER << (63-36))@h24452445+ PPC_MSGCLR(6)24492446 /* see if it's a host IPI */24502447 li r3, 124512448 lbz r0, HSTATE_HOST_IPI(r13)24522449 cmpwi r0, 024532450 bnelr24542454- /* if not, clear it and return -1 */24552455- lis r6, (PPC_DBELL_SERVER << (63-36))@h24562456- PPC_MSGCLR(6)24512451+ /* if not, return -1 */24572452 li r3, -124582453 blr24592454
+2-1
arch/powerpc/kvm/e500.c
···237237 struct kvm_book3e_206_tlb_entry *gtlbe)238238{239239 struct vcpu_id_table *idt = vcpu_e500->idt;240240- unsigned int pr, tid, ts, pid;240240+ unsigned int pr, tid, ts;241241+ int pid;241242 u32 val, eaddr;242243 unsigned long flags;243244
+19
arch/powerpc/kvm/e500_emulate.c
···1515#include <asm/kvm_ppc.h>1616#include <asm/disassemble.h>1717#include <asm/dbell.h>1818+#include <asm/reg_booke.h>18191920#include "booke.h"2021#include "e500.h"···2322#define XOP_DCBTLS 1662423#define XOP_MSGSND 2062524#define XOP_MSGCLR 2382525+#define XOP_MFTMR 3662626#define XOP_TLBIVAX 7862727#define XOP_TLBSX 9142828#define XOP_TLBRE 946···115113 return EMULATE_DONE;116114}117115116116+static int kvmppc_e500_emul_mftmr(struct kvm_vcpu *vcpu, unsigned int inst,117117+ int rt)118118+{119119+ /* Expose one thread per vcpu */120120+ if (get_tmrn(inst) == TMRN_TMCFG0) {121121+ kvmppc_set_gpr(vcpu, rt,122122+ 1 | (1 << TMRN_TMCFG0_NATHRD_SHIFT));123123+ return EMULATE_DONE;124124+ }125125+126126+ return EMULATE_FAIL;127127+}128128+118129int kvmppc_core_emulate_op_e500(struct kvm_run *run, struct kvm_vcpu *vcpu,119130 unsigned int inst, int *advance)120131{···178163 case XOP_TLBIVAX:179164 ea = kvmppc_get_ea_indexed(vcpu, ra, rb);180165 emulated = kvmppc_e500_emul_tlbivax(vcpu, ea);166166+ break;167167+168168+ case XOP_MFTMR:169169+ emulated = kvmppc_e500_emul_mftmr(vcpu, inst, rt);181170 break;182171183172 case XOP_EHPRIV:
···559559 else560560 r = num_online_cpus();561561 break;562562+ case KVM_CAP_NR_MEMSLOTS:563563+ r = KVM_USER_MEM_SLOTS;564564+ break;562565 case KVM_CAP_MAX_VCPUS:563566 r = KVM_MAX_VCPUS;564567 break;