1/* 2 * This program is free software; you can redistribute it and/or modify 3 * it under the terms of the GNU General Public License, version 2, as 4 * published by the Free Software Foundation. 5 * 6 * This program is distributed in the hope that it will be useful, 7 * but WITHOUT ANY WARRANTY; without even the implied warranty of 8 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 9 * GNU General Public License for more details. 10 * 11 * Copyright 2011 Paul Mackerras, IBM Corp. <paulus@au1.ibm.com> 12 * 13 * Derived from book3s_rmhandlers.S and other files, which are: 14 * 15 * Copyright SUSE Linux Products GmbH 2009 16 * 17 * Authors: Alexander Graf <agraf@suse.de> 18 */ 19 20#include <asm/ppc_asm.h> 21#include <asm/kvm_asm.h> 22#include <asm/reg.h> 23#include <asm/mmu.h> 24#include <asm/page.h> 25#include <asm/ptrace.h> 26#include <asm/hvcall.h> 27#include <asm/asm-offsets.h> 28#include <asm/exception-64s.h> 29#include <asm/kvm_book3s_asm.h> 30#include <asm/mmu-hash64.h> 31#include <asm/tm.h> 32 33#define VCPU_GPRS_TM(reg) (((reg) * ULONG_SIZE) + VCPU_GPR_TM) 34 35/* Values in HSTATE_NAPPING(r13) */ 36#define NAPPING_CEDE 1 37#define NAPPING_NOVCPU 2 38 39/* 40 * Call kvmppc_hv_entry in real mode. 41 * Must be called with interrupts hard-disabled. 42 * 43 * Input Registers: 44 * 45 * LR = return address to continue at after eventually re-enabling MMU 46 */ 47_GLOBAL_TOC(kvmppc_hv_entry_trampoline) 48 mflr r0 49 std r0, PPC_LR_STKOFF(r1) 50 stdu r1, -112(r1) 51 mfmsr r10 52 LOAD_REG_ADDR(r5, kvmppc_call_hv_entry) 53 li r0,MSR_RI 54 andc r0,r10,r0 55 li r6,MSR_IR | MSR_DR 56 andc r6,r10,r6 57 mtmsrd r0,1 /* clear RI in MSR */ 58 mtsrr0 r5 59 mtsrr1 r6 60 RFI 61 62kvmppc_call_hv_entry: 63 ld r4, HSTATE_KVM_VCPU(r13) 64 bl kvmppc_hv_entry 65 66 /* Back from guest - restore host state and return to caller */ 67 68BEGIN_FTR_SECTION 69 /* Restore host DABR and DABRX */ 70 ld r5,HSTATE_DABR(r13) 71 li r6,7 72 mtspr SPRN_DABR,r5 73 mtspr SPRN_DABRX,r6 74END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) 75 76 /* Restore SPRG3 */ 77 ld r3,PACA_SPRG_VDSO(r13) 78 mtspr SPRN_SPRG_VDSO_WRITE,r3 79 80 /* Reload the host's PMU registers */ 81 ld r3, PACALPPACAPTR(r13) /* is the host using the PMU? */ 82 lbz r4, LPPACA_PMCINUSE(r3) 83 cmpwi r4, 0 84 beq 23f /* skip if not */ 85BEGIN_FTR_SECTION 86 ld r3, HSTATE_MMCR0(r13) 87 andi. r4, r3, MMCR0_PMAO_SYNC | MMCR0_PMAO 88 cmpwi r4, MMCR0_PMAO 89 beql kvmppc_fix_pmao 90END_FTR_SECTION_IFSET(CPU_FTR_PMAO_BUG) 91 lwz r3, HSTATE_PMC1(r13) 92 lwz r4, HSTATE_PMC2(r13) 93 lwz r5, HSTATE_PMC3(r13) 94 lwz r6, HSTATE_PMC4(r13) 95 lwz r8, HSTATE_PMC5(r13) 96 lwz r9, HSTATE_PMC6(r13) 97 mtspr SPRN_PMC1, r3 98 mtspr SPRN_PMC2, r4 99 mtspr SPRN_PMC3, r5 100 mtspr SPRN_PMC4, r6 101 mtspr SPRN_PMC5, r8 102 mtspr SPRN_PMC6, r9 103 ld r3, HSTATE_MMCR0(r13) 104 ld r4, HSTATE_MMCR1(r13) 105 ld r5, HSTATE_MMCRA(r13) 106 ld r6, HSTATE_SIAR(r13) 107 ld r7, HSTATE_SDAR(r13) 108 mtspr SPRN_MMCR1, r4 109 mtspr SPRN_MMCRA, r5 110 mtspr SPRN_SIAR, r6 111 mtspr SPRN_SDAR, r7 112BEGIN_FTR_SECTION 113 ld r8, HSTATE_MMCR2(r13) 114 ld r9, HSTATE_SIER(r13) 115 mtspr SPRN_MMCR2, r8 116 mtspr SPRN_SIER, r9 117END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) 118 mtspr SPRN_MMCR0, r3 119 isync 12023: 121 122 /* 123 * Reload DEC. HDEC interrupts were disabled when 124 * we reloaded the host's LPCR value. 125 */ 126 ld r3, HSTATE_DECEXP(r13) 127 mftb r4 128 subf r4, r4, r3 129 mtspr SPRN_DEC, r4 130 131 /* 132 * For external and machine check interrupts, we need 133 * to call the Linux handler to process the interrupt. 134 * We do that by jumping to absolute address 0x500 for 135 * external interrupts, or the machine_check_fwnmi label 136 * for machine checks (since firmware might have patched 137 * the vector area at 0x200). The [h]rfid at the end of the 138 * handler will return to the book3s_hv_interrupts.S code. 139 * For other interrupts we do the rfid to get back 140 * to the book3s_hv_interrupts.S code here. 141 */ 142 ld r8, 112+PPC_LR_STKOFF(r1) 143 addi r1, r1, 112 144 ld r7, HSTATE_HOST_MSR(r13) 145 146 cmpwi cr1, r12, BOOK3S_INTERRUPT_MACHINE_CHECK 147 cmpwi r12, BOOK3S_INTERRUPT_EXTERNAL 148 beq 11f 149 cmpwi cr2, r12, BOOK3S_INTERRUPT_HMI 150 beq cr2, 14f /* HMI check */ 151 152 /* RFI into the highmem handler, or branch to interrupt handler */ 153 mfmsr r6 154 li r0, MSR_RI 155 andc r6, r6, r0 156 mtmsrd r6, 1 /* Clear RI in MSR */ 157 mtsrr0 r8 158 mtsrr1 r7 159 beq cr1, 13f /* machine check */ 160 RFI 161 162 /* On POWER7, we have external interrupts set to use HSRR0/1 */ 16311: mtspr SPRN_HSRR0, r8 164 mtspr SPRN_HSRR1, r7 165 ba 0x500 166 16713: b machine_check_fwnmi 168 16914: mtspr SPRN_HSRR0, r8 170 mtspr SPRN_HSRR1, r7 171 b hmi_exception_after_realmode 172 173kvmppc_primary_no_guest: 174 /* We handle this much like a ceded vcpu */ 175 /* put the HDEC into the DEC, since HDEC interrupts don't wake us */ 176 mfspr r3, SPRN_HDEC 177 mtspr SPRN_DEC, r3 178 /* 179 * Make sure the primary has finished the MMU switch. 180 * We should never get here on a secondary thread, but 181 * check it for robustness' sake. 182 */ 183 ld r5, HSTATE_KVM_VCORE(r13) 18465: lbz r0, VCORE_IN_GUEST(r5) 185 cmpwi r0, 0 186 beq 65b 187 /* Set LPCR. */ 188 ld r8,VCORE_LPCR(r5) 189 mtspr SPRN_LPCR,r8 190 isync 191 /* set our bit in napping_threads */ 192 ld r5, HSTATE_KVM_VCORE(r13) 193 lbz r7, HSTATE_PTID(r13) 194 li r0, 1 195 sld r0, r0, r7 196 addi r6, r5, VCORE_NAPPING_THREADS 1971: lwarx r3, 0, r6 198 or r3, r3, r0 199 stwcx. r3, 0, r6 200 bne 1b 201 /* order napping_threads update vs testing entry_exit_map */ 202 isync 203 li r12, 0 204 lwz r7, VCORE_ENTRY_EXIT(r5) 205 cmpwi r7, 0x100 206 bge kvm_novcpu_exit /* another thread already exiting */ 207 li r3, NAPPING_NOVCPU 208 stb r3, HSTATE_NAPPING(r13) 209 210 li r3, 0 /* Don't wake on privileged (OS) doorbell */ 211 b kvm_do_nap 212 213kvm_novcpu_wakeup: 214 ld r1, HSTATE_HOST_R1(r13) 215 ld r5, HSTATE_KVM_VCORE(r13) 216 li r0, 0 217 stb r0, HSTATE_NAPPING(r13) 218 stb r0, HSTATE_HWTHREAD_REQ(r13) 219 220 /* check the wake reason */ 221 bl kvmppc_check_wake_reason 222 223 /* see if any other thread is already exiting */ 224 lwz r0, VCORE_ENTRY_EXIT(r5) 225 cmpwi r0, 0x100 226 bge kvm_novcpu_exit 227 228 /* clear our bit in napping_threads */ 229 lbz r7, HSTATE_PTID(r13) 230 li r0, 1 231 sld r0, r0, r7 232 addi r6, r5, VCORE_NAPPING_THREADS 2334: lwarx r7, 0, r6 234 andc r7, r7, r0 235 stwcx. r7, 0, r6 236 bne 4b 237 238 /* See if the wake reason means we need to exit */ 239 cmpdi r3, 0 240 bge kvm_novcpu_exit 241 242 /* See if our timeslice has expired (HDEC is negative) */ 243 mfspr r0, SPRN_HDEC 244 li r12, BOOK3S_INTERRUPT_HV_DECREMENTER 245 cmpwi r0, 0 246 blt kvm_novcpu_exit 247 248 /* Got an IPI but other vcpus aren't yet exiting, must be a latecomer */ 249 ld r4, HSTATE_KVM_VCPU(r13) 250 cmpdi r4, 0 251 beq kvmppc_primary_no_guest 252 253#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING 254 addi r3, r4, VCPU_TB_RMENTRY 255 bl kvmhv_start_timing 256#endif 257 b kvmppc_got_guest 258 259kvm_novcpu_exit: 260#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING 261 ld r4, HSTATE_KVM_VCPU(r13) 262 cmpdi r4, 0 263 beq 13f 264 addi r3, r4, VCPU_TB_RMEXIT 265 bl kvmhv_accumulate_time 266#endif 26713: mr r3, r12 268 stw r12, 112-4(r1) 269 bl kvmhv_commence_exit 270 nop 271 lwz r12, 112-4(r1) 272 b kvmhv_switch_to_host 273 274/* 275 * We come in here when wakened from nap mode. 276 * Relocation is off and most register values are lost. 277 * r13 points to the PACA. 278 */ 279 .globl kvm_start_guest 280kvm_start_guest: 281 282 /* Set runlatch bit the minute you wake up from nap */ 283 mfspr r0, SPRN_CTRLF 284 ori r0, r0, 1 285 mtspr SPRN_CTRLT, r0 286 287 ld r2,PACATOC(r13) 288 289 li r0,KVM_HWTHREAD_IN_KVM 290 stb r0,HSTATE_HWTHREAD_STATE(r13) 291 292 /* NV GPR values from power7_idle() will no longer be valid */ 293 li r0,1 294 stb r0,PACA_NAPSTATELOST(r13) 295 296 /* were we napping due to cede? */ 297 lbz r0,HSTATE_NAPPING(r13) 298 cmpwi r0,NAPPING_CEDE 299 beq kvm_end_cede 300 cmpwi r0,NAPPING_NOVCPU 301 beq kvm_novcpu_wakeup 302 303 ld r1,PACAEMERGSP(r13) 304 subi r1,r1,STACK_FRAME_OVERHEAD 305 306 /* 307 * We weren't napping due to cede, so this must be a secondary 308 * thread being woken up to run a guest, or being woken up due 309 * to a stray IPI. (Or due to some machine check or hypervisor 310 * maintenance interrupt while the core is in KVM.) 311 */ 312 313 /* Check the wake reason in SRR1 to see why we got here */ 314 bl kvmppc_check_wake_reason 315 cmpdi r3, 0 316 bge kvm_no_guest 317 318 /* get vcpu pointer, NULL if we have no vcpu to run */ 319 ld r4,HSTATE_KVM_VCPU(r13) 320 cmpdi r4,0 321 /* if we have no vcpu to run, go back to sleep */ 322 beq kvm_no_guest 323 324kvm_secondary_got_guest: 325 326 /* Set HSTATE_DSCR(r13) to something sensible */ 327 ld r6, PACA_DSCR(r13) 328 std r6, HSTATE_DSCR(r13) 329 330 /* Order load of vcore, ptid etc. after load of vcpu */ 331 lwsync 332 bl kvmppc_hv_entry 333 334 /* Back from the guest, go back to nap */ 335 /* Clear our vcpu pointer so we don't come back in early */ 336 li r0, 0 337 /* 338 * Once we clear HSTATE_KVM_VCPU(r13), the code in 339 * kvmppc_run_core() is going to assume that all our vcpu 340 * state is visible in memory. This lwsync makes sure 341 * that that is true. 342 */ 343 lwsync 344 std r0, HSTATE_KVM_VCPU(r13) 345 346/* 347 * At this point we have finished executing in the guest. 348 * We need to wait for hwthread_req to become zero, since 349 * we may not turn on the MMU while hwthread_req is non-zero. 350 * While waiting we also need to check if we get given a vcpu to run. 351 */ 352kvm_no_guest: 353 lbz r3, HSTATE_HWTHREAD_REQ(r13) 354 cmpwi r3, 0 355 bne 53f 356 HMT_MEDIUM 357 li r0, KVM_HWTHREAD_IN_KERNEL 358 stb r0, HSTATE_HWTHREAD_STATE(r13) 359 /* need to recheck hwthread_req after a barrier, to avoid race */ 360 sync 361 lbz r3, HSTATE_HWTHREAD_REQ(r13) 362 cmpwi r3, 0 363 bne 54f 364/* 365 * We jump to power7_wakeup_loss, which will return to the caller 366 * of power7_nap in the powernv cpu offline loop. The value we 367 * put in r3 becomes the return value for power7_nap. 368 */ 369 li r3, LPCR_PECE0 370 mfspr r4, SPRN_LPCR 371 rlwimi r4, r3, 0, LPCR_PECE0 | LPCR_PECE1 372 mtspr SPRN_LPCR, r4 373 li r3, 0 374 b power7_wakeup_loss 375 37653: HMT_LOW 377 ld r4, HSTATE_KVM_VCPU(r13) 378 cmpdi r4, 0 379 beq kvm_no_guest 380 HMT_MEDIUM 381 b kvm_secondary_got_guest 382 38354: li r0, KVM_HWTHREAD_IN_KVM 384 stb r0, HSTATE_HWTHREAD_STATE(r13) 385 b kvm_no_guest 386 387/****************************************************************************** 388 * * 389 * Entry code * 390 * * 391 *****************************************************************************/ 392 393.global kvmppc_hv_entry 394kvmppc_hv_entry: 395 396 /* Required state: 397 * 398 * R4 = vcpu pointer (or NULL) 399 * MSR = ~IR|DR 400 * R13 = PACA 401 * R1 = host R1 402 * R2 = TOC 403 * all other volatile GPRS = free 404 */ 405 mflr r0 406 std r0, PPC_LR_STKOFF(r1) 407 stdu r1, -112(r1) 408 409 /* Save R1 in the PACA */ 410 std r1, HSTATE_HOST_R1(r13) 411 412 li r6, KVM_GUEST_MODE_HOST_HV 413 stb r6, HSTATE_IN_GUEST(r13) 414 415#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING 416 /* Store initial timestamp */ 417 cmpdi r4, 0 418 beq 1f 419 addi r3, r4, VCPU_TB_RMENTRY 420 bl kvmhv_start_timing 4211: 422#endif 423 /* Clear out SLB */ 424 li r6,0 425 slbmte r6,r6 426 slbia 427 ptesync 428 429 /* 430 * POWER7/POWER8 host -> guest partition switch code. 431 * We don't have to lock against concurrent tlbies, 432 * but we do have to coordinate across hardware threads. 433 */ 434 /* Set bit in entry map iff exit map is zero. */ 435 ld r5, HSTATE_KVM_VCORE(r13) 436 li r7, 1 437 lbz r6, HSTATE_PTID(r13) 438 sld r7, r7, r6 439 addi r9, r5, VCORE_ENTRY_EXIT 44021: lwarx r3, 0, r9 441 cmpwi r3, 0x100 /* any threads starting to exit? */ 442 bge secondary_too_late /* if so we're too late to the party */ 443 or r3, r3, r7 444 stwcx. r3, 0, r9 445 bne 21b 446 447 /* Primary thread switches to guest partition. */ 448 ld r9,VCORE_KVM(r5) /* pointer to struct kvm */ 449 cmpwi r6,0 450 bne 10f 451 ld r6,KVM_SDR1(r9) 452 lwz r7,KVM_LPID(r9) 453 li r0,LPID_RSVD /* switch to reserved LPID */ 454 mtspr SPRN_LPID,r0 455 ptesync 456 mtspr SPRN_SDR1,r6 /* switch to partition page table */ 457 mtspr SPRN_LPID,r7 458 isync 459 460 /* See if we need to flush the TLB */ 461 lhz r6,PACAPACAINDEX(r13) /* test_bit(cpu, need_tlb_flush) */ 462 clrldi r7,r6,64-6 /* extract bit number (6 bits) */ 463 srdi r6,r6,6 /* doubleword number */ 464 sldi r6,r6,3 /* address offset */ 465 add r6,r6,r9 466 addi r6,r6,KVM_NEED_FLUSH /* dword in kvm->arch.need_tlb_flush */ 467 li r0,1 468 sld r0,r0,r7 469 ld r7,0(r6) 470 and. r7,r7,r0 471 beq 22f 47223: ldarx r7,0,r6 /* if set, clear the bit */ 473 andc r7,r7,r0 474 stdcx. r7,0,r6 475 bne 23b 476 /* Flush the TLB of any entries for this LPID */ 477 /* use arch 2.07S as a proxy for POWER8 */ 478BEGIN_FTR_SECTION 479 li r6,512 /* POWER8 has 512 sets */ 480FTR_SECTION_ELSE 481 li r6,128 /* POWER7 has 128 sets */ 482ALT_FTR_SECTION_END_IFSET(CPU_FTR_ARCH_207S) 483 mtctr r6 484 li r7,0x800 /* IS field = 0b10 */ 485 ptesync 48628: tlbiel r7 487 addi r7,r7,0x1000 488 bdnz 28b 489 ptesync 490 491 /* Add timebase offset onto timebase */ 49222: ld r8,VCORE_TB_OFFSET(r5) 493 cmpdi r8,0 494 beq 37f 495 mftb r6 /* current host timebase */ 496 add r8,r8,r6 497 mtspr SPRN_TBU40,r8 /* update upper 40 bits */ 498 mftb r7 /* check if lower 24 bits overflowed */ 499 clrldi r6,r6,40 500 clrldi r7,r7,40 501 cmpld r7,r6 502 bge 37f 503 addis r8,r8,0x100 /* if so, increment upper 40 bits */ 504 mtspr SPRN_TBU40,r8 505 506 /* Load guest PCR value to select appropriate compat mode */ 50737: ld r7, VCORE_PCR(r5) 508 cmpdi r7, 0 509 beq 38f 510 mtspr SPRN_PCR, r7 51138: 512 513BEGIN_FTR_SECTION 514 /* DPDES is shared between threads */ 515 ld r8, VCORE_DPDES(r5) 516 mtspr SPRN_DPDES, r8 517END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) 518 519 li r0,1 520 stb r0,VCORE_IN_GUEST(r5) /* signal secondaries to continue */ 521 522 /* Do we have a guest vcpu to run? */ 52310: cmpdi r4, 0 524 beq kvmppc_primary_no_guest 525kvmppc_got_guest: 526 527 /* Load up guest SLB entries */ 528 lwz r5,VCPU_SLB_MAX(r4) 529 cmpwi r5,0 530 beq 9f 531 mtctr r5 532 addi r6,r4,VCPU_SLB 5331: ld r8,VCPU_SLB_E(r6) 534 ld r9,VCPU_SLB_V(r6) 535 slbmte r9,r8 536 addi r6,r6,VCPU_SLB_SIZE 537 bdnz 1b 5389: 539 /* Increment yield count if they have a VPA */ 540 ld r3, VCPU_VPA(r4) 541 cmpdi r3, 0 542 beq 25f 543 li r6, LPPACA_YIELDCOUNT 544 LWZX_BE r5, r3, r6 545 addi r5, r5, 1 546 STWX_BE r5, r3, r6 547 li r6, 1 548 stb r6, VCPU_VPA_DIRTY(r4) 54925: 550 551 /* Save purr/spurr */ 552 mfspr r5,SPRN_PURR 553 mfspr r6,SPRN_SPURR 554 std r5,HSTATE_PURR(r13) 555 std r6,HSTATE_SPURR(r13) 556 ld r7,VCPU_PURR(r4) 557 ld r8,VCPU_SPURR(r4) 558 mtspr SPRN_PURR,r7 559 mtspr SPRN_SPURR,r8 560 561BEGIN_FTR_SECTION 562 /* Set partition DABR */ 563 /* Do this before re-enabling PMU to avoid P7 DABR corruption bug */ 564 lwz r5,VCPU_DABRX(r4) 565 ld r6,VCPU_DABR(r4) 566 mtspr SPRN_DABRX,r5 567 mtspr SPRN_DABR,r6 568 isync 569END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) 570 571#ifdef CONFIG_PPC_TRANSACTIONAL_MEM 572BEGIN_FTR_SECTION 573 b skip_tm 574END_FTR_SECTION_IFCLR(CPU_FTR_TM) 575 576 /* Turn on TM/FP/VSX/VMX so we can restore them. */ 577 mfmsr r5 578 li r6, MSR_TM >> 32 579 sldi r6, r6, 32 580 or r5, r5, r6 581 ori r5, r5, MSR_FP 582 oris r5, r5, (MSR_VEC | MSR_VSX)@h 583 mtmsrd r5 584 585 /* 586 * The user may change these outside of a transaction, so they must 587 * always be context switched. 588 */ 589 ld r5, VCPU_TFHAR(r4) 590 ld r6, VCPU_TFIAR(r4) 591 ld r7, VCPU_TEXASR(r4) 592 mtspr SPRN_TFHAR, r5 593 mtspr SPRN_TFIAR, r6 594 mtspr SPRN_TEXASR, r7 595 596 ld r5, VCPU_MSR(r4) 597 rldicl. r5, r5, 64 - MSR_TS_S_LG, 62 598 beq skip_tm /* TM not active in guest */ 599 600 /* Make sure the failure summary is set, otherwise we'll program check 601 * when we trechkpt. It's possible that this might have been not set 602 * on a kvmppc_set_one_reg() call but we shouldn't let this crash the 603 * host. 604 */ 605 oris r7, r7, (TEXASR_FS)@h 606 mtspr SPRN_TEXASR, r7 607 608 /* 609 * We need to load up the checkpointed state for the guest. 610 * We need to do this early as it will blow away any GPRs, VSRs and 611 * some SPRs. 612 */ 613 614 mr r31, r4 615 addi r3, r31, VCPU_FPRS_TM 616 bl load_fp_state 617 addi r3, r31, VCPU_VRS_TM 618 bl load_vr_state 619 mr r4, r31 620 lwz r7, VCPU_VRSAVE_TM(r4) 621 mtspr SPRN_VRSAVE, r7 622 623 ld r5, VCPU_LR_TM(r4) 624 lwz r6, VCPU_CR_TM(r4) 625 ld r7, VCPU_CTR_TM(r4) 626 ld r8, VCPU_AMR_TM(r4) 627 ld r9, VCPU_TAR_TM(r4) 628 mtlr r5 629 mtcr r6 630 mtctr r7 631 mtspr SPRN_AMR, r8 632 mtspr SPRN_TAR, r9 633 634 /* 635 * Load up PPR and DSCR values but don't put them in the actual SPRs 636 * till the last moment to avoid running with userspace PPR and DSCR for 637 * too long. 638 */ 639 ld r29, VCPU_DSCR_TM(r4) 640 ld r30, VCPU_PPR_TM(r4) 641 642 std r2, PACATMSCRATCH(r13) /* Save TOC */ 643 644 /* Clear the MSR RI since r1, r13 are all going to be foobar. */ 645 li r5, 0 646 mtmsrd r5, 1 647 648 /* Load GPRs r0-r28 */ 649 reg = 0 650 .rept 29 651 ld reg, VCPU_GPRS_TM(reg)(r31) 652 reg = reg + 1 653 .endr 654 655 mtspr SPRN_DSCR, r29 656 mtspr SPRN_PPR, r30 657 658 /* Load final GPRs */ 659 ld 29, VCPU_GPRS_TM(29)(r31) 660 ld 30, VCPU_GPRS_TM(30)(r31) 661 ld 31, VCPU_GPRS_TM(31)(r31) 662 663 /* TM checkpointed state is now setup. All GPRs are now volatile. */ 664 TRECHKPT 665 666 /* Now let's get back the state we need. */ 667 HMT_MEDIUM 668 GET_PACA(r13) 669 ld r29, HSTATE_DSCR(r13) 670 mtspr SPRN_DSCR, r29 671 ld r4, HSTATE_KVM_VCPU(r13) 672 ld r1, HSTATE_HOST_R1(r13) 673 ld r2, PACATMSCRATCH(r13) 674 675 /* Set the MSR RI since we have our registers back. */ 676 li r5, MSR_RI 677 mtmsrd r5, 1 678skip_tm: 679#endif 680 681 /* Load guest PMU registers */ 682 /* R4 is live here (vcpu pointer) */ 683 li r3, 1 684 sldi r3, r3, 31 /* MMCR0_FC (freeze counters) bit */ 685 mtspr SPRN_MMCR0, r3 /* freeze all counters, disable ints */ 686 isync 687BEGIN_FTR_SECTION 688 ld r3, VCPU_MMCR(r4) 689 andi. r5, r3, MMCR0_PMAO_SYNC | MMCR0_PMAO 690 cmpwi r5, MMCR0_PMAO 691 beql kvmppc_fix_pmao 692END_FTR_SECTION_IFSET(CPU_FTR_PMAO_BUG) 693 lwz r3, VCPU_PMC(r4) /* always load up guest PMU registers */ 694 lwz r5, VCPU_PMC + 4(r4) /* to prevent information leak */ 695 lwz r6, VCPU_PMC + 8(r4) 696 lwz r7, VCPU_PMC + 12(r4) 697 lwz r8, VCPU_PMC + 16(r4) 698 lwz r9, VCPU_PMC + 20(r4) 699 mtspr SPRN_PMC1, r3 700 mtspr SPRN_PMC2, r5 701 mtspr SPRN_PMC3, r6 702 mtspr SPRN_PMC4, r7 703 mtspr SPRN_PMC5, r8 704 mtspr SPRN_PMC6, r9 705 ld r3, VCPU_MMCR(r4) 706 ld r5, VCPU_MMCR + 8(r4) 707 ld r6, VCPU_MMCR + 16(r4) 708 ld r7, VCPU_SIAR(r4) 709 ld r8, VCPU_SDAR(r4) 710 mtspr SPRN_MMCR1, r5 711 mtspr SPRN_MMCRA, r6 712 mtspr SPRN_SIAR, r7 713 mtspr SPRN_SDAR, r8 714BEGIN_FTR_SECTION 715 ld r5, VCPU_MMCR + 24(r4) 716 ld r6, VCPU_SIER(r4) 717 lwz r7, VCPU_PMC + 24(r4) 718 lwz r8, VCPU_PMC + 28(r4) 719 ld r9, VCPU_MMCR + 32(r4) 720 mtspr SPRN_MMCR2, r5 721 mtspr SPRN_SIER, r6 722 mtspr SPRN_SPMC1, r7 723 mtspr SPRN_SPMC2, r8 724 mtspr SPRN_MMCRS, r9 725END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) 726 mtspr SPRN_MMCR0, r3 727 isync 728 729 /* Load up FP, VMX and VSX registers */ 730 bl kvmppc_load_fp 731 732 ld r14, VCPU_GPR(R14)(r4) 733 ld r15, VCPU_GPR(R15)(r4) 734 ld r16, VCPU_GPR(R16)(r4) 735 ld r17, VCPU_GPR(R17)(r4) 736 ld r18, VCPU_GPR(R18)(r4) 737 ld r19, VCPU_GPR(R19)(r4) 738 ld r20, VCPU_GPR(R20)(r4) 739 ld r21, VCPU_GPR(R21)(r4) 740 ld r22, VCPU_GPR(R22)(r4) 741 ld r23, VCPU_GPR(R23)(r4) 742 ld r24, VCPU_GPR(R24)(r4) 743 ld r25, VCPU_GPR(R25)(r4) 744 ld r26, VCPU_GPR(R26)(r4) 745 ld r27, VCPU_GPR(R27)(r4) 746 ld r28, VCPU_GPR(R28)(r4) 747 ld r29, VCPU_GPR(R29)(r4) 748 ld r30, VCPU_GPR(R30)(r4) 749 ld r31, VCPU_GPR(R31)(r4) 750 751 /* Switch DSCR to guest value */ 752 ld r5, VCPU_DSCR(r4) 753 mtspr SPRN_DSCR, r5 754 755BEGIN_FTR_SECTION 756 /* Skip next section on POWER7 */ 757 b 8f 758END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) 759 /* Turn on TM so we can access TFHAR/TFIAR/TEXASR */ 760 mfmsr r8 761 li r0, 1 762 rldimi r8, r0, MSR_TM_LG, 63-MSR_TM_LG 763 mtmsrd r8 764 765 /* Load up POWER8-specific registers */ 766 ld r5, VCPU_IAMR(r4) 767 lwz r6, VCPU_PSPB(r4) 768 ld r7, VCPU_FSCR(r4) 769 mtspr SPRN_IAMR, r5 770 mtspr SPRN_PSPB, r6 771 mtspr SPRN_FSCR, r7 772 ld r5, VCPU_DAWR(r4) 773 ld r6, VCPU_DAWRX(r4) 774 ld r7, VCPU_CIABR(r4) 775 ld r8, VCPU_TAR(r4) 776 mtspr SPRN_DAWR, r5 777 mtspr SPRN_DAWRX, r6 778 mtspr SPRN_CIABR, r7 779 mtspr SPRN_TAR, r8 780 ld r5, VCPU_IC(r4) 781 ld r6, VCPU_VTB(r4) 782 mtspr SPRN_IC, r5 783 mtspr SPRN_VTB, r6 784 ld r8, VCPU_EBBHR(r4) 785 mtspr SPRN_EBBHR, r8 786 ld r5, VCPU_EBBRR(r4) 787 ld r6, VCPU_BESCR(r4) 788 ld r7, VCPU_CSIGR(r4) 789 ld r8, VCPU_TACR(r4) 790 mtspr SPRN_EBBRR, r5 791 mtspr SPRN_BESCR, r6 792 mtspr SPRN_CSIGR, r7 793 mtspr SPRN_TACR, r8 794 ld r5, VCPU_TCSCR(r4) 795 ld r6, VCPU_ACOP(r4) 796 lwz r7, VCPU_GUEST_PID(r4) 797 ld r8, VCPU_WORT(r4) 798 mtspr SPRN_TCSCR, r5 799 mtspr SPRN_ACOP, r6 800 mtspr SPRN_PID, r7 801 mtspr SPRN_WORT, r8 8028: 803 804 /* 805 * Set the decrementer to the guest decrementer. 806 */ 807 ld r8,VCPU_DEC_EXPIRES(r4) 808 /* r8 is a host timebase value here, convert to guest TB */ 809 ld r5,HSTATE_KVM_VCORE(r13) 810 ld r6,VCORE_TB_OFFSET(r5) 811 add r8,r8,r6 812 mftb r7 813 subf r3,r7,r8 814 mtspr SPRN_DEC,r3 815 stw r3,VCPU_DEC(r4) 816 817 ld r5, VCPU_SPRG0(r4) 818 ld r6, VCPU_SPRG1(r4) 819 ld r7, VCPU_SPRG2(r4) 820 ld r8, VCPU_SPRG3(r4) 821 mtspr SPRN_SPRG0, r5 822 mtspr SPRN_SPRG1, r6 823 mtspr SPRN_SPRG2, r7 824 mtspr SPRN_SPRG3, r8 825 826 /* Load up DAR and DSISR */ 827 ld r5, VCPU_DAR(r4) 828 lwz r6, VCPU_DSISR(r4) 829 mtspr SPRN_DAR, r5 830 mtspr SPRN_DSISR, r6 831 832 /* Restore AMR and UAMOR, set AMOR to all 1s */ 833 ld r5,VCPU_AMR(r4) 834 ld r6,VCPU_UAMOR(r4) 835 li r7,-1 836 mtspr SPRN_AMR,r5 837 mtspr SPRN_UAMOR,r6 838 mtspr SPRN_AMOR,r7 839 840 /* Restore state of CTRL run bit; assume 1 on entry */ 841 lwz r5,VCPU_CTRL(r4) 842 andi. r5,r5,1 843 bne 4f 844 mfspr r6,SPRN_CTRLF 845 clrrdi r6,r6,1 846 mtspr SPRN_CTRLT,r6 8474: 848 /* Secondary threads wait for primary to have done partition switch */ 849 ld r5, HSTATE_KVM_VCORE(r13) 850 lbz r6, HSTATE_PTID(r13) 851 cmpwi r6, 0 852 beq 21f 853 lbz r0, VCORE_IN_GUEST(r5) 854 cmpwi r0, 0 855 bne 21f 856 HMT_LOW 85720: lbz r0, VCORE_IN_GUEST(r5) 858 cmpwi r0, 0 859 beq 20b 860 HMT_MEDIUM 86121: 862 /* Set LPCR. */ 863 ld r8,VCORE_LPCR(r5) 864 mtspr SPRN_LPCR,r8 865 isync 866 867 /* Check if HDEC expires soon */ 868 mfspr r3, SPRN_HDEC 869 cmpwi r3, 512 /* 1 microsecond */ 870 blt hdec_soon 871 872 ld r6, VCPU_CTR(r4) 873 lwz r7, VCPU_XER(r4) 874 875 mtctr r6 876 mtxer r7 877 878kvmppc_cede_reentry: /* r4 = vcpu, r13 = paca */ 879 ld r10, VCPU_PC(r4) 880 ld r11, VCPU_MSR(r4) 881 ld r6, VCPU_SRR0(r4) 882 ld r7, VCPU_SRR1(r4) 883 mtspr SPRN_SRR0, r6 884 mtspr SPRN_SRR1, r7 885 886deliver_guest_interrupt: 887 /* r11 = vcpu->arch.msr & ~MSR_HV */ 888 rldicl r11, r11, 63 - MSR_HV_LG, 1 889 rotldi r11, r11, 1 + MSR_HV_LG 890 ori r11, r11, MSR_ME 891 892 /* Check if we can deliver an external or decrementer interrupt now */ 893 ld r0, VCPU_PENDING_EXC(r4) 894 rldicl r0, r0, 64 - BOOK3S_IRQPRIO_EXTERNAL_LEVEL, 63 895 cmpdi cr1, r0, 0 896 andi. r8, r11, MSR_EE 897 mfspr r8, SPRN_LPCR 898 /* Insert EXTERNAL_LEVEL bit into LPCR at the MER bit position */ 899 rldimi r8, r0, LPCR_MER_SH, 63 - LPCR_MER_SH 900 mtspr SPRN_LPCR, r8 901 isync 902 beq 5f 903 li r0, BOOK3S_INTERRUPT_EXTERNAL 904 bne cr1, 12f 905 mfspr r0, SPRN_DEC 906 cmpwi r0, 0 907 li r0, BOOK3S_INTERRUPT_DECREMENTER 908 bge 5f 909 91012: mtspr SPRN_SRR0, r10 911 mr r10,r0 912 mtspr SPRN_SRR1, r11 913 mr r9, r4 914 bl kvmppc_msr_interrupt 9155: 916 917/* 918 * Required state: 919 * R4 = vcpu 920 * R10: value for HSRR0 921 * R11: value for HSRR1 922 * R13 = PACA 923 */ 924fast_guest_return: 925 li r0,0 926 stb r0,VCPU_CEDED(r4) /* cancel cede */ 927 mtspr SPRN_HSRR0,r10 928 mtspr SPRN_HSRR1,r11 929 930 /* Activate guest mode, so faults get handled by KVM */ 931 li r9, KVM_GUEST_MODE_GUEST_HV 932 stb r9, HSTATE_IN_GUEST(r13) 933 934#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING 935 /* Accumulate timing */ 936 addi r3, r4, VCPU_TB_GUEST 937 bl kvmhv_accumulate_time 938#endif 939 940 /* Enter guest */ 941 942BEGIN_FTR_SECTION 943 ld r5, VCPU_CFAR(r4) 944 mtspr SPRN_CFAR, r5 945END_FTR_SECTION_IFSET(CPU_FTR_CFAR) 946BEGIN_FTR_SECTION 947 ld r0, VCPU_PPR(r4) 948END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR) 949 950 ld r5, VCPU_LR(r4) 951 lwz r6, VCPU_CR(r4) 952 mtlr r5 953 mtcr r6 954 955 ld r1, VCPU_GPR(R1)(r4) 956 ld r2, VCPU_GPR(R2)(r4) 957 ld r3, VCPU_GPR(R3)(r4) 958 ld r5, VCPU_GPR(R5)(r4) 959 ld r6, VCPU_GPR(R6)(r4) 960 ld r7, VCPU_GPR(R7)(r4) 961 ld r8, VCPU_GPR(R8)(r4) 962 ld r9, VCPU_GPR(R9)(r4) 963 ld r10, VCPU_GPR(R10)(r4) 964 ld r11, VCPU_GPR(R11)(r4) 965 ld r12, VCPU_GPR(R12)(r4) 966 ld r13, VCPU_GPR(R13)(r4) 967 968BEGIN_FTR_SECTION 969 mtspr SPRN_PPR, r0 970END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR) 971 ld r0, VCPU_GPR(R0)(r4) 972 ld r4, VCPU_GPR(R4)(r4) 973 974 hrfid 975 b . 976 977secondary_too_late: 978 li r12, 0 979 cmpdi r4, 0 980 beq 11f 981 stw r12, VCPU_TRAP(r4) 982#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING 983 addi r3, r4, VCPU_TB_RMEXIT 984 bl kvmhv_accumulate_time 985#endif 98611: b kvmhv_switch_to_host 987 988hdec_soon: 989 li r12, BOOK3S_INTERRUPT_HV_DECREMENTER 990 stw r12, VCPU_TRAP(r4) 991 mr r9, r4 992#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING 993 addi r3, r4, VCPU_TB_RMEXIT 994 bl kvmhv_accumulate_time 995#endif 996 b guest_exit_cont 997 998/****************************************************************************** 999 * * 1000 * Exit code * 1001 * * 1002 *****************************************************************************/ 1003 1004/* 1005 * We come here from the first-level interrupt handlers. 1006 */ 1007 .globl kvmppc_interrupt_hv 1008kvmppc_interrupt_hv: 1009 /* 1010 * Register contents: 1011 * R12 = interrupt vector 1012 * R13 = PACA 1013 * guest CR, R12 saved in shadow VCPU SCRATCH1/0 1014 * guest R13 saved in SPRN_SCRATCH0 1015 */ 1016 std r9, HSTATE_SCRATCH2(r13) 1017 1018 lbz r9, HSTATE_IN_GUEST(r13) 1019 cmpwi r9, KVM_GUEST_MODE_HOST_HV 1020 beq kvmppc_bad_host_intr 1021#ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE 1022 cmpwi r9, KVM_GUEST_MODE_GUEST 1023 ld r9, HSTATE_SCRATCH2(r13) 1024 beq kvmppc_interrupt_pr 1025#endif 1026 /* We're now back in the host but in guest MMU context */ 1027 li r9, KVM_GUEST_MODE_HOST_HV 1028 stb r9, HSTATE_IN_GUEST(r13) 1029 1030 ld r9, HSTATE_KVM_VCPU(r13) 1031 1032 /* Save registers */ 1033 1034 std r0, VCPU_GPR(R0)(r9) 1035 std r1, VCPU_GPR(R1)(r9) 1036 std r2, VCPU_GPR(R2)(r9) 1037 std r3, VCPU_GPR(R3)(r9) 1038 std r4, VCPU_GPR(R4)(r9) 1039 std r5, VCPU_GPR(R5)(r9) 1040 std r6, VCPU_GPR(R6)(r9) 1041 std r7, VCPU_GPR(R7)(r9) 1042 std r8, VCPU_GPR(R8)(r9) 1043 ld r0, HSTATE_SCRATCH2(r13) 1044 std r0, VCPU_GPR(R9)(r9) 1045 std r10, VCPU_GPR(R10)(r9) 1046 std r11, VCPU_GPR(R11)(r9) 1047 ld r3, HSTATE_SCRATCH0(r13) 1048 lwz r4, HSTATE_SCRATCH1(r13) 1049 std r3, VCPU_GPR(R12)(r9) 1050 stw r4, VCPU_CR(r9) 1051BEGIN_FTR_SECTION 1052 ld r3, HSTATE_CFAR(r13) 1053 std r3, VCPU_CFAR(r9) 1054END_FTR_SECTION_IFSET(CPU_FTR_CFAR) 1055BEGIN_FTR_SECTION 1056 ld r4, HSTATE_PPR(r13) 1057 std r4, VCPU_PPR(r9) 1058END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR) 1059 1060 /* Restore R1/R2 so we can handle faults */ 1061 ld r1, HSTATE_HOST_R1(r13) 1062 ld r2, PACATOC(r13) 1063 1064 mfspr r10, SPRN_SRR0 1065 mfspr r11, SPRN_SRR1 1066 std r10, VCPU_SRR0(r9) 1067 std r11, VCPU_SRR1(r9) 1068 andi. r0, r12, 2 /* need to read HSRR0/1? */ 1069 beq 1f 1070 mfspr r10, SPRN_HSRR0 1071 mfspr r11, SPRN_HSRR1 1072 clrrdi r12, r12, 2 10731: std r10, VCPU_PC(r9) 1074 std r11, VCPU_MSR(r9) 1075 1076 GET_SCRATCH0(r3) 1077 mflr r4 1078 std r3, VCPU_GPR(R13)(r9) 1079 std r4, VCPU_LR(r9) 1080 1081 stw r12,VCPU_TRAP(r9) 1082 1083#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING 1084 addi r3, r9, VCPU_TB_RMINTR 1085 mr r4, r9 1086 bl kvmhv_accumulate_time 1087 ld r5, VCPU_GPR(R5)(r9) 1088 ld r6, VCPU_GPR(R6)(r9) 1089 ld r7, VCPU_GPR(R7)(r9) 1090 ld r8, VCPU_GPR(R8)(r9) 1091#endif 1092 1093 /* Save HEIR (HV emulation assist reg) in emul_inst 1094 if this is an HEI (HV emulation interrupt, e40) */ 1095 li r3,KVM_INST_FETCH_FAILED 1096 stw r3,VCPU_LAST_INST(r9) 1097 cmpwi r12,BOOK3S_INTERRUPT_H_EMUL_ASSIST 1098 bne 11f 1099 mfspr r3,SPRN_HEIR 110011: stw r3,VCPU_HEIR(r9) 1101 1102 /* these are volatile across C function calls */ 1103 mfctr r3 1104 mfxer r4 1105 std r3, VCPU_CTR(r9) 1106 stw r4, VCPU_XER(r9) 1107 1108 /* If this is a page table miss then see if it's theirs or ours */ 1109 cmpwi r12, BOOK3S_INTERRUPT_H_DATA_STORAGE 1110 beq kvmppc_hdsi 1111 cmpwi r12, BOOK3S_INTERRUPT_H_INST_STORAGE 1112 beq kvmppc_hisi 1113 1114 /* See if this is a leftover HDEC interrupt */ 1115 cmpwi r12,BOOK3S_INTERRUPT_HV_DECREMENTER 1116 bne 2f 1117 mfspr r3,SPRN_HDEC 1118 cmpwi r3,0 1119 mr r4,r9 1120 bge fast_guest_return 11212: 1122 /* See if this is an hcall we can handle in real mode */ 1123 cmpwi r12,BOOK3S_INTERRUPT_SYSCALL 1124 beq hcall_try_real_mode 1125 1126 /* Hypervisor doorbell - exit only if host IPI flag set */ 1127 cmpwi r12, BOOK3S_INTERRUPT_H_DOORBELL 1128 bne 3f 1129 lbz r0, HSTATE_HOST_IPI(r13) 1130 beq 4f 1131 b guest_exit_cont 11323: 1133 /* External interrupt ? */ 1134 cmpwi r12, BOOK3S_INTERRUPT_EXTERNAL 1135 bne+ guest_exit_cont 1136 1137 /* External interrupt, first check for host_ipi. If this is 1138 * set, we know the host wants us out so let's do it now 1139 */ 1140 bl kvmppc_read_intr 1141 cmpdi r3, 0 1142 bgt guest_exit_cont 1143 1144 /* Check if any CPU is heading out to the host, if so head out too */ 11454: ld r5, HSTATE_KVM_VCORE(r13) 1146 lwz r0, VCORE_ENTRY_EXIT(r5) 1147 cmpwi r0, 0x100 1148 mr r4, r9 1149 blt deliver_guest_interrupt 1150 1151guest_exit_cont: /* r9 = vcpu, r12 = trap, r13 = paca */ 1152 /* Save more register state */ 1153 mfdar r6 1154 mfdsisr r7 1155 std r6, VCPU_DAR(r9) 1156 stw r7, VCPU_DSISR(r9) 1157 /* don't overwrite fault_dar/fault_dsisr if HDSI */ 1158 cmpwi r12,BOOK3S_INTERRUPT_H_DATA_STORAGE 1159 beq mc_cont 1160 std r6, VCPU_FAULT_DAR(r9) 1161 stw r7, VCPU_FAULT_DSISR(r9) 1162 1163 /* See if it is a machine check */ 1164 cmpwi r12, BOOK3S_INTERRUPT_MACHINE_CHECK 1165 beq machine_check_realmode 1166mc_cont: 1167#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING 1168 addi r3, r9, VCPU_TB_RMEXIT 1169 mr r4, r9 1170 bl kvmhv_accumulate_time 1171#endif 1172 1173 /* Increment exit count, poke other threads to exit */ 1174 bl kvmhv_commence_exit 1175 nop 1176 ld r9, HSTATE_KVM_VCPU(r13) 1177 lwz r12, VCPU_TRAP(r9) 1178 1179 /* Save guest CTRL register, set runlatch to 1 */ 1180 mfspr r6,SPRN_CTRLF 1181 stw r6,VCPU_CTRL(r9) 1182 andi. r0,r6,1 1183 bne 4f 1184 ori r6,r6,1 1185 mtspr SPRN_CTRLT,r6 11864: 1187 /* Read the guest SLB and save it away */ 1188 lwz r0,VCPU_SLB_NR(r9) /* number of entries in SLB */ 1189 mtctr r0 1190 li r6,0 1191 addi r7,r9,VCPU_SLB 1192 li r5,0 11931: slbmfee r8,r6 1194 andis. r0,r8,SLB_ESID_V@h 1195 beq 2f 1196 add r8,r8,r6 /* put index in */ 1197 slbmfev r3,r6 1198 std r8,VCPU_SLB_E(r7) 1199 std r3,VCPU_SLB_V(r7) 1200 addi r7,r7,VCPU_SLB_SIZE 1201 addi r5,r5,1 12022: addi r6,r6,1 1203 bdnz 1b 1204 stw r5,VCPU_SLB_MAX(r9) 1205 1206 /* 1207 * Save the guest PURR/SPURR 1208 */ 1209 mfspr r5,SPRN_PURR 1210 mfspr r6,SPRN_SPURR 1211 ld r7,VCPU_PURR(r9) 1212 ld r8,VCPU_SPURR(r9) 1213 std r5,VCPU_PURR(r9) 1214 std r6,VCPU_SPURR(r9) 1215 subf r5,r7,r5 1216 subf r6,r8,r6 1217 1218 /* 1219 * Restore host PURR/SPURR and add guest times 1220 * so that the time in the guest gets accounted. 1221 */ 1222 ld r3,HSTATE_PURR(r13) 1223 ld r4,HSTATE_SPURR(r13) 1224 add r3,r3,r5 1225 add r4,r4,r6 1226 mtspr SPRN_PURR,r3 1227 mtspr SPRN_SPURR,r4 1228 1229 /* Save DEC */ 1230 mfspr r5,SPRN_DEC 1231 mftb r6 1232 extsw r5,r5 1233 add r5,r5,r6 1234 /* r5 is a guest timebase value here, convert to host TB */ 1235 ld r3,HSTATE_KVM_VCORE(r13) 1236 ld r4,VCORE_TB_OFFSET(r3) 1237 subf r5,r4,r5 1238 std r5,VCPU_DEC_EXPIRES(r9) 1239 1240BEGIN_FTR_SECTION 1241 b 8f 1242END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) 1243 /* Save POWER8-specific registers */ 1244 mfspr r5, SPRN_IAMR 1245 mfspr r6, SPRN_PSPB 1246 mfspr r7, SPRN_FSCR 1247 std r5, VCPU_IAMR(r9) 1248 stw r6, VCPU_PSPB(r9) 1249 std r7, VCPU_FSCR(r9) 1250 mfspr r5, SPRN_IC 1251 mfspr r6, SPRN_VTB 1252 mfspr r7, SPRN_TAR 1253 std r5, VCPU_IC(r9) 1254 std r6, VCPU_VTB(r9) 1255 std r7, VCPU_TAR(r9) 1256 mfspr r8, SPRN_EBBHR 1257 std r8, VCPU_EBBHR(r9) 1258 mfspr r5, SPRN_EBBRR 1259 mfspr r6, SPRN_BESCR 1260 mfspr r7, SPRN_CSIGR 1261 mfspr r8, SPRN_TACR 1262 std r5, VCPU_EBBRR(r9) 1263 std r6, VCPU_BESCR(r9) 1264 std r7, VCPU_CSIGR(r9) 1265 std r8, VCPU_TACR(r9) 1266 mfspr r5, SPRN_TCSCR 1267 mfspr r6, SPRN_ACOP 1268 mfspr r7, SPRN_PID 1269 mfspr r8, SPRN_WORT 1270 std r5, VCPU_TCSCR(r9) 1271 std r6, VCPU_ACOP(r9) 1272 stw r7, VCPU_GUEST_PID(r9) 1273 std r8, VCPU_WORT(r9) 12748: 1275 1276 /* Save and reset AMR and UAMOR before turning on the MMU */ 1277 mfspr r5,SPRN_AMR 1278 mfspr r6,SPRN_UAMOR 1279 std r5,VCPU_AMR(r9) 1280 std r6,VCPU_UAMOR(r9) 1281 li r6,0 1282 mtspr SPRN_AMR,r6 1283 1284 /* Switch DSCR back to host value */ 1285 mfspr r8, SPRN_DSCR 1286 ld r7, HSTATE_DSCR(r13) 1287 std r8, VCPU_DSCR(r9) 1288 mtspr SPRN_DSCR, r7 1289 1290 /* Save non-volatile GPRs */ 1291 std r14, VCPU_GPR(R14)(r9) 1292 std r15, VCPU_GPR(R15)(r9) 1293 std r16, VCPU_GPR(R16)(r9) 1294 std r17, VCPU_GPR(R17)(r9) 1295 std r18, VCPU_GPR(R18)(r9) 1296 std r19, VCPU_GPR(R19)(r9) 1297 std r20, VCPU_GPR(R20)(r9) 1298 std r21, VCPU_GPR(R21)(r9) 1299 std r22, VCPU_GPR(R22)(r9) 1300 std r23, VCPU_GPR(R23)(r9) 1301 std r24, VCPU_GPR(R24)(r9) 1302 std r25, VCPU_GPR(R25)(r9) 1303 std r26, VCPU_GPR(R26)(r9) 1304 std r27, VCPU_GPR(R27)(r9) 1305 std r28, VCPU_GPR(R28)(r9) 1306 std r29, VCPU_GPR(R29)(r9) 1307 std r30, VCPU_GPR(R30)(r9) 1308 std r31, VCPU_GPR(R31)(r9) 1309 1310 /* Save SPRGs */ 1311 mfspr r3, SPRN_SPRG0 1312 mfspr r4, SPRN_SPRG1 1313 mfspr r5, SPRN_SPRG2 1314 mfspr r6, SPRN_SPRG3 1315 std r3, VCPU_SPRG0(r9) 1316 std r4, VCPU_SPRG1(r9) 1317 std r5, VCPU_SPRG2(r9) 1318 std r6, VCPU_SPRG3(r9) 1319 1320 /* save FP state */ 1321 mr r3, r9 1322 bl kvmppc_save_fp 1323 1324#ifdef CONFIG_PPC_TRANSACTIONAL_MEM 1325BEGIN_FTR_SECTION 1326 b 2f 1327END_FTR_SECTION_IFCLR(CPU_FTR_TM) 1328 /* Turn on TM. */ 1329 mfmsr r8 1330 li r0, 1 1331 rldimi r8, r0, MSR_TM_LG, 63-MSR_TM_LG 1332 mtmsrd r8 1333 1334 ld r5, VCPU_MSR(r9) 1335 rldicl. r5, r5, 64 - MSR_TS_S_LG, 62 1336 beq 1f /* TM not active in guest. */ 1337 1338 li r3, TM_CAUSE_KVM_RESCHED 1339 1340 /* Clear the MSR RI since r1, r13 are all going to be foobar. */ 1341 li r5, 0 1342 mtmsrd r5, 1 1343 1344 /* All GPRs are volatile at this point. */ 1345 TRECLAIM(R3) 1346 1347 /* Temporarily store r13 and r9 so we have some regs to play with */ 1348 SET_SCRATCH0(r13) 1349 GET_PACA(r13) 1350 std r9, PACATMSCRATCH(r13) 1351 ld r9, HSTATE_KVM_VCPU(r13) 1352 1353 /* Get a few more GPRs free. */ 1354 std r29, VCPU_GPRS_TM(29)(r9) 1355 std r30, VCPU_GPRS_TM(30)(r9) 1356 std r31, VCPU_GPRS_TM(31)(r9) 1357 1358 /* Save away PPR and DSCR soon so don't run with user values. */ 1359 mfspr r31, SPRN_PPR 1360 HMT_MEDIUM 1361 mfspr r30, SPRN_DSCR 1362 ld r29, HSTATE_DSCR(r13) 1363 mtspr SPRN_DSCR, r29 1364 1365 /* Save all but r9, r13 & r29-r31 */ 1366 reg = 0 1367 .rept 29 1368 .if (reg != 9) && (reg != 13) 1369 std reg, VCPU_GPRS_TM(reg)(r9) 1370 .endif 1371 reg = reg + 1 1372 .endr 1373 /* ... now save r13 */ 1374 GET_SCRATCH0(r4) 1375 std r4, VCPU_GPRS_TM(13)(r9) 1376 /* ... and save r9 */ 1377 ld r4, PACATMSCRATCH(r13) 1378 std r4, VCPU_GPRS_TM(9)(r9) 1379 1380 /* Reload stack pointer and TOC. */ 1381 ld r1, HSTATE_HOST_R1(r13) 1382 ld r2, PACATOC(r13) 1383 1384 /* Set MSR RI now we have r1 and r13 back. */ 1385 li r5, MSR_RI 1386 mtmsrd r5, 1 1387 1388 /* Save away checkpinted SPRs. */ 1389 std r31, VCPU_PPR_TM(r9) 1390 std r30, VCPU_DSCR_TM(r9) 1391 mflr r5 1392 mfcr r6 1393 mfctr r7 1394 mfspr r8, SPRN_AMR 1395 mfspr r10, SPRN_TAR 1396 std r5, VCPU_LR_TM(r9) 1397 stw r6, VCPU_CR_TM(r9) 1398 std r7, VCPU_CTR_TM(r9) 1399 std r8, VCPU_AMR_TM(r9) 1400 std r10, VCPU_TAR_TM(r9) 1401 1402 /* Restore r12 as trap number. */ 1403 lwz r12, VCPU_TRAP(r9) 1404 1405 /* Save FP/VSX. */ 1406 addi r3, r9, VCPU_FPRS_TM 1407 bl store_fp_state 1408 addi r3, r9, VCPU_VRS_TM 1409 bl store_vr_state 1410 mfspr r6, SPRN_VRSAVE 1411 stw r6, VCPU_VRSAVE_TM(r9) 14121: 1413 /* 1414 * We need to save these SPRs after the treclaim so that the software 1415 * error code is recorded correctly in the TEXASR. Also the user may 1416 * change these outside of a transaction, so they must always be 1417 * context switched. 1418 */ 1419 mfspr r5, SPRN_TFHAR 1420 mfspr r6, SPRN_TFIAR 1421 mfspr r7, SPRN_TEXASR 1422 std r5, VCPU_TFHAR(r9) 1423 std r6, VCPU_TFIAR(r9) 1424 std r7, VCPU_TEXASR(r9) 14252: 1426#endif 1427 1428 /* Increment yield count if they have a VPA */ 1429 ld r8, VCPU_VPA(r9) /* do they have a VPA? */ 1430 cmpdi r8, 0 1431 beq 25f 1432 li r4, LPPACA_YIELDCOUNT 1433 LWZX_BE r3, r8, r4 1434 addi r3, r3, 1 1435 STWX_BE r3, r8, r4 1436 li r3, 1 1437 stb r3, VCPU_VPA_DIRTY(r9) 143825: 1439 /* Save PMU registers if requested */ 1440 /* r8 and cr0.eq are live here */ 1441BEGIN_FTR_SECTION 1442 /* 1443 * POWER8 seems to have a hardware bug where setting 1444 * MMCR0[PMAE] along with MMCR0[PMC1CE] and/or MMCR0[PMCjCE] 1445 * when some counters are already negative doesn't seem 1446 * to cause a performance monitor alert (and hence interrupt). 1447 * The effect of this is that when saving the PMU state, 1448 * if there is no PMU alert pending when we read MMCR0 1449 * before freezing the counters, but one becomes pending 1450 * before we read the counters, we lose it. 1451 * To work around this, we need a way to freeze the counters 1452 * before reading MMCR0. Normally, freezing the counters 1453 * is done by writing MMCR0 (to set MMCR0[FC]) which 1454 * unavoidably writes MMCR0[PMA0] as well. On POWER8, 1455 * we can also freeze the counters using MMCR2, by writing 1456 * 1s to all the counter freeze condition bits (there are 1457 * 9 bits each for 6 counters). 1458 */ 1459 li r3, -1 /* set all freeze bits */ 1460 clrrdi r3, r3, 10 1461 mfspr r10, SPRN_MMCR2 1462 mtspr SPRN_MMCR2, r3 1463 isync 1464END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) 1465 li r3, 1 1466 sldi r3, r3, 31 /* MMCR0_FC (freeze counters) bit */ 1467 mfspr r4, SPRN_MMCR0 /* save MMCR0 */ 1468 mtspr SPRN_MMCR0, r3 /* freeze all counters, disable ints */ 1469 mfspr r6, SPRN_MMCRA 1470 /* Clear MMCRA in order to disable SDAR updates */ 1471 li r7, 0 1472 mtspr SPRN_MMCRA, r7 1473 isync 1474 beq 21f /* if no VPA, save PMU stuff anyway */ 1475 lbz r7, LPPACA_PMCINUSE(r8) 1476 cmpwi r7, 0 /* did they ask for PMU stuff to be saved? */ 1477 bne 21f 1478 std r3, VCPU_MMCR(r9) /* if not, set saved MMCR0 to FC */ 1479 b 22f 148021: mfspr r5, SPRN_MMCR1 1481 mfspr r7, SPRN_SIAR 1482 mfspr r8, SPRN_SDAR 1483 std r4, VCPU_MMCR(r9) 1484 std r5, VCPU_MMCR + 8(r9) 1485 std r6, VCPU_MMCR + 16(r9) 1486BEGIN_FTR_SECTION 1487 std r10, VCPU_MMCR + 24(r9) 1488END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) 1489 std r7, VCPU_SIAR(r9) 1490 std r8, VCPU_SDAR(r9) 1491 mfspr r3, SPRN_PMC1 1492 mfspr r4, SPRN_PMC2 1493 mfspr r5, SPRN_PMC3 1494 mfspr r6, SPRN_PMC4 1495 mfspr r7, SPRN_PMC5 1496 mfspr r8, SPRN_PMC6 1497 stw r3, VCPU_PMC(r9) 1498 stw r4, VCPU_PMC + 4(r9) 1499 stw r5, VCPU_PMC + 8(r9) 1500 stw r6, VCPU_PMC + 12(r9) 1501 stw r7, VCPU_PMC + 16(r9) 1502 stw r8, VCPU_PMC + 20(r9) 1503BEGIN_FTR_SECTION 1504 mfspr r5, SPRN_SIER 1505 mfspr r6, SPRN_SPMC1 1506 mfspr r7, SPRN_SPMC2 1507 mfspr r8, SPRN_MMCRS 1508 std r5, VCPU_SIER(r9) 1509 stw r6, VCPU_PMC + 24(r9) 1510 stw r7, VCPU_PMC + 28(r9) 1511 std r8, VCPU_MMCR + 32(r9) 1512 lis r4, 0x8000 1513 mtspr SPRN_MMCRS, r4 1514END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) 151522: 1516 /* Clear out SLB */ 1517 li r5,0 1518 slbmte r5,r5 1519 slbia 1520 ptesync 1521 1522 /* 1523 * POWER7/POWER8 guest -> host partition switch code. 1524 * We don't have to lock against tlbies but we do 1525 * have to coordinate the hardware threads. 1526 */ 1527kvmhv_switch_to_host: 1528 /* Secondary threads wait for primary to do partition switch */ 1529 ld r5,HSTATE_KVM_VCORE(r13) 1530 ld r4,VCORE_KVM(r5) /* pointer to struct kvm */ 1531 lbz r3,HSTATE_PTID(r13) 1532 cmpwi r3,0 1533 beq 15f 1534 HMT_LOW 153513: lbz r3,VCORE_IN_GUEST(r5) 1536 cmpwi r3,0 1537 bne 13b 1538 HMT_MEDIUM 1539 b 16f 1540 1541 /* Primary thread waits for all the secondaries to exit guest */ 154215: lwz r3,VCORE_ENTRY_EXIT(r5) 1543 srwi r0,r3,8 1544 clrldi r3,r3,56 1545 cmpw r3,r0 1546 bne 15b 1547 isync 1548 1549 /* Primary thread switches back to host partition */ 1550 ld r6,KVM_HOST_SDR1(r4) 1551 lwz r7,KVM_HOST_LPID(r4) 1552 li r8,LPID_RSVD /* switch to reserved LPID */ 1553 mtspr SPRN_LPID,r8 1554 ptesync 1555 mtspr SPRN_SDR1,r6 /* switch to partition page table */ 1556 mtspr SPRN_LPID,r7 1557 isync 1558 1559BEGIN_FTR_SECTION 1560 /* DPDES is shared between threads */ 1561 mfspr r7, SPRN_DPDES 1562 std r7, VCORE_DPDES(r5) 1563 /* clear DPDES so we don't get guest doorbells in the host */ 1564 li r8, 0 1565 mtspr SPRN_DPDES, r8 1566END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) 1567 1568 /* Subtract timebase offset from timebase */ 1569 ld r8,VCORE_TB_OFFSET(r5) 1570 cmpdi r8,0 1571 beq 17f 1572 mftb r6 /* current guest timebase */ 1573 subf r8,r8,r6 1574 mtspr SPRN_TBU40,r8 /* update upper 40 bits */ 1575 mftb r7 /* check if lower 24 bits overflowed */ 1576 clrldi r6,r6,40 1577 clrldi r7,r7,40 1578 cmpld r7,r6 1579 bge 17f 1580 addis r8,r8,0x100 /* if so, increment upper 40 bits */ 1581 mtspr SPRN_TBU40,r8 1582 1583 /* Reset PCR */ 158417: ld r0, VCORE_PCR(r5) 1585 cmpdi r0, 0 1586 beq 18f 1587 li r0, 0 1588 mtspr SPRN_PCR, r0 158918: 1590 /* Signal secondary CPUs to continue */ 1591 stb r0,VCORE_IN_GUEST(r5) 1592 lis r8,0x7fff /* MAX_INT@h */ 1593 mtspr SPRN_HDEC,r8 1594 159516: ld r8,KVM_HOST_LPCR(r4) 1596 mtspr SPRN_LPCR,r8 1597 isync 1598 1599 /* load host SLB entries */ 1600 ld r8,PACA_SLBSHADOWPTR(r13) 1601 1602 .rept SLB_NUM_BOLTED 1603 li r3, SLBSHADOW_SAVEAREA 1604 LDX_BE r5, r8, r3 1605 addi r3, r3, 8 1606 LDX_BE r6, r8, r3 1607 andis. r7,r5,SLB_ESID_V@h 1608 beq 1f 1609 slbmte r6,r5 16101: addi r8,r8,16 1611 .endr 1612 1613#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING 1614 /* Finish timing, if we have a vcpu */ 1615 ld r4, HSTATE_KVM_VCPU(r13) 1616 cmpdi r4, 0 1617 li r3, 0 1618 beq 2f 1619 bl kvmhv_accumulate_time 16202: 1621#endif 1622 /* Unset guest mode */ 1623 li r0, KVM_GUEST_MODE_NONE 1624 stb r0, HSTATE_IN_GUEST(r13) 1625 1626 ld r0, 112+PPC_LR_STKOFF(r1) 1627 addi r1, r1, 112 1628 mtlr r0 1629 blr 1630 1631/* 1632 * Check whether an HDSI is an HPTE not found fault or something else. 1633 * If it is an HPTE not found fault that is due to the guest accessing 1634 * a page that they have mapped but which we have paged out, then 1635 * we continue on with the guest exit path. In all other cases, 1636 * reflect the HDSI to the guest as a DSI. 1637 */ 1638kvmppc_hdsi: 1639 mfspr r4, SPRN_HDAR 1640 mfspr r6, SPRN_HDSISR 1641 /* HPTE not found fault or protection fault? */ 1642 andis. r0, r6, (DSISR_NOHPTE | DSISR_PROTFAULT)@h 1643 beq 1f /* if not, send it to the guest */ 1644 andi. r0, r11, MSR_DR /* data relocation enabled? */ 1645 beq 3f 1646 clrrdi r0, r4, 28 1647 PPC_SLBFEE_DOT(R5, R0) /* if so, look up SLB */ 1648 bne 1f /* if no SLB entry found */ 16494: std r4, VCPU_FAULT_DAR(r9) 1650 stw r6, VCPU_FAULT_DSISR(r9) 1651 1652 /* Search the hash table. */ 1653 mr r3, r9 /* vcpu pointer */ 1654 li r7, 1 /* data fault */ 1655 bl kvmppc_hpte_hv_fault 1656 ld r9, HSTATE_KVM_VCPU(r13) 1657 ld r10, VCPU_PC(r9) 1658 ld r11, VCPU_MSR(r9) 1659 li r12, BOOK3S_INTERRUPT_H_DATA_STORAGE 1660 cmpdi r3, 0 /* retry the instruction */ 1661 beq 6f 1662 cmpdi r3, -1 /* handle in kernel mode */ 1663 beq guest_exit_cont 1664 cmpdi r3, -2 /* MMIO emulation; need instr word */ 1665 beq 2f 1666 1667 /* Synthesize a DSI for the guest */ 1668 ld r4, VCPU_FAULT_DAR(r9) 1669 mr r6, r3 16701: mtspr SPRN_DAR, r4 1671 mtspr SPRN_DSISR, r6 1672 mtspr SPRN_SRR0, r10 1673 mtspr SPRN_SRR1, r11 1674 li r10, BOOK3S_INTERRUPT_DATA_STORAGE 1675 bl kvmppc_msr_interrupt 1676fast_interrupt_c_return: 16776: ld r7, VCPU_CTR(r9) 1678 lwz r8, VCPU_XER(r9) 1679 mtctr r7 1680 mtxer r8 1681 mr r4, r9 1682 b fast_guest_return 1683 16843: ld r5, VCPU_KVM(r9) /* not relocated, use VRMA */ 1685 ld r5, KVM_VRMA_SLB_V(r5) 1686 b 4b 1687 1688 /* If this is for emulated MMIO, load the instruction word */ 16892: li r8, KVM_INST_FETCH_FAILED /* In case lwz faults */ 1690 1691 /* Set guest mode to 'jump over instruction' so if lwz faults 1692 * we'll just continue at the next IP. */ 1693 li r0, KVM_GUEST_MODE_SKIP 1694 stb r0, HSTATE_IN_GUEST(r13) 1695 1696 /* Do the access with MSR:DR enabled */ 1697 mfmsr r3 1698 ori r4, r3, MSR_DR /* Enable paging for data */ 1699 mtmsrd r4 1700 lwz r8, 0(r10) 1701 mtmsrd r3 1702 1703 /* Store the result */ 1704 stw r8, VCPU_LAST_INST(r9) 1705 1706 /* Unset guest mode. */ 1707 li r0, KVM_GUEST_MODE_HOST_HV 1708 stb r0, HSTATE_IN_GUEST(r13) 1709 b guest_exit_cont 1710 1711/* 1712 * Similarly for an HISI, reflect it to the guest as an ISI unless 1713 * it is an HPTE not found fault for a page that we have paged out. 1714 */ 1715kvmppc_hisi: 1716 andis. r0, r11, SRR1_ISI_NOPT@h 1717 beq 1f 1718 andi. r0, r11, MSR_IR /* instruction relocation enabled? */ 1719 beq 3f 1720 clrrdi r0, r10, 28 1721 PPC_SLBFEE_DOT(R5, R0) /* if so, look up SLB */ 1722 bne 1f /* if no SLB entry found */ 17234: 1724 /* Search the hash table. */ 1725 mr r3, r9 /* vcpu pointer */ 1726 mr r4, r10 1727 mr r6, r11 1728 li r7, 0 /* instruction fault */ 1729 bl kvmppc_hpte_hv_fault 1730 ld r9, HSTATE_KVM_VCPU(r13) 1731 ld r10, VCPU_PC(r9) 1732 ld r11, VCPU_MSR(r9) 1733 li r12, BOOK3S_INTERRUPT_H_INST_STORAGE 1734 cmpdi r3, 0 /* retry the instruction */ 1735 beq fast_interrupt_c_return 1736 cmpdi r3, -1 /* handle in kernel mode */ 1737 beq guest_exit_cont 1738 1739 /* Synthesize an ISI for the guest */ 1740 mr r11, r3 17411: mtspr SPRN_SRR0, r10 1742 mtspr SPRN_SRR1, r11 1743 li r10, BOOK3S_INTERRUPT_INST_STORAGE 1744 bl kvmppc_msr_interrupt 1745 b fast_interrupt_c_return 1746 17473: ld r6, VCPU_KVM(r9) /* not relocated, use VRMA */ 1748 ld r5, KVM_VRMA_SLB_V(r6) 1749 b 4b 1750 1751/* 1752 * Try to handle an hcall in real mode. 1753 * Returns to the guest if we handle it, or continues on up to 1754 * the kernel if we can't (i.e. if we don't have a handler for 1755 * it, or if the handler returns H_TOO_HARD). 1756 * 1757 * r5 - r8 contain hcall args, 1758 * r9 = vcpu, r10 = pc, r11 = msr, r12 = trap, r13 = paca 1759 */ 1760hcall_try_real_mode: 1761 ld r3,VCPU_GPR(R3)(r9) 1762 andi. r0,r11,MSR_PR 1763 /* sc 1 from userspace - reflect to guest syscall */ 1764 bne sc_1_fast_return 1765 clrrdi r3,r3,2 1766 cmpldi r3,hcall_real_table_end - hcall_real_table 1767 bge guest_exit_cont 1768 /* See if this hcall is enabled for in-kernel handling */ 1769 ld r4, VCPU_KVM(r9) 1770 srdi r0, r3, 8 /* r0 = (r3 / 4) >> 6 */ 1771 sldi r0, r0, 3 /* index into kvm->arch.enabled_hcalls[] */ 1772 add r4, r4, r0 1773 ld r0, KVM_ENABLED_HCALLS(r4) 1774 rlwinm r4, r3, 32-2, 0x3f /* r4 = (r3 / 4) & 0x3f */ 1775 srd r0, r0, r4 1776 andi. r0, r0, 1 1777 beq guest_exit_cont 1778 /* Get pointer to handler, if any, and call it */ 1779 LOAD_REG_ADDR(r4, hcall_real_table) 1780 lwax r3,r3,r4 1781 cmpwi r3,0 1782 beq guest_exit_cont 1783 add r12,r3,r4 1784 mtctr r12 1785 mr r3,r9 /* get vcpu pointer */ 1786 ld r4,VCPU_GPR(R4)(r9) 1787 bctrl 1788 cmpdi r3,H_TOO_HARD 1789 beq hcall_real_fallback 1790 ld r4,HSTATE_KVM_VCPU(r13) 1791 std r3,VCPU_GPR(R3)(r4) 1792 ld r10,VCPU_PC(r4) 1793 ld r11,VCPU_MSR(r4) 1794 b fast_guest_return 1795 1796sc_1_fast_return: 1797 mtspr SPRN_SRR0,r10 1798 mtspr SPRN_SRR1,r11 1799 li r10, BOOK3S_INTERRUPT_SYSCALL 1800 bl kvmppc_msr_interrupt 1801 mr r4,r9 1802 b fast_guest_return 1803 1804 /* We've attempted a real mode hcall, but it's punted it back 1805 * to userspace. We need to restore some clobbered volatiles 1806 * before resuming the pass-it-to-qemu path */ 1807hcall_real_fallback: 1808 li r12,BOOK3S_INTERRUPT_SYSCALL 1809 ld r9, HSTATE_KVM_VCPU(r13) 1810 1811 b guest_exit_cont 1812 1813 .globl hcall_real_table 1814hcall_real_table: 1815 .long 0 /* 0 - unused */ 1816 .long DOTSYM(kvmppc_h_remove) - hcall_real_table 1817 .long DOTSYM(kvmppc_h_enter) - hcall_real_table 1818 .long DOTSYM(kvmppc_h_read) - hcall_real_table 1819 .long 0 /* 0x10 - H_CLEAR_MOD */ 1820 .long 0 /* 0x14 - H_CLEAR_REF */ 1821 .long DOTSYM(kvmppc_h_protect) - hcall_real_table 1822 .long DOTSYM(kvmppc_h_get_tce) - hcall_real_table 1823 .long DOTSYM(kvmppc_h_put_tce) - hcall_real_table 1824 .long 0 /* 0x24 - H_SET_SPRG0 */ 1825 .long DOTSYM(kvmppc_h_set_dabr) - hcall_real_table 1826 .long 0 /* 0x2c */ 1827 .long 0 /* 0x30 */ 1828 .long 0 /* 0x34 */ 1829 .long 0 /* 0x38 */ 1830 .long 0 /* 0x3c */ 1831 .long 0 /* 0x40 */ 1832 .long 0 /* 0x44 */ 1833 .long 0 /* 0x48 */ 1834 .long 0 /* 0x4c */ 1835 .long 0 /* 0x50 */ 1836 .long 0 /* 0x54 */ 1837 .long 0 /* 0x58 */ 1838 .long 0 /* 0x5c */ 1839 .long 0 /* 0x60 */ 1840#ifdef CONFIG_KVM_XICS 1841 .long DOTSYM(kvmppc_rm_h_eoi) - hcall_real_table 1842 .long DOTSYM(kvmppc_rm_h_cppr) - hcall_real_table 1843 .long DOTSYM(kvmppc_rm_h_ipi) - hcall_real_table 1844 .long 0 /* 0x70 - H_IPOLL */ 1845 .long DOTSYM(kvmppc_rm_h_xirr) - hcall_real_table 1846#else 1847 .long 0 /* 0x64 - H_EOI */ 1848 .long 0 /* 0x68 - H_CPPR */ 1849 .long 0 /* 0x6c - H_IPI */ 1850 .long 0 /* 0x70 - H_IPOLL */ 1851 .long 0 /* 0x74 - H_XIRR */ 1852#endif 1853 .long 0 /* 0x78 */ 1854 .long 0 /* 0x7c */ 1855 .long 0 /* 0x80 */ 1856 .long 0 /* 0x84 */ 1857 .long 0 /* 0x88 */ 1858 .long 0 /* 0x8c */ 1859 .long 0 /* 0x90 */ 1860 .long 0 /* 0x94 */ 1861 .long 0 /* 0x98 */ 1862 .long 0 /* 0x9c */ 1863 .long 0 /* 0xa0 */ 1864 .long 0 /* 0xa4 */ 1865 .long 0 /* 0xa8 */ 1866 .long 0 /* 0xac */ 1867 .long 0 /* 0xb0 */ 1868 .long 0 /* 0xb4 */ 1869 .long 0 /* 0xb8 */ 1870 .long 0 /* 0xbc */ 1871 .long 0 /* 0xc0 */ 1872 .long 0 /* 0xc4 */ 1873 .long 0 /* 0xc8 */ 1874 .long 0 /* 0xcc */ 1875 .long 0 /* 0xd0 */ 1876 .long 0 /* 0xd4 */ 1877 .long 0 /* 0xd8 */ 1878 .long 0 /* 0xdc */ 1879 .long DOTSYM(kvmppc_h_cede) - hcall_real_table 1880 .long DOTSYM(kvmppc_rm_h_confer) - hcall_real_table 1881 .long 0 /* 0xe8 */ 1882 .long 0 /* 0xec */ 1883 .long 0 /* 0xf0 */ 1884 .long 0 /* 0xf4 */ 1885 .long 0 /* 0xf8 */ 1886 .long 0 /* 0xfc */ 1887 .long 0 /* 0x100 */ 1888 .long 0 /* 0x104 */ 1889 .long 0 /* 0x108 */ 1890 .long 0 /* 0x10c */ 1891 .long 0 /* 0x110 */ 1892 .long 0 /* 0x114 */ 1893 .long 0 /* 0x118 */ 1894 .long 0 /* 0x11c */ 1895 .long 0 /* 0x120 */ 1896 .long DOTSYM(kvmppc_h_bulk_remove) - hcall_real_table 1897 .long 0 /* 0x128 */ 1898 .long 0 /* 0x12c */ 1899 .long 0 /* 0x130 */ 1900 .long DOTSYM(kvmppc_h_set_xdabr) - hcall_real_table 1901 .long 0 /* 0x138 */ 1902 .long 0 /* 0x13c */ 1903 .long 0 /* 0x140 */ 1904 .long 0 /* 0x144 */ 1905 .long 0 /* 0x148 */ 1906 .long 0 /* 0x14c */ 1907 .long 0 /* 0x150 */ 1908 .long 0 /* 0x154 */ 1909 .long 0 /* 0x158 */ 1910 .long 0 /* 0x15c */ 1911 .long 0 /* 0x160 */ 1912 .long 0 /* 0x164 */ 1913 .long 0 /* 0x168 */ 1914 .long 0 /* 0x16c */ 1915 .long 0 /* 0x170 */ 1916 .long 0 /* 0x174 */ 1917 .long 0 /* 0x178 */ 1918 .long 0 /* 0x17c */ 1919 .long 0 /* 0x180 */ 1920 .long 0 /* 0x184 */ 1921 .long 0 /* 0x188 */ 1922 .long 0 /* 0x18c */ 1923 .long 0 /* 0x190 */ 1924 .long 0 /* 0x194 */ 1925 .long 0 /* 0x198 */ 1926 .long 0 /* 0x19c */ 1927 .long 0 /* 0x1a0 */ 1928 .long 0 /* 0x1a4 */ 1929 .long 0 /* 0x1a8 */ 1930 .long 0 /* 0x1ac */ 1931 .long 0 /* 0x1b0 */ 1932 .long 0 /* 0x1b4 */ 1933 .long 0 /* 0x1b8 */ 1934 .long 0 /* 0x1bc */ 1935 .long 0 /* 0x1c0 */ 1936 .long 0 /* 0x1c4 */ 1937 .long 0 /* 0x1c8 */ 1938 .long 0 /* 0x1cc */ 1939 .long 0 /* 0x1d0 */ 1940 .long 0 /* 0x1d4 */ 1941 .long 0 /* 0x1d8 */ 1942 .long 0 /* 0x1dc */ 1943 .long 0 /* 0x1e0 */ 1944 .long 0 /* 0x1e4 */ 1945 .long 0 /* 0x1e8 */ 1946 .long 0 /* 0x1ec */ 1947 .long 0 /* 0x1f0 */ 1948 .long 0 /* 0x1f4 */ 1949 .long 0 /* 0x1f8 */ 1950 .long 0 /* 0x1fc */ 1951 .long 0 /* 0x200 */ 1952 .long 0 /* 0x204 */ 1953 .long 0 /* 0x208 */ 1954 .long 0 /* 0x20c */ 1955 .long 0 /* 0x210 */ 1956 .long 0 /* 0x214 */ 1957 .long 0 /* 0x218 */ 1958 .long 0 /* 0x21c */ 1959 .long 0 /* 0x220 */ 1960 .long 0 /* 0x224 */ 1961 .long 0 /* 0x228 */ 1962 .long 0 /* 0x22c */ 1963 .long 0 /* 0x230 */ 1964 .long 0 /* 0x234 */ 1965 .long 0 /* 0x238 */ 1966 .long 0 /* 0x23c */ 1967 .long 0 /* 0x240 */ 1968 .long 0 /* 0x244 */ 1969 .long 0 /* 0x248 */ 1970 .long 0 /* 0x24c */ 1971 .long 0 /* 0x250 */ 1972 .long 0 /* 0x254 */ 1973 .long 0 /* 0x258 */ 1974 .long 0 /* 0x25c */ 1975 .long 0 /* 0x260 */ 1976 .long 0 /* 0x264 */ 1977 .long 0 /* 0x268 */ 1978 .long 0 /* 0x26c */ 1979 .long 0 /* 0x270 */ 1980 .long 0 /* 0x274 */ 1981 .long 0 /* 0x278 */ 1982 .long 0 /* 0x27c */ 1983 .long 0 /* 0x280 */ 1984 .long 0 /* 0x284 */ 1985 .long 0 /* 0x288 */ 1986 .long 0 /* 0x28c */ 1987 .long 0 /* 0x290 */ 1988 .long 0 /* 0x294 */ 1989 .long 0 /* 0x298 */ 1990 .long 0 /* 0x29c */ 1991 .long 0 /* 0x2a0 */ 1992 .long 0 /* 0x2a4 */ 1993 .long 0 /* 0x2a8 */ 1994 .long 0 /* 0x2ac */ 1995 .long 0 /* 0x2b0 */ 1996 .long 0 /* 0x2b4 */ 1997 .long 0 /* 0x2b8 */ 1998 .long 0 /* 0x2bc */ 1999 .long 0 /* 0x2c0 */ 2000 .long 0 /* 0x2c4 */ 2001 .long 0 /* 0x2c8 */ 2002 .long 0 /* 0x2cc */ 2003 .long 0 /* 0x2d0 */ 2004 .long 0 /* 0x2d4 */ 2005 .long 0 /* 0x2d8 */ 2006 .long 0 /* 0x2dc */ 2007 .long 0 /* 0x2e0 */ 2008 .long 0 /* 0x2e4 */ 2009 .long 0 /* 0x2e8 */ 2010 .long 0 /* 0x2ec */ 2011 .long 0 /* 0x2f0 */ 2012 .long 0 /* 0x2f4 */ 2013 .long 0 /* 0x2f8 */ 2014 .long 0 /* 0x2fc */ 2015 .long DOTSYM(kvmppc_h_random) - hcall_real_table 2016 .globl hcall_real_table_end 2017hcall_real_table_end: 2018 2019_GLOBAL(kvmppc_h_set_xdabr) 2020 andi. r0, r5, DABRX_USER | DABRX_KERNEL 2021 beq 6f 2022 li r0, DABRX_USER | DABRX_KERNEL | DABRX_BTI 2023 andc. r0, r5, r0 2024 beq 3f 20256: li r3, H_PARAMETER 2026 blr 2027 2028_GLOBAL(kvmppc_h_set_dabr) 2029 li r5, DABRX_USER | DABRX_KERNEL 20303: 2031BEGIN_FTR_SECTION 2032 b 2f 2033END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) 2034 std r4,VCPU_DABR(r3) 2035 stw r5, VCPU_DABRX(r3) 2036 mtspr SPRN_DABRX, r5 2037 /* Work around P7 bug where DABR can get corrupted on mtspr */ 20381: mtspr SPRN_DABR,r4 2039 mfspr r5, SPRN_DABR 2040 cmpd r4, r5 2041 bne 1b 2042 isync 2043 li r3,0 2044 blr 2045 2046 /* Emulate H_SET_DABR/X on P8 for the sake of compat mode guests */ 20472: rlwimi r5, r4, 5, DAWRX_DR | DAWRX_DW 2048 rlwimi r5, r4, 1, DAWRX_WT 2049 clrrdi r4, r4, 3 2050 std r4, VCPU_DAWR(r3) 2051 std r5, VCPU_DAWRX(r3) 2052 mtspr SPRN_DAWR, r4 2053 mtspr SPRN_DAWRX, r5 2054 li r3, 0 2055 blr 2056 2057_GLOBAL(kvmppc_h_cede) /* r3 = vcpu pointer, r11 = msr, r13 = paca */ 2058 ori r11,r11,MSR_EE 2059 std r11,VCPU_MSR(r3) 2060 li r0,1 2061 stb r0,VCPU_CEDED(r3) 2062 sync /* order setting ceded vs. testing prodded */ 2063 lbz r5,VCPU_PRODDED(r3) 2064 cmpwi r5,0 2065 bne kvm_cede_prodded 2066 li r12,0 /* set trap to 0 to say hcall is handled */ 2067 stw r12,VCPU_TRAP(r3) 2068 li r0,H_SUCCESS 2069 std r0,VCPU_GPR(R3)(r3) 2070 2071 /* 2072 * Set our bit in the bitmask of napping threads unless all the 2073 * other threads are already napping, in which case we send this 2074 * up to the host. 2075 */ 2076 ld r5,HSTATE_KVM_VCORE(r13) 2077 lbz r6,HSTATE_PTID(r13) 2078 lwz r8,VCORE_ENTRY_EXIT(r5) 2079 clrldi r8,r8,56 2080 li r0,1 2081 sld r0,r0,r6 2082 addi r6,r5,VCORE_NAPPING_THREADS 208331: lwarx r4,0,r6 2084 or r4,r4,r0 2085 cmpw r4,r8 2086 beq kvm_cede_exit 2087 stwcx. r4,0,r6 2088 bne 31b 2089 /* order napping_threads update vs testing entry_exit_map */ 2090 isync 2091 li r0,NAPPING_CEDE 2092 stb r0,HSTATE_NAPPING(r13) 2093 lwz r7,VCORE_ENTRY_EXIT(r5) 2094 cmpwi r7,0x100 2095 bge 33f /* another thread already exiting */ 2096 2097/* 2098 * Although not specifically required by the architecture, POWER7 2099 * preserves the following registers in nap mode, even if an SMT mode 2100 * switch occurs: SLB entries, PURR, SPURR, AMOR, UAMOR, AMR, SPRG0-3, 2101 * DAR, DSISR, DABR, DABRX, DSCR, PMCx, MMCRx, SIAR, SDAR. 2102 */ 2103 /* Save non-volatile GPRs */ 2104 std r14, VCPU_GPR(R14)(r3) 2105 std r15, VCPU_GPR(R15)(r3) 2106 std r16, VCPU_GPR(R16)(r3) 2107 std r17, VCPU_GPR(R17)(r3) 2108 std r18, VCPU_GPR(R18)(r3) 2109 std r19, VCPU_GPR(R19)(r3) 2110 std r20, VCPU_GPR(R20)(r3) 2111 std r21, VCPU_GPR(R21)(r3) 2112 std r22, VCPU_GPR(R22)(r3) 2113 std r23, VCPU_GPR(R23)(r3) 2114 std r24, VCPU_GPR(R24)(r3) 2115 std r25, VCPU_GPR(R25)(r3) 2116 std r26, VCPU_GPR(R26)(r3) 2117 std r27, VCPU_GPR(R27)(r3) 2118 std r28, VCPU_GPR(R28)(r3) 2119 std r29, VCPU_GPR(R29)(r3) 2120 std r30, VCPU_GPR(R30)(r3) 2121 std r31, VCPU_GPR(R31)(r3) 2122 2123 /* save FP state */ 2124 bl kvmppc_save_fp 2125 2126 /* 2127 * Set DEC to the smaller of DEC and HDEC, so that we wake 2128 * no later than the end of our timeslice (HDEC interrupts 2129 * don't wake us from nap). 2130 */ 2131 mfspr r3, SPRN_DEC 2132 mfspr r4, SPRN_HDEC 2133 mftb r5 2134 cmpw r3, r4 2135 ble 67f 2136 mtspr SPRN_DEC, r4 213767: 2138 /* save expiry time of guest decrementer */ 2139 extsw r3, r3 2140 add r3, r3, r5 2141 ld r4, HSTATE_KVM_VCPU(r13) 2142 ld r5, HSTATE_KVM_VCORE(r13) 2143 ld r6, VCORE_TB_OFFSET(r5) 2144 subf r3, r6, r3 /* convert to host TB value */ 2145 std r3, VCPU_DEC_EXPIRES(r4) 2146 2147#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING 2148 ld r4, HSTATE_KVM_VCPU(r13) 2149 addi r3, r4, VCPU_TB_CEDE 2150 bl kvmhv_accumulate_time 2151#endif 2152 2153 lis r3, LPCR_PECEDP@h /* Do wake on privileged doorbell */ 2154 2155 /* 2156 * Take a nap until a decrementer or external or doobell interrupt 2157 * occurs, with PECE1 and PECE0 set in LPCR. 2158 * On POWER8, set PECEDH, and if we are ceding, also set PECEDP. 2159 * Also clear the runlatch bit before napping. 2160 */ 2161kvm_do_nap: 2162 mfspr r0, SPRN_CTRLF 2163 clrrdi r0, r0, 1 2164 mtspr SPRN_CTRLT, r0 2165 2166 li r0,1 2167 stb r0,HSTATE_HWTHREAD_REQ(r13) 2168 mfspr r5,SPRN_LPCR 2169 ori r5,r5,LPCR_PECE0 | LPCR_PECE1 2170BEGIN_FTR_SECTION 2171 ori r5, r5, LPCR_PECEDH 2172 rlwimi r5, r3, 0, LPCR_PECEDP 2173END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) 2174 mtspr SPRN_LPCR,r5 2175 isync 2176 li r0, 0 2177 std r0, HSTATE_SCRATCH0(r13) 2178 ptesync 2179 ld r0, HSTATE_SCRATCH0(r13) 21801: cmpd r0, r0 2181 bne 1b 2182 nap 2183 b . 2184 218533: mr r4, r3 2186 li r3, 0 2187 li r12, 0 2188 b 34f 2189 2190kvm_end_cede: 2191 /* get vcpu pointer */ 2192 ld r4, HSTATE_KVM_VCPU(r13) 2193 2194 /* Woken by external or decrementer interrupt */ 2195 ld r1, HSTATE_HOST_R1(r13) 2196 2197#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING 2198 addi r3, r4, VCPU_TB_RMINTR 2199 bl kvmhv_accumulate_time 2200#endif 2201 2202 /* load up FP state */ 2203 bl kvmppc_load_fp 2204 2205 /* Restore guest decrementer */ 2206 ld r3, VCPU_DEC_EXPIRES(r4) 2207 ld r5, HSTATE_KVM_VCORE(r13) 2208 ld r6, VCORE_TB_OFFSET(r5) 2209 add r3, r3, r6 /* convert host TB to guest TB value */ 2210 mftb r7 2211 subf r3, r7, r3 2212 mtspr SPRN_DEC, r3 2213 2214 /* Load NV GPRS */ 2215 ld r14, VCPU_GPR(R14)(r4) 2216 ld r15, VCPU_GPR(R15)(r4) 2217 ld r16, VCPU_GPR(R16)(r4) 2218 ld r17, VCPU_GPR(R17)(r4) 2219 ld r18, VCPU_GPR(R18)(r4) 2220 ld r19, VCPU_GPR(R19)(r4) 2221 ld r20, VCPU_GPR(R20)(r4) 2222 ld r21, VCPU_GPR(R21)(r4) 2223 ld r22, VCPU_GPR(R22)(r4) 2224 ld r23, VCPU_GPR(R23)(r4) 2225 ld r24, VCPU_GPR(R24)(r4) 2226 ld r25, VCPU_GPR(R25)(r4) 2227 ld r26, VCPU_GPR(R26)(r4) 2228 ld r27, VCPU_GPR(R27)(r4) 2229 ld r28, VCPU_GPR(R28)(r4) 2230 ld r29, VCPU_GPR(R29)(r4) 2231 ld r30, VCPU_GPR(R30)(r4) 2232 ld r31, VCPU_GPR(R31)(r4) 2233 2234 /* Check the wake reason in SRR1 to see why we got here */ 2235 bl kvmppc_check_wake_reason 2236 2237 /* clear our bit in vcore->napping_threads */ 223834: ld r5,HSTATE_KVM_VCORE(r13) 2239 lbz r7,HSTATE_PTID(r13) 2240 li r0,1 2241 sld r0,r0,r7 2242 addi r6,r5,VCORE_NAPPING_THREADS 224332: lwarx r7,0,r6 2244 andc r7,r7,r0 2245 stwcx. r7,0,r6 2246 bne 32b 2247 li r0,0 2248 stb r0,HSTATE_NAPPING(r13) 2249 2250 /* See if the wake reason means we need to exit */ 2251 stw r12, VCPU_TRAP(r4) 2252 mr r9, r4 2253 cmpdi r3, 0 2254 bgt guest_exit_cont 2255 2256 /* see if any other thread is already exiting */ 2257 lwz r0,VCORE_ENTRY_EXIT(r5) 2258 cmpwi r0,0x100 2259 bge guest_exit_cont 2260 2261 b kvmppc_cede_reentry /* if not go back to guest */ 2262 2263 /* cede when already previously prodded case */ 2264kvm_cede_prodded: 2265 li r0,0 2266 stb r0,VCPU_PRODDED(r3) 2267 sync /* order testing prodded vs. clearing ceded */ 2268 stb r0,VCPU_CEDED(r3) 2269 li r3,H_SUCCESS 2270 blr 2271 2272 /* we've ceded but we want to give control to the host */ 2273kvm_cede_exit: 2274 ld r9, HSTATE_KVM_VCPU(r13) 2275 b guest_exit_cont 2276 2277 /* Try to handle a machine check in real mode */ 2278machine_check_realmode: 2279 mr r3, r9 /* get vcpu pointer */ 2280 bl kvmppc_realmode_machine_check 2281 nop 2282 cmpdi r3, 0 /* Did we handle MCE ? */ 2283 ld r9, HSTATE_KVM_VCPU(r13) 2284 li r12, BOOK3S_INTERRUPT_MACHINE_CHECK 2285 /* 2286 * Deliver unhandled/fatal (e.g. UE) MCE errors to guest through 2287 * machine check interrupt (set HSRR0 to 0x200). And for handled 2288 * errors (no-fatal), just go back to guest execution with current 2289 * HSRR0 instead of exiting guest. This new approach will inject 2290 * machine check to guest for fatal error causing guest to crash. 2291 * 2292 * The old code used to return to host for unhandled errors which 2293 * was causing guest to hang with soft lockups inside guest and 2294 * makes it difficult to recover guest instance. 2295 */ 2296 ld r10, VCPU_PC(r9) 2297 ld r11, VCPU_MSR(r9) 2298 bne 2f /* Continue guest execution. */ 2299 /* If not, deliver a machine check. SRR0/1 are already set */ 2300 li r10, BOOK3S_INTERRUPT_MACHINE_CHECK 2301 ld r11, VCPU_MSR(r9) 2302 bl kvmppc_msr_interrupt 23032: b fast_interrupt_c_return 2304 2305/* 2306 * Check the reason we woke from nap, and take appropriate action. 2307 * Returns (in r3): 2308 * 0 if nothing needs to be done 2309 * 1 if something happened that needs to be handled by the host 2310 * -1 if there was a guest wakeup (IPI or msgsnd) 2311 * 2312 * Also sets r12 to the interrupt vector for any interrupt that needs 2313 * to be handled now by the host (0x500 for external interrupt), or zero. 2314 * Modifies r0, r6, r7, r8. 2315 */ 2316kvmppc_check_wake_reason: 2317 mfspr r6, SPRN_SRR1 2318BEGIN_FTR_SECTION 2319 rlwinm r6, r6, 45-31, 0xf /* extract wake reason field (P8) */ 2320FTR_SECTION_ELSE 2321 rlwinm r6, r6, 45-31, 0xe /* P7 wake reason field is 3 bits */ 2322ALT_FTR_SECTION_END_IFSET(CPU_FTR_ARCH_207S) 2323 cmpwi r6, 8 /* was it an external interrupt? */ 2324 li r12, BOOK3S_INTERRUPT_EXTERNAL 2325 beq kvmppc_read_intr /* if so, see what it was */ 2326 li r3, 0 2327 li r12, 0 2328 cmpwi r6, 6 /* was it the decrementer? */ 2329 beq 0f 2330BEGIN_FTR_SECTION 2331 cmpwi r6, 5 /* privileged doorbell? */ 2332 beq 0f 2333 cmpwi r6, 3 /* hypervisor doorbell? */ 2334 beq 3f 2335END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) 2336 li r3, 1 /* anything else, return 1 */ 23370: blr 2338 2339 /* hypervisor doorbell */ 23403: li r12, BOOK3S_INTERRUPT_H_DOORBELL 2341 /* see if it's a host IPI */ 2342 li r3, 1 2343 lbz r0, HSTATE_HOST_IPI(r13) 2344 cmpwi r0, 0 2345 bnelr 2346 /* if not, clear it and return -1 */ 2347 lis r6, (PPC_DBELL_SERVER << (63-36))@h 2348 PPC_MSGCLR(6) 2349 li r3, -1 2350 blr 2351 2352/* 2353 * Determine what sort of external interrupt is pending (if any). 2354 * Returns: 2355 * 0 if no interrupt is pending 2356 * 1 if an interrupt is pending that needs to be handled by the host 2357 * -1 if there was a guest wakeup IPI (which has now been cleared) 2358 * Modifies r0, r6, r7, r8, returns value in r3. 2359 */ 2360kvmppc_read_intr: 2361 /* see if a host IPI is pending */ 2362 li r3, 1 2363 lbz r0, HSTATE_HOST_IPI(r13) 2364 cmpwi r0, 0 2365 bne 1f 2366 2367 /* Now read the interrupt from the ICP */ 2368 ld r6, HSTATE_XICS_PHYS(r13) 2369 li r7, XICS_XIRR 2370 cmpdi r6, 0 2371 beq- 1f 2372 lwzcix r0, r6, r7 2373 /* 2374 * Save XIRR for later. Since we get in in reverse endian on LE 2375 * systems, save it byte reversed and fetch it back in host endian. 2376 */ 2377 li r3, HSTATE_SAVED_XIRR 2378 STWX_BE r0, r3, r13 2379#ifdef __LITTLE_ENDIAN__ 2380 lwz r3, HSTATE_SAVED_XIRR(r13) 2381#else 2382 mr r3, r0 2383#endif 2384 rlwinm. r3, r3, 0, 0xffffff 2385 sync 2386 beq 1f /* if nothing pending in the ICP */ 2387 2388 /* We found something in the ICP... 2389 * 2390 * If it's not an IPI, stash it in the PACA and return to 2391 * the host, we don't (yet) handle directing real external 2392 * interrupts directly to the guest 2393 */ 2394 cmpwi r3, XICS_IPI /* if there is, is it an IPI? */ 2395 bne 42f 2396 2397 /* It's an IPI, clear the MFRR and EOI it */ 2398 li r3, 0xff 2399 li r8, XICS_MFRR 2400 stbcix r3, r6, r8 /* clear the IPI */ 2401 stwcix r0, r6, r7 /* EOI it */ 2402 sync 2403 2404 /* We need to re-check host IPI now in case it got set in the 2405 * meantime. If it's clear, we bounce the interrupt to the 2406 * guest 2407 */ 2408 lbz r0, HSTATE_HOST_IPI(r13) 2409 cmpwi r0, 0 2410 bne- 43f 2411 2412 /* OK, it's an IPI for us */ 2413 li r12, 0 2414 li r3, -1 24151: blr 2416 241742: /* It's not an IPI and it's for the host. We saved a copy of XIRR in 2418 * the PACA earlier, it will be picked up by the host ICP driver 2419 */ 2420 li r3, 1 2421 b 1b 2422 242343: /* We raced with the host, we need to resend that IPI, bummer */ 2424 li r0, IPI_PRIORITY 2425 stbcix r0, r6, r8 /* set the IPI */ 2426 sync 2427 li r3, 1 2428 b 1b 2429 2430/* 2431 * Save away FP, VMX and VSX registers. 2432 * r3 = vcpu pointer 2433 * N.B. r30 and r31 are volatile across this function, 2434 * thus it is not callable from C. 2435 */ 2436kvmppc_save_fp: 2437 mflr r30 2438 mr r31,r3 2439 mfmsr r5 2440 ori r8,r5,MSR_FP 2441#ifdef CONFIG_ALTIVEC 2442BEGIN_FTR_SECTION 2443 oris r8,r8,MSR_VEC@h 2444END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) 2445#endif 2446#ifdef CONFIG_VSX 2447BEGIN_FTR_SECTION 2448 oris r8,r8,MSR_VSX@h 2449END_FTR_SECTION_IFSET(CPU_FTR_VSX) 2450#endif 2451 mtmsrd r8 2452 addi r3,r3,VCPU_FPRS 2453 bl store_fp_state 2454#ifdef CONFIG_ALTIVEC 2455BEGIN_FTR_SECTION 2456 addi r3,r31,VCPU_VRS 2457 bl store_vr_state 2458END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) 2459#endif 2460 mfspr r6,SPRN_VRSAVE 2461 stw r6,VCPU_VRSAVE(r31) 2462 mtlr r30 2463 blr 2464 2465/* 2466 * Load up FP, VMX and VSX registers 2467 * r4 = vcpu pointer 2468 * N.B. r30 and r31 are volatile across this function, 2469 * thus it is not callable from C. 2470 */ 2471kvmppc_load_fp: 2472 mflr r30 2473 mr r31,r4 2474 mfmsr r9 2475 ori r8,r9,MSR_FP 2476#ifdef CONFIG_ALTIVEC 2477BEGIN_FTR_SECTION 2478 oris r8,r8,MSR_VEC@h 2479END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) 2480#endif 2481#ifdef CONFIG_VSX 2482BEGIN_FTR_SECTION 2483 oris r8,r8,MSR_VSX@h 2484END_FTR_SECTION_IFSET(CPU_FTR_VSX) 2485#endif 2486 mtmsrd r8 2487 addi r3,r4,VCPU_FPRS 2488 bl load_fp_state 2489#ifdef CONFIG_ALTIVEC 2490BEGIN_FTR_SECTION 2491 addi r3,r31,VCPU_VRS 2492 bl load_vr_state 2493END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) 2494#endif 2495 lwz r7,VCPU_VRSAVE(r31) 2496 mtspr SPRN_VRSAVE,r7 2497 mtlr r30 2498 mr r4,r31 2499 blr 2500 2501/* 2502 * We come here if we get any exception or interrupt while we are 2503 * executing host real mode code while in guest MMU context. 2504 * For now just spin, but we should do something better. 2505 */ 2506kvmppc_bad_host_intr: 2507 b . 2508 2509/* 2510 * This mimics the MSR transition on IRQ delivery. The new guest MSR is taken 2511 * from VCPU_INTR_MSR and is modified based on the required TM state changes. 2512 * r11 has the guest MSR value (in/out) 2513 * r9 has a vcpu pointer (in) 2514 * r0 is used as a scratch register 2515 */ 2516kvmppc_msr_interrupt: 2517 rldicl r0, r11, 64 - MSR_TS_S_LG, 62 2518 cmpwi r0, 2 /* Check if we are in transactional state.. */ 2519 ld r11, VCPU_INTR_MSR(r9) 2520 bne 1f 2521 /* ... if transactional, change to suspended */ 2522 li r0, 1 25231: rldimi r11, r0, MSR_TS_S_LG, 63 - MSR_TS_T_LG 2524 blr 2525 2526/* 2527 * This works around a hardware bug on POWER8E processors, where 2528 * writing a 1 to the MMCR0[PMAO] bit doesn't generate a 2529 * performance monitor interrupt. Instead, when we need to have 2530 * an interrupt pending, we have to arrange for a counter to overflow. 2531 */ 2532kvmppc_fix_pmao: 2533 li r3, 0 2534 mtspr SPRN_MMCR2, r3 2535 lis r3, (MMCR0_PMXE | MMCR0_FCECE)@h 2536 ori r3, r3, MMCR0_PMCjCE | MMCR0_C56RUN 2537 mtspr SPRN_MMCR0, r3 2538 lis r3, 0x7fff 2539 ori r3, r3, 0xffff 2540 mtspr SPRN_PMC6, r3 2541 isync 2542 blr 2543 2544#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING 2545/* 2546 * Start timing an activity 2547 * r3 = pointer to time accumulation struct, r4 = vcpu 2548 */ 2549kvmhv_start_timing: 2550 ld r5, HSTATE_KVM_VCORE(r13) 2551 lbz r6, VCORE_IN_GUEST(r5) 2552 cmpwi r6, 0 2553 beq 5f /* if in guest, need to */ 2554 ld r6, VCORE_TB_OFFSET(r5) /* subtract timebase offset */ 25555: mftb r5 2556 subf r5, r6, r5 2557 std r3, VCPU_CUR_ACTIVITY(r4) 2558 std r5, VCPU_ACTIVITY_START(r4) 2559 blr 2560 2561/* 2562 * Accumulate time to one activity and start another. 2563 * r3 = pointer to new time accumulation struct, r4 = vcpu 2564 */ 2565kvmhv_accumulate_time: 2566 ld r5, HSTATE_KVM_VCORE(r13) 2567 lbz r8, VCORE_IN_GUEST(r5) 2568 cmpwi r8, 0 2569 beq 4f /* if in guest, need to */ 2570 ld r8, VCORE_TB_OFFSET(r5) /* subtract timebase offset */ 25714: ld r5, VCPU_CUR_ACTIVITY(r4) 2572 ld r6, VCPU_ACTIVITY_START(r4) 2573 std r3, VCPU_CUR_ACTIVITY(r4) 2574 mftb r7 2575 subf r7, r8, r7 2576 std r7, VCPU_ACTIVITY_START(r4) 2577 cmpdi r5, 0 2578 beqlr 2579 subf r3, r6, r7 2580 ld r8, TAS_SEQCOUNT(r5) 2581 cmpdi r8, 0 2582 addi r8, r8, 1 2583 std r8, TAS_SEQCOUNT(r5) 2584 lwsync 2585 ld r7, TAS_TOTAL(r5) 2586 add r7, r7, r3 2587 std r7, TAS_TOTAL(r5) 2588 ld r6, TAS_MIN(r5) 2589 ld r7, TAS_MAX(r5) 2590 beq 3f 2591 cmpd r3, r6 2592 bge 1f 25933: std r3, TAS_MIN(r5) 25941: cmpd r3, r7 2595 ble 2f 2596 std r3, TAS_MAX(r5) 25972: lwsync 2598 addi r8, r8, 1 2599 std r8, TAS_SEQCOUNT(r5) 2600 blr 2601#endif 2602