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