Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'kvm-ppc-next' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc into HEAD

There's nothing much in the way of new features this time; it's mostly
bug fixes, plus Nikunj has implemented support for KVM_CAP_NR_MEMSLOTS.

+63 -11
+5
arch/powerpc/include/asm/disassemble.h
··· 42 42 return ((inst >> 16) & 0x1f) | ((inst >> 6) & 0x3e0); 43 43 } 44 44 45 + static inline unsigned int get_tmrn(u32 inst) 46 + { 47 + return ((inst >> 16) & 0x1f) | ((inst >> 6) & 0x3e0); 48 + } 49 + 45 50 static inline unsigned int get_rt(u32 inst) 46 51 { 47 52 return (inst >> 21) & 0x1f;
+6
arch/powerpc/include/asm/reg_booke.h
··· 742 742 #define MMUBE1_VBE4 0x00000002 743 743 #define MMUBE1_VBE5 0x00000001 744 744 745 + #define TMRN_TMCFG0 16 /* Thread Management Configuration Register 0 */ 746 + #define TMRN_TMCFG0_NPRIBITS 0x003f0000 /* Bits of thread priority */ 747 + #define TMRN_TMCFG0_NPRIBITS_SHIFT 16 748 + #define TMRN_TMCFG0_NATHRD 0x00003f00 /* Number of active threads */ 749 + #define TMRN_TMCFG0_NATHRD_SHIFT 8 750 + #define TMRN_TMCFG0_NTHRD 0x0000003f /* Number of threads */ 745 751 #define TMRN_IMSR0 0x120 /* Initial MSR Register 0 (e6500) */ 746 752 #define TMRN_IMSR1 0x121 /* Initial MSR Register 1 (e6500) */ 747 753 #define TMRN_INIA0 0x140 /* Next Instruction Address Register 0 */
+2 -1
arch/powerpc/kvm/book3s_64_mmu_hv.c
··· 70 70 } 71 71 72 72 /* Lastly try successively smaller sizes from the page allocator */ 73 - while (!hpt && order > PPC_MIN_HPT_ORDER) { 73 + /* Only do this if userspace didn't specify a size via ioctl */ 74 + while (!hpt && order > PPC_MIN_HPT_ORDER && !htab_orderp) { 74 75 hpt = __get_free_pages(GFP_KERNEL|__GFP_ZERO|__GFP_REPEAT| 75 76 __GFP_NOWARN, order - PAGE_SHIFT); 76 77 if (!hpt)
+2
arch/powerpc/kvm/book3s_hv_rm_mmu.c
··· 470 470 note_hpte_modification(kvm, rev); 471 471 unlock_hpte(hpte, 0); 472 472 473 + if (v & HPTE_V_ABSENT) 474 + v = (v & ~HPTE_V_ABSENT) | HPTE_V_VALID; 473 475 hpret[0] = v; 474 476 hpret[1] = r; 475 477 return H_SUCCESS;
+22 -7
arch/powerpc/kvm/book3s_hv_rmhandlers.S
··· 150 150 cmpwi cr1, r12, BOOK3S_INTERRUPT_MACHINE_CHECK 151 151 cmpwi r12, BOOK3S_INTERRUPT_EXTERNAL 152 152 beq 11f 153 + cmpwi r12, BOOK3S_INTERRUPT_H_DOORBELL 154 + beq 15f /* Invoke the H_DOORBELL handler */ 153 155 cmpwi cr2, r12, BOOK3S_INTERRUPT_HMI 154 156 beq cr2, 14f /* HMI check */ 155 157 ··· 175 173 14: mtspr SPRN_HSRR0, r8 176 174 mtspr SPRN_HSRR1, r7 177 175 b hmi_exception_after_realmode 176 + 177 + 15: mtspr SPRN_HSRR0, r8 178 + mtspr SPRN_HSRR1, r7 179 + ba 0xe80 178 180 179 181 kvmppc_primary_no_guest: 180 182 /* We handle this much like a ceded vcpu */ ··· 2383 2377 mr r3, r9 /* get vcpu pointer */ 2384 2378 bl kvmppc_realmode_machine_check 2385 2379 nop 2386 - cmpdi r3, 0 /* Did we handle MCE ? */ 2387 2380 ld r9, HSTATE_KVM_VCPU(r13) 2388 2381 li r12, BOOK3S_INTERRUPT_MACHINE_CHECK 2389 2382 /* ··· 2395 2390 * The old code used to return to host for unhandled errors which 2396 2391 * was causing guest to hang with soft lockups inside guest and 2397 2392 * makes it difficult to recover guest instance. 2393 + * 2394 + * if we receive machine check with MSR(RI=0) then deliver it to 2395 + * guest as machine check causing guest to crash. 2398 2396 */ 2399 - ld r10, VCPU_PC(r9) 2400 2397 ld r11, VCPU_MSR(r9) 2398 + andi. r10, r11, MSR_RI /* check for unrecoverable exception */ 2399 + beq 1f /* Deliver a machine check to guest */ 2400 + ld r10, VCPU_PC(r9) 2401 + cmpdi r3, 0 /* Did we handle MCE ? */ 2401 2402 bne 2f /* Continue guest execution. */ 2402 2403 /* If not, deliver a machine check. SRR0/1 are already set */ 2403 - li r10, BOOK3S_INTERRUPT_MACHINE_CHECK 2404 - ld r11, VCPU_MSR(r9) 2404 + 1: li r10, BOOK3S_INTERRUPT_MACHINE_CHECK 2405 2405 bl kvmppc_msr_interrupt 2406 2406 2: b fast_interrupt_c_return 2407 2407 ··· 2446 2436 2447 2437 /* hypervisor doorbell */ 2448 2438 3: li r12, BOOK3S_INTERRUPT_H_DOORBELL 2439 + 2440 + /* 2441 + * Clear the doorbell as we will invoke the handler 2442 + * explicitly in the guest exit path. 2443 + */ 2444 + lis r6, (PPC_DBELL_SERVER << (63-36))@h 2445 + PPC_MSGCLR(6) 2449 2446 /* see if it's a host IPI */ 2450 2447 li r3, 1 2451 2448 lbz r0, HSTATE_HOST_IPI(r13) 2452 2449 cmpwi r0, 0 2453 2450 bnelr 2454 - /* if not, clear it and return -1 */ 2455 - lis r6, (PPC_DBELL_SERVER << (63-36))@h 2456 - PPC_MSGCLR(6) 2451 + /* if not, return -1 */ 2457 2452 li r3, -1 2458 2453 blr 2459 2454
+2 -1
arch/powerpc/kvm/e500.c
··· 237 237 struct kvm_book3e_206_tlb_entry *gtlbe) 238 238 { 239 239 struct vcpu_id_table *idt = vcpu_e500->idt; 240 - unsigned int pr, tid, ts, pid; 240 + unsigned int pr, tid, ts; 241 + int pid; 241 242 u32 val, eaddr; 242 243 unsigned long flags; 243 244
+19
arch/powerpc/kvm/e500_emulate.c
··· 15 15 #include <asm/kvm_ppc.h> 16 16 #include <asm/disassemble.h> 17 17 #include <asm/dbell.h> 18 + #include <asm/reg_booke.h> 18 19 19 20 #include "booke.h" 20 21 #include "e500.h" ··· 23 22 #define XOP_DCBTLS 166 24 23 #define XOP_MSGSND 206 25 24 #define XOP_MSGCLR 238 25 + #define XOP_MFTMR 366 26 26 #define XOP_TLBIVAX 786 27 27 #define XOP_TLBSX 914 28 28 #define XOP_TLBRE 946 ··· 115 113 return EMULATE_DONE; 116 114 } 117 115 116 + static int kvmppc_e500_emul_mftmr(struct kvm_vcpu *vcpu, unsigned int inst, 117 + int rt) 118 + { 119 + /* Expose one thread per vcpu */ 120 + if (get_tmrn(inst) == TMRN_TMCFG0) { 121 + kvmppc_set_gpr(vcpu, rt, 122 + 1 | (1 << TMRN_TMCFG0_NATHRD_SHIFT)); 123 + return EMULATE_DONE; 124 + } 125 + 126 + return EMULATE_FAIL; 127 + } 128 + 118 129 int kvmppc_core_emulate_op_e500(struct kvm_run *run, struct kvm_vcpu *vcpu, 119 130 unsigned int inst, int *advance) 120 131 { ··· 178 163 case XOP_TLBIVAX: 179 164 ea = kvmppc_get_ea_indexed(vcpu, ra, rb); 180 165 emulated = kvmppc_e500_emul_tlbivax(vcpu, ea); 166 + break; 167 + 168 + case XOP_MFTMR: 169 + emulated = kvmppc_e500_emul_mftmr(vcpu, inst, rt); 181 170 break; 182 171 183 172 case XOP_EHPRIV:
+2 -2
arch/powerpc/kvm/e500_mmu_host.c
··· 406 406 407 407 for (; tsize > BOOK3E_PAGESZ_4K; tsize -= 2) { 408 408 unsigned long gfn_start, gfn_end; 409 - tsize_pages = 1 << (tsize - 2); 409 + tsize_pages = 1UL << (tsize - 2); 410 410 411 411 gfn_start = gfn & ~(tsize_pages - 1); 412 412 gfn_end = gfn_start + tsize_pages; ··· 447 447 } 448 448 449 449 if (likely(!pfnmap)) { 450 - tsize_pages = 1 << (tsize + 10 - PAGE_SHIFT); 450 + tsize_pages = 1UL << (tsize + 10 - PAGE_SHIFT); 451 451 pfn = gfn_to_pfn_memslot(slot, gfn); 452 452 if (is_error_noslot_pfn(pfn)) { 453 453 if (printk_ratelimit())
+3
arch/powerpc/kvm/powerpc.c
··· 559 559 else 560 560 r = num_online_cpus(); 561 561 break; 562 + case KVM_CAP_NR_MEMSLOTS: 563 + r = KVM_USER_MEM_SLOTS; 564 + break; 562 565 case KVM_CAP_MAX_VCPUS: 563 566 r = KVM_MAX_VCPUS; 564 567 break;