1
2
3
4
5
6
7
8
9
10
11
12
13#include <asm/ppc_asm.h>
14#include <asm/code-patching-asm.h>
15#include <asm/kvm_asm.h>
16#include <asm/reg.h>
17#include <asm/mmu.h>
18#include <asm/page.h>
19#include <asm/ptrace.h>
20#include <asm/hvcall.h>
21#include <asm/asm-offsets.h>
22#include <asm/exception-64s.h>
23#include <asm/kvm_book3s_asm.h>
24#include <asm/book3s/64/mmu-hash.h>
25#include <asm/export.h>
26#include <asm/tm.h>
27#include <asm/opal.h>
28#include <asm/thread_info.h>
29#include <asm/asm-compat.h>
30#include <asm/feature-fixups.h>
31#include <asm/cpuidle.h>
32
33
34#define NAPPING_CEDE 1
35#define NAPPING_NOVCPU 2
36#define NAPPING_UNSPLIT 3
37
38
39#define SFS 160
40#define STACK_SLOT_TRAP (SFS-4)
41#define STACK_SLOT_TID (SFS-16)
42#define STACK_SLOT_PSSCR (SFS-24)
43#define STACK_SLOT_PID (SFS-32)
44#define STACK_SLOT_IAMR (SFS-40)
45#define STACK_SLOT_CIABR (SFS-48)
46#define STACK_SLOT_DAWR0 (SFS-56)
47#define STACK_SLOT_DAWRX0 (SFS-64)
48#define STACK_SLOT_HFSCR (SFS-72)
49#define STACK_SLOT_AMR (SFS-80)
50#define STACK_SLOT_UAMOR (SFS-88)
51#define STACK_SLOT_FSCR (SFS-96)
52
53
54
55
56
57
58
59
60
61_GLOBAL_TOC(kvmppc_hv_entry_trampoline)
62 mflr r0
63 std r0, PPC_LR_STKOFF(r1)
64 stdu r1, -112(r1)
65 mfmsr r10
66 std r10, HSTATE_HOST_MSR(r13)
67 LOAD_REG_ADDR(r5, kvmppc_call_hv_entry)
68 li r0,MSR_RI
69 andc r0,r10,r0
70 li r6,MSR_IR | MSR_DR
71 andc r6,r10,r6
72 mtmsrd r0,1
73 mtsrr0 r5
74 mtsrr1 r6
75 RFI_TO_KERNEL
76
77kvmppc_call_hv_entry:
78 ld r4, HSTATE_KVM_VCPU(r13)
79 bl kvmppc_hv_entry
80
81
82
83BEGIN_FTR_SECTION
84
85 ld r5,HSTATE_DABR(r13)
86 li r6,7
87 mtspr SPRN_DABR,r5
88 mtspr SPRN_DABRX,r6
89END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
90
91
92 ld r3,PACA_SPRG_VDSO(r13)
93 mtspr SPRN_SPRG_VDSO_WRITE,r3
94
95
96 bl kvmhv_load_host_pmu
97
98
99
100
101
102 ld r3, HSTATE_DECEXP(r13)
103 mftb r4
104 subf r4, r4, r3
105 mtspr SPRN_DEC, r4
106
107
108 li r0, 0
109 stb r0, HSTATE_HWTHREAD_REQ(r13)
110
111
112
113
114
115
116
117
118
119
120 ld r8, 112+PPC_LR_STKOFF(r1)
121 addi r1, r1, 112
122 ld r7, HSTATE_HOST_MSR(r13)
123
124
125 mr r3, r12
126
127
128 mfmsr r6
129 li r0, MSR_RI
130 andc r6, r6, r0
131 mtmsrd r6, 1
132 mtsrr0 r8
133 mtsrr1 r7
134 RFI_TO_KERNEL
135
136kvmppc_primary_no_guest:
137
138
139
140
141 mfspr r3, SPRN_HDEC
142 mtspr SPRN_DEC, r3
143
144
145
146
147
148 ld r5, HSTATE_KVM_VCORE(r13)
14965: lbz r0, VCORE_IN_GUEST(r5)
150 cmpwi r0, 0
151 beq 65b
152
153 ld r8,VCORE_LPCR(r5)
154 mtspr SPRN_LPCR,r8
155 isync
156
157 ld r5, HSTATE_KVM_VCORE(r13)
158 lbz r7, HSTATE_PTID(r13)
159 li r0, 1
160 sld r0, r0, r7
161 addi r6, r5, VCORE_NAPPING_THREADS
1621: lwarx r3, 0, r6
163 or r3, r3, r0
164 stwcx. r3, 0, r6
165 bne 1b
166
167 isync
168 li r12, 0
169 lwz r7, VCORE_ENTRY_EXIT(r5)
170 cmpwi r7, 0x100
171 bge kvm_novcpu_exit
172 li r3, NAPPING_NOVCPU
173 stb r3, HSTATE_NAPPING(r13)
174
175 li r3, 0
176 b kvm_do_nap
177
178
179
180
181
182
183
184
185kvm_novcpu_wakeup:
186 ld r1, HSTATE_HOST_R1(r13)
187 ld r5, HSTATE_KVM_VCORE(r13)
188 li r0, 0
189 stb r0, HSTATE_NAPPING(r13)
190
191
192 bl kvmppc_check_wake_reason
193
194
195
196
197
198
199 ld r5, HSTATE_KVM_VCORE(r13)
200
201
202 lwz r0, VCORE_ENTRY_EXIT(r5)
203 cmpwi r0, 0x100
204 bge kvm_novcpu_exit
205
206
207 lbz r7, HSTATE_PTID(r13)
208 li r0, 1
209 sld r0, r0, r7
210 addi r6, r5, VCORE_NAPPING_THREADS
2114: lwarx r7, 0, r6
212 andc r7, r7, r0
213 stwcx. r7, 0, r6
214 bne 4b
215
216
217 cmpdi r3, 0
218 bge kvm_novcpu_exit
219
220
221 mfspr r0, SPRN_HDEC
222 extsw r0, r0
223 li r12, BOOK3S_INTERRUPT_HV_DECREMENTER
224 cmpdi r0, 0
225 blt kvm_novcpu_exit
226
227
228 ld r4, HSTATE_KVM_VCPU(r13)
229 cmpdi r4, 0
230 beq kvmppc_primary_no_guest
231
232#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING
233 addi r3, r4, VCPU_TB_RMENTRY
234 bl kvmhv_start_timing
235#endif
236 b kvmppc_got_guest
237
238kvm_novcpu_exit:
239#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING
240 ld r4, HSTATE_KVM_VCPU(r13)
241 cmpdi r4, 0
242 beq 13f
243 addi r3, r4, VCPU_TB_RMEXIT
244 bl kvmhv_accumulate_time
245#endif
24613: mr r3, r12
247 stw r12, STACK_SLOT_TRAP(r1)
248 bl kvmhv_commence_exit
249 nop
250 b kvmhv_switch_to_host
251
252
253
254
255
256
257_GLOBAL(idle_kvm_start_guest)
258 mfcr r5
259 mflr r0
260 std r5, 8(r1)
261 std r0, 16(r1)
262
263 ld r4, PACAEMERGSP(r13)
264 stdu r1, -SWITCH_FRAME_SIZE(r4)
265
266 mr r1, r4
267 std r3, 32(r1)
268 SAVE_NVGPRS(r1)
269
270
271
272
273
274 mtspr SPRN_SRR1,r3
275
276 li r0,0
277 stb r0,PACA_FTRACE_ENABLED(r13)
278
279 li r0,KVM_HWTHREAD_IN_KVM
280 stb r0,HSTATE_HWTHREAD_STATE(r13)
281
282
283 lbz r0,HSTATE_NAPPING(r13)
284 twnei r0,0
285
286 b 1f
287
288kvm_unsplit_wakeup:
289 li r0, 0
290 stb r0, HSTATE_NAPPING(r13)
291
2921:
293
294
295
296
297
298
299
300
301
302 bl kvmppc_check_wake_reason
303
304
305
306
307
308 cmpdi r3, 0
309 bge kvm_no_guest
310
311
312 ld r5,HSTATE_KVM_VCORE(r13)
313 cmpdi r5,0
314
315 beq kvm_no_guest
316
317kvm_secondary_got_guest:
318
319
320 li r0, 0
321 std r0, 32(r1)
322
323
324 ld r6, PACA_DSCR_DEFAULT(r13)
325 std r6, HSTATE_DSCR(r13)
326
327
328 lbz r4, HSTATE_PTID(r13)
329 cmpwi r4, 0
330 bne 63f
331 lis r6,0x7fff
332 mtspr SPRN_HDEC, r6
333
334 ld r6, HSTATE_SPLIT_MODE(r13)
335 cmpdi r6, 0
336 beq 63f
337 ld r0, KVM_SPLIT_RPR(r6)
338 mtspr SPRN_RPR, r0
339 ld r0, KVM_SPLIT_PMMAR(r6)
340 mtspr SPRN_PMMAR, r0
341 ld r0, KVM_SPLIT_LDBAR(r6)
342 mtspr SPRN_LDBAR, r0
343 isync
34463:
345
346 lwsync
347 ld r4, HSTATE_KVM_VCPU(r13)
348 bl kvmppc_hv_entry
349
350
351
352 li r0, 0
353 std r0, HSTATE_KVM_VCPU(r13)
354
355
356
357
358
359
360 lwsync
361 std r0, HSTATE_KVM_VCORE(r13)
362
363
364
365
366
367
368
369
370 cmpwi r12, BOOK3S_INTERRUPT_HMI
371 bne kvm_no_guest
372
373 li r3,0
374 bl hmi_exception_realmode
375
376
377
378
379
380
381kvm_no_guest:
382 lbz r3, HSTATE_HWTHREAD_REQ(r13)
383 cmpwi r3, 0
384 bne 53f
385 HMT_MEDIUM
386 li r0, KVM_HWTHREAD_IN_KERNEL
387 stb r0, HSTATE_HWTHREAD_STATE(r13)
388
389 sync
390 lbz r3, HSTATE_HWTHREAD_REQ(r13)
391 cmpwi r3, 0
392 bne 54f
393
394
395
396
397
398 li r3, LPCR_PECE0
399 mfspr r4, SPRN_LPCR
400 rlwimi r4, r3, 0, LPCR_PECE0 | LPCR_PECE1
401 mtspr SPRN_LPCR, r4
402
403 ld r3, 32(r1)
404 REST_NVGPRS(r1)
405 ld r1, 0(r1)
406 ld r0, 16(r1)
407 ld r5, 8(r1)
408 mtlr r0
409 mtcr r5
410 blr
411
41253:
413 HMT_LOW
414 ld r5, HSTATE_KVM_VCORE(r13)
415 cmpdi r5, 0
416 bne 60f
417 ld r3, HSTATE_SPLIT_MODE(r13)
418 cmpdi r3, 0
419 beq kvm_no_guest
420 lbz r0, KVM_SPLIT_DO_NAP(r3)
421 cmpwi r0, 0
422 beq kvm_no_guest
423 HMT_MEDIUM
424 b kvm_unsplit_nap
42560: HMT_MEDIUM
426 b kvm_secondary_got_guest
427
42854: li r0, KVM_HWTHREAD_IN_KVM
429 stb r0, HSTATE_HWTHREAD_STATE(r13)
430 b kvm_no_guest
431
432
433
434
435
436kvm_unsplit_nap:
437
438
439
440
441
442
443
444
445
446
447
448 cmpwi r12, BOOK3S_INTERRUPT_HMI
449 bne 55f
450 li r3, 0
451 bl hmi_exception_realmode
45255:
453
454
455
456
457 sync
458 ld r0, HSTATE_KVM_VCORE(r13)
459 cmpdi r0, 0
460 bne kvm_no_guest
461
462BEGIN_FTR_SECTION
463 lis r6, (PPC_DBELL_SERVER << (63-36))@h
464 PPC_MSGCLR(6)
465END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
466
467 ld r3, HSTATE_SPLIT_MODE(r13)
468 li r0, 1
469 lhz r4, PACAPACAINDEX(r13)
470 clrldi r4, r4, 61
471 addi r4, r4, KVM_SPLIT_NAPPED
472 stbx r0, r3, r4
473
474 sync
475 lbz r0, KVM_SPLIT_DO_NAP(r3)
476 cmpwi r0, 0
477 beq 57f
478 li r3, NAPPING_UNSPLIT
479 stb r3, HSTATE_NAPPING(r13)
480 li r3, (LPCR_PECEDH | LPCR_PECE0) >> 4
481 mfspr r5, SPRN_LPCR
482 rlwimi r5, r3, 4, (LPCR_PECEDP | LPCR_PECEDH | LPCR_PECE0 | LPCR_PECE1)
483 b kvm_nap_sequence
484
48557: li r0, 0
486 stbx r0, r3, r4
487 b kvm_no_guest
488
489
490
491
492
493
494
495.global kvmppc_hv_entry
496kvmppc_hv_entry:
497
498
499
500
501
502
503
504
505
506
507
508 mflr r0
509 std r0, PPC_LR_STKOFF(r1)
510 stdu r1, -SFS(r1)
511
512
513 std r1, HSTATE_HOST_R1(r13)
514
515 li r6, KVM_GUEST_MODE_HOST_HV
516 stb r6, HSTATE_IN_GUEST(r13)
517
518#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING
519
520 cmpdi r4, 0
521 beq 1f
522 addi r3, r4, VCPU_TB_RMENTRY
523 bl kvmhv_start_timing
5241:
525#endif
526
527 ld r5, HSTATE_KVM_VCORE(r13)
528 ld r9, VCORE_KVM(r5)
529
530
531
532
533
534
535
536 li r7, 1
537 lbz r6, HSTATE_PTID(r13)
538 sld r7, r7, r6
539 addi r8, r5, VCORE_ENTRY_EXIT
54021: lwarx r3, 0, r8
541 cmpwi r3, 0x100
542 bge secondary_too_late
543 or r3, r3, r7
544 stwcx. r3, 0, r8
545 bne 21b
546
547
548 cmpwi r6,0
549 bne 10f
550
551 lwz r7,KVM_LPID(r9)
552 ld r6,KVM_SDR1(r9)
553 li r0,LPID_RSVD
554 mtspr SPRN_LPID,r0
555 ptesync
556 mtspr SPRN_SDR1,r6
557 mtspr SPRN_LPID,r7
558 isync
559
560
561 mr r3, r9
562 lhz r4, PACAPACAINDEX(r13)
563 li r5, 0
564 bl kvmppc_check_need_tlb_flush
565 nop
566 ld r5, HSTATE_KVM_VCORE(r13)
567
568
56922: ld r8,VCORE_TB_OFFSET(r5)
570 cmpdi r8,0
571 beq 37f
572 std r8, VCORE_TB_OFFSET_APPL(r5)
573 mftb r6
574 add r8,r8,r6
575 mtspr SPRN_TBU40,r8
576 mftb r7
577 clrldi r6,r6,40
578 clrldi r7,r7,40
579 cmpld r7,r6
580 bge 37f
581 addis r8,r8,0x100
582 mtspr SPRN_TBU40,r8
583
584
58537: ld r7, VCORE_PCR(r5)
586 LOAD_REG_IMMEDIATE(r6, PCR_MASK)
587 cmpld r7, r6
588 beq 38f
589 or r7, r7, r6
590 mtspr SPRN_PCR, r7
59138:
592
593BEGIN_FTR_SECTION
594
595 ld r8, VCORE_DPDES(r5)
596 ld r7, VCORE_VTB(r5)
597 mtspr SPRN_DPDES, r8
598 mtspr SPRN_VTB, r7
599END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
600
601
602 bl kvmppc_subcore_enter_guest
603 nop
604 ld r5, HSTATE_KVM_VCORE(r13)
605 ld r4, HSTATE_KVM_VCPU(r13)
606 li r0,1
607 stb r0,VCORE_IN_GUEST(r5)
608
609
61010: cmpdi r4, 0
611 beq kvmppc_primary_no_guest
612kvmppc_got_guest:
613
614 ld r3, VCPU_VPA(r4)
615 cmpdi r3, 0
616 beq 25f
617 li r6, LPPACA_YIELDCOUNT
618 LWZX_BE r5, r3, r6
619 addi r5, r5, 1
620 STWX_BE r5, r3, r6
621 li r6, 1
622 stb r6, VCPU_VPA_DIRTY(r4)
62325:
624
625
626 mfspr r5,SPRN_PURR
627 mfspr r6,SPRN_SPURR
628 std r5,HSTATE_PURR(r13)
629 std r6,HSTATE_SPURR(r13)
630 ld r7,VCPU_PURR(r4)
631 ld r8,VCPU_SPURR(r4)
632 mtspr SPRN_PURR,r7
633 mtspr SPRN_SPURR,r8
634
635
636BEGIN_FTR_SECTION
637 mfspr r5, SPRN_CIABR
638 mfspr r6, SPRN_DAWR0
639 mfspr r7, SPRN_DAWRX0
640 mfspr r8, SPRN_IAMR
641 std r5, STACK_SLOT_CIABR(r1)
642 std r6, STACK_SLOT_DAWR0(r1)
643 std r7, STACK_SLOT_DAWRX0(r1)
644 std r8, STACK_SLOT_IAMR(r1)
645 mfspr r5, SPRN_FSCR
646 std r5, STACK_SLOT_FSCR(r1)
647END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
648
649 mfspr r5, SPRN_AMR
650 std r5, STACK_SLOT_AMR(r1)
651 mfspr r6, SPRN_UAMOR
652 std r6, STACK_SLOT_UAMOR(r1)
653
654BEGIN_FTR_SECTION
655
656
657 lwz r5,VCPU_DABRX(r4)
658 ld r6,VCPU_DABR(r4)
659 mtspr SPRN_DABRX,r5
660 mtspr SPRN_DABR,r6
661 isync
662END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
663
664#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
665BEGIN_FTR_SECTION
666 b 91f
667END_FTR_SECTION_IFCLR(CPU_FTR_TM)
668
669
670
671 mr r3, r4
672 ld r4, VCPU_MSR(r3)
673 li r5, 0
674 bl kvmppc_restore_tm_hv
675 nop
676 ld r4, HSTATE_KVM_VCPU(r13)
67791:
678#endif
679
680
681 mr r3, r4
682 bl kvmhv_load_guest_pmu
683
684
685 ld r4, HSTATE_KVM_VCPU(r13)
686 bl kvmppc_load_fp
687
688 ld r14, VCPU_GPR(R14)(r4)
689 ld r15, VCPU_GPR(R15)(r4)
690 ld r16, VCPU_GPR(R16)(r4)
691 ld r17, VCPU_GPR(R17)(r4)
692 ld r18, VCPU_GPR(R18)(r4)
693 ld r19, VCPU_GPR(R19)(r4)
694 ld r20, VCPU_GPR(R20)(r4)
695 ld r21, VCPU_GPR(R21)(r4)
696 ld r22, VCPU_GPR(R22)(r4)
697 ld r23, VCPU_GPR(R23)(r4)
698 ld r24, VCPU_GPR(R24)(r4)
699 ld r25, VCPU_GPR(R25)(r4)
700 ld r26, VCPU_GPR(R26)(r4)
701 ld r27, VCPU_GPR(R27)(r4)
702 ld r28, VCPU_GPR(R28)(r4)
703 ld r29, VCPU_GPR(R29)(r4)
704 ld r30, VCPU_GPR(R30)(r4)
705 ld r31, VCPU_GPR(R31)(r4)
706
707
708 ld r5, VCPU_DSCR(r4)
709 mtspr SPRN_DSCR, r5
710
711BEGIN_FTR_SECTION
712
713 b 8f
714END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
715
716 ld r5, VCPU_IAMR(r4)
717 lwz r6, VCPU_PSPB(r4)
718 ld r7, VCPU_FSCR(r4)
719 mtspr SPRN_IAMR, r5
720 mtspr SPRN_PSPB, r6
721 mtspr SPRN_FSCR, r7
722
723
724
725
726 LOAD_REG_ADDR(r5, dawr_force_enable)
727 lbz r5, 0(r5)
728 cmpdi r5, 0
729 beq 1f
730 ld r5, VCPU_DAWR0(r4)
731 ld r6, VCPU_DAWRX0(r4)
732 mtspr SPRN_DAWR0, r5
733 mtspr SPRN_DAWRX0, r6
7341:
735 ld r7, VCPU_CIABR(r4)
736 ld r8, VCPU_TAR(r4)
737 mtspr SPRN_CIABR, r7
738 mtspr SPRN_TAR, r8
739 ld r5, VCPU_IC(r4)
740 ld r8, VCPU_EBBHR(r4)
741 mtspr SPRN_IC, r5
742 mtspr SPRN_EBBHR, r8
743 ld r5, VCPU_EBBRR(r4)
744 ld r6, VCPU_BESCR(r4)
745 lwz r7, VCPU_GUEST_PID(r4)
746 ld r8, VCPU_WORT(r4)
747 mtspr SPRN_EBBRR, r5
748 mtspr SPRN_BESCR, r6
749 mtspr SPRN_PID, r7
750 mtspr SPRN_WORT, r8
751
752 ld r5, VCPU_TCSCR(r4)
753 ld r6, VCPU_ACOP(r4)
754 ld r7, VCPU_CSIGR(r4)
755 ld r8, VCPU_TACR(r4)
756 mtspr SPRN_TCSCR, r5
757 mtspr SPRN_ACOP, r6
758 mtspr SPRN_CSIGR, r7
759 mtspr SPRN_TACR, r8
760 nop
7618:
762
763 ld r5, VCPU_SPRG0(r4)
764 ld r6, VCPU_SPRG1(r4)
765 ld r7, VCPU_SPRG2(r4)
766 ld r8, VCPU_SPRG3(r4)
767 mtspr SPRN_SPRG0, r5
768 mtspr SPRN_SPRG1, r6
769 mtspr SPRN_SPRG2, r7
770 mtspr SPRN_SPRG3, r8
771
772
773 ld r5, VCPU_DAR(r4)
774 lwz r6, VCPU_DSISR(r4)
775 mtspr SPRN_DAR, r5
776 mtspr SPRN_DSISR, r6
777
778
779 ld r5,VCPU_AMR(r4)
780 ld r6,VCPU_UAMOR(r4)
781 li r7,-1
782 mtspr SPRN_AMR,r5
783 mtspr SPRN_UAMOR,r6
784 mtspr SPRN_AMOR,r7
785
786
787 lwz r5,VCPU_CTRL(r4)
788 andi. r5,r5,1
789 bne 4f
790 mfspr r6,SPRN_CTRLF
791 clrrdi r6,r6,1
792 mtspr SPRN_CTRLT,r6
7934:
794
795 ld r5, HSTATE_KVM_VCORE(r13)
796 lbz r6, HSTATE_PTID(r13)
797 cmpwi r6, 0
798 beq 21f
799 lbz r0, VCORE_IN_GUEST(r5)
800 cmpwi r0, 0
801 bne 21f
802 HMT_LOW
80320: lwz r3, VCORE_ENTRY_EXIT(r5)
804 cmpwi r3, 0x100
805 bge no_switch_exit
806 lbz r0, VCORE_IN_GUEST(r5)
807 cmpwi r0, 0
808 beq 20b
809 HMT_MEDIUM
81021:
811
812 ld r8,VCORE_LPCR(r5)
813 mtspr SPRN_LPCR,r8
814 isync
815
816
817
818
819 ld r8,VCPU_DEC_EXPIRES(r4)
820
821 ld r5,HSTATE_KVM_VCORE(r13)
822 ld r6,VCORE_TB_OFFSET_APPL(r5)
823 add r8,r8,r6
824 mftb r7
825 subf r3,r7,r8
826 mtspr SPRN_DEC,r3
827
828
829 mfspr r3, SPRN_HDEC
830 extsw r3, r3
831 cmpdi r3, 512
832 blt hdec_soon
833
834
835 li r6, 0
836 slbmte r6, r6
837 PPC_SLBIA(6)
838 ptesync
839
840
841 lwz r5,VCPU_SLB_MAX(r4)
842 cmpwi r5,0
843 beq 9f
844 mtctr r5
845 addi r6,r4,VCPU_SLB
8461: ld r8,VCPU_SLB_E(r6)
847 ld r9,VCPU_SLB_V(r6)
848 slbmte r9,r8
849 addi r6,r6,VCPU_SLB_SIZE
850 bdnz 1b
8519:
852
853deliver_guest_interrupt:
854
855 ld r0, VCPU_PENDING_EXC(r4)
856 cmpdi r0, 0
857 beq 71f
858 mr r3, r4
859 bl kvmppc_guest_entry_inject_int
860 ld r4, HSTATE_KVM_VCPU(r13)
86171:
862 ld r6, VCPU_SRR0(r4)
863 ld r7, VCPU_SRR1(r4)
864 mtspr SPRN_SRR0, r6
865 mtspr SPRN_SRR1, r7
866
867 ld r10, VCPU_PC(r4)
868 ld r11, VCPU_MSR(r4)
869
870 rldicl r11, r11, 63 - MSR_HV_LG, 1
871 rotldi r11, r11, 1 + MSR_HV_LG
872 ori r11, r11, MSR_ME
873
874 ld r6, VCPU_CTR(r4)
875 ld r7, VCPU_XER(r4)
876 mtctr r6
877 mtxer r7
878
879
880
881
882
883
884
885
886fast_guest_return:
887 li r0,0
888 stb r0,VCPU_CEDED(r4)
889 mtspr SPRN_HSRR0,r10
890 mtspr SPRN_HSRR1,r11
891
892
893 li r9, KVM_GUEST_MODE_GUEST_HV
894 stb r9, HSTATE_IN_GUEST(r13)
895
896#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING
897
898 addi r3, r4, VCPU_TB_GUEST
899 bl kvmhv_accumulate_time
900#endif
901
902
903
904BEGIN_FTR_SECTION
905 ld r5, VCPU_CFAR(r4)
906 mtspr SPRN_CFAR, r5
907END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
908BEGIN_FTR_SECTION
909 ld r0, VCPU_PPR(r4)
910END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
911
912 ld r5, VCPU_LR(r4)
913 mtlr r5
914
915 ld r1, VCPU_GPR(R1)(r4)
916 ld r5, VCPU_GPR(R5)(r4)
917 ld r8, VCPU_GPR(R8)(r4)
918 ld r9, VCPU_GPR(R9)(r4)
919 ld r10, VCPU_GPR(R10)(r4)
920 ld r11, VCPU_GPR(R11)(r4)
921 ld r12, VCPU_GPR(R12)(r4)
922 ld r13, VCPU_GPR(R13)(r4)
923
924BEGIN_FTR_SECTION
925 mtspr SPRN_PPR, r0
926END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
927
928 ld r6, VCPU_GPR(R6)(r4)
929 ld r7, VCPU_GPR(R7)(r4)
930
931 ld r0, VCPU_CR(r4)
932 mtcr r0
933
934 ld r0, VCPU_GPR(R0)(r4)
935 ld r2, VCPU_GPR(R2)(r4)
936 ld r3, VCPU_GPR(R3)(r4)
937 ld r4, VCPU_GPR(R4)(r4)
938 HRFI_TO_GUEST
939 b .
940
941secondary_too_late:
942 li r12, 0
943 stw r12, STACK_SLOT_TRAP(r1)
944 cmpdi r4, 0
945 beq 11f
946 stw r12, VCPU_TRAP(r4)
947#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING
948 addi r3, r4, VCPU_TB_RMEXIT
949 bl kvmhv_accumulate_time
950#endif
95111: b kvmhv_switch_to_host
952
953no_switch_exit:
954 HMT_MEDIUM
955 li r12, 0
956 b 12f
957hdec_soon:
958 li r12, BOOK3S_INTERRUPT_HV_DECREMENTER
95912: stw r12, VCPU_TRAP(r4)
960 mr r9, r4
961#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING
962 addi r3, r4, VCPU_TB_RMEXIT
963 bl kvmhv_accumulate_time
964#endif
965 b guest_bypass
966
967
968
969
970
971
972
973
974
975
976 .globl kvmppc_interrupt_hv
977kvmppc_interrupt_hv:
978
979
980
981
982
983
984
985
986
987
988 cmpwi r9,KVM_GUEST_MODE_HOST_HV
989 beq kvmppc_bad_host_intr
990 li r9, KVM_GUEST_MODE_HOST_HV
991 stb r9, HSTATE_IN_GUEST(r13)
992
993 ld r9, HSTATE_KVM_VCPU(r13)
994
995
996
997 std r0, VCPU_GPR(R0)(r9)
998 std r1, VCPU_GPR(R1)(r9)
999 std r2, VCPU_GPR(R2)(r9)
1000 std r3, VCPU_GPR(R3)(r9)
1001 std r4, VCPU_GPR(R4)(r9)
1002 std r5, VCPU_GPR(R5)(r9)
1003 std r6, VCPU_GPR(R6)(r9)
1004 std r7, VCPU_GPR(R7)(r9)
1005 std r8, VCPU_GPR(R8)(r9)
1006 ld r0, HSTATE_SCRATCH2(r13)
1007 std r0, VCPU_GPR(R9)(r9)
1008 std r10, VCPU_GPR(R10)(r9)
1009 std r11, VCPU_GPR(R11)(r9)
1010 ld r3, HSTATE_SCRATCH0(r13)
1011 std r3, VCPU_GPR(R12)(r9)
1012
1013 srdi r4, r12, 32
1014 std r4, VCPU_CR(r9)
1015BEGIN_FTR_SECTION
1016 ld r3, HSTATE_CFAR(r13)
1017 std r3, VCPU_CFAR(r9)
1018END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
1019BEGIN_FTR_SECTION
1020 ld r4, HSTATE_PPR(r13)
1021 std r4, VCPU_PPR(r9)
1022END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
1023
1024
1025 ld r1, HSTATE_HOST_R1(r13)
1026 ld r2, PACATOC(r13)
1027
1028 mfspr r10, SPRN_SRR0
1029 mfspr r11, SPRN_SRR1
1030 std r10, VCPU_SRR0(r9)
1031 std r11, VCPU_SRR1(r9)
1032
1033 clrldi r12, r12, 32
1034 andi. r0, r12, 2
1035 beq 1f
1036 mfspr r10, SPRN_HSRR0
1037 mfspr r11, SPRN_HSRR1
1038 clrrdi r12, r12, 2
10391: std r10, VCPU_PC(r9)
1040 std r11, VCPU_MSR(r9)
1041
1042 GET_SCRATCH0(r3)
1043 mflr r4
1044 std r3, VCPU_GPR(R13)(r9)
1045 std r4, VCPU_LR(r9)
1046
1047 stw r12,VCPU_TRAP(r9)
1048
1049
1050
1051
1052
1053
1054
1055 li r0, MSR_RI
1056 mtmsrd r0, 1
1057
1058#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING
1059 addi r3, r9, VCPU_TB_RMINTR
1060 mr r4, r9
1061 bl kvmhv_accumulate_time
1062 ld r5, VCPU_GPR(R5)(r9)
1063 ld r6, VCPU_GPR(R6)(r9)
1064 ld r7, VCPU_GPR(R7)(r9)
1065 ld r8, VCPU_GPR(R8)(r9)
1066#endif
1067
1068
1069
1070 li r3,KVM_INST_FETCH_FAILED
1071 stw r3,VCPU_LAST_INST(r9)
1072 cmpwi r12,BOOK3S_INTERRUPT_H_EMUL_ASSIST
1073 bne 11f
1074 mfspr r3,SPRN_HEIR
107511: stw r3,VCPU_HEIR(r9)
1076
1077
1078 mfctr r3
1079 mfxer r4
1080 std r3, VCPU_CTR(r9)
1081 std r4, VCPU_XER(r9)
1082
1083
1084 mfdar r3
1085 mfdsisr r4
1086 std r3, VCPU_DAR(r9)
1087 stw r4, VCPU_DSISR(r9)
1088
1089
1090 cmpwi r12, BOOK3S_INTERRUPT_H_DATA_STORAGE
1091 beq kvmppc_hdsi
1092 std r3, VCPU_FAULT_DAR(r9)
1093 stw r4, VCPU_FAULT_DSISR(r9)
1094 cmpwi r12, BOOK3S_INTERRUPT_H_INST_STORAGE
1095 beq kvmppc_hisi
1096
1097
1098 cmpwi r12,BOOK3S_INTERRUPT_HV_DECREMENTER
1099 bne 2f
1100 mfspr r3,SPRN_HDEC
1101 extsw r3, r3
1102 cmpdi r3,0
1103 mr r4,r9
1104 bge fast_guest_return
11052:
1106
1107 cmpwi r12,BOOK3S_INTERRUPT_SYSCALL
1108 beq hcall_try_real_mode
1109
1110
1111 cmpwi r12, BOOK3S_INTERRUPT_H_DOORBELL
1112 bne 3f
1113 lbz r0, HSTATE_HOST_IPI(r13)
1114 cmpwi r0, 0
1115 beq maybe_reenter_guest
1116 b guest_exit_cont
11173:
1118
1119 cmpwi r12, BOOK3S_INTERRUPT_H_FAC_UNAVAIL
1120 bne 14f
1121 mfspr r3, SPRN_HFSCR
1122 std r3, VCPU_HFSCR(r9)
1123 b guest_exit_cont
112414:
1125
1126 cmpwi r12, BOOK3S_INTERRUPT_EXTERNAL
1127 beq kvmppc_guest_external
1128
1129 cmpwi r12, BOOK3S_INTERRUPT_MACHINE_CHECK
1130 beq machine_check_realmode
1131
1132 cmpwi r12, BOOK3S_INTERRUPT_HMI
1133 beq hmi_realmode
1134
1135guest_exit_cont:
1136
1137#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING
1138 addi r3, r9, VCPU_TB_RMEXIT
1139 mr r4, r9
1140 bl kvmhv_accumulate_time
1141#endif
1142
1143
1144
1145
1146
11471: nop
1148 patch_site 1b patch__call_kvm_flush_link_stack
1149
1150
1151 li r5, 0
1152 lwz r0,VCPU_SLB_NR(r9)
1153 mtctr r0
1154 li r6,0
1155 addi r7,r9,VCPU_SLB
11561: slbmfee r8,r6
1157 andis. r0,r8,SLB_ESID_V@h
1158 beq 2f
1159 add r8,r8,r6
1160 slbmfev r3,r6
1161 std r8,VCPU_SLB_E(r7)
1162 std r3,VCPU_SLB_V(r7)
1163 addi r7,r7,VCPU_SLB_SIZE
1164 addi r5,r5,1
11652: addi r6,r6,1
1166 bdnz 1b
1167
1168 li r0,0
1169 slbmte r0,r0
1170 PPC_SLBIA(6)
1171 ptesync
1172 stw r5,VCPU_SLB_MAX(r9)
1173
1174
1175 ld r8,PACA_SLBSHADOWPTR(r13)
1176
1177 .rept SLB_NUM_BOLTED
1178 li r3, SLBSHADOW_SAVEAREA
1179 LDX_BE r5, r8, r3
1180 addi r3, r3, 8
1181 LDX_BE r6, r8, r3
1182 andis. r7,r5,SLB_ESID_V@h
1183 beq 1f
1184 slbmte r6,r5
11851: addi r8,r8,16
1186 .endr
1187
1188guest_bypass:
1189 stw r12, STACK_SLOT_TRAP(r1)
1190
1191
1192
1193 ld r3, HSTATE_KVM_VCORE(r13)
1194 mfspr r5,SPRN_DEC
1195 mftb r6
1196 extsw r5,r5
119716: add r5,r5,r6
1198
1199 ld r4,VCORE_TB_OFFSET_APPL(r3)
1200 subf r5,r4,r5
1201 std r5,VCPU_DEC_EXPIRES(r9)
1202
1203
1204 mr r3, r12
1205 bl kvmhv_commence_exit
1206 nop
1207 ld r9, HSTATE_KVM_VCPU(r13)
1208
1209
1210 li r0, -1
1211 stw r0, VCPU_CPU(r9)
1212 stw r0, VCPU_THREAD_CPU(r9)
1213
1214
1215 mfspr r6,SPRN_CTRLF
1216 stw r6,VCPU_CTRL(r9)
1217 andi. r0,r6,1
1218 bne 4f
1219 ori r6,r6,1
1220 mtspr SPRN_CTRLT,r6
12214:
1222
1223
1224
1225 mfspr r5,SPRN_PURR
1226 mfspr r6,SPRN_SPURR
1227 ld r7,VCPU_PURR(r9)
1228 ld r8,VCPU_SPURR(r9)
1229 std r5,VCPU_PURR(r9)
1230 std r6,VCPU_SPURR(r9)
1231 subf r5,r7,r5
1232 subf r6,r8,r6
1233
1234
1235
1236
1237
1238 ld r3,HSTATE_PURR(r13)
1239 ld r4,HSTATE_SPURR(r13)
1240 add r3,r3,r5
1241 add r4,r4,r6
1242 mtspr SPRN_PURR,r3
1243 mtspr SPRN_SPURR,r4
1244
1245BEGIN_FTR_SECTION
1246 b 8f
1247END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
1248
1249 mfspr r5, SPRN_IAMR
1250 mfspr r6, SPRN_PSPB
1251 mfspr r7, SPRN_FSCR
1252 std r5, VCPU_IAMR(r9)
1253 stw r6, VCPU_PSPB(r9)
1254 std r7, VCPU_FSCR(r9)
1255 mfspr r5, SPRN_IC
1256 mfspr r7, SPRN_TAR
1257 std r5, VCPU_IC(r9)
1258 std r7, VCPU_TAR(r9)
1259 mfspr r8, SPRN_EBBHR
1260 std r8, VCPU_EBBHR(r9)
1261 mfspr r5, SPRN_EBBRR
1262 mfspr r6, SPRN_BESCR
1263 mfspr r7, SPRN_PID
1264 mfspr r8, SPRN_WORT
1265 std r5, VCPU_EBBRR(r9)
1266 std r6, VCPU_BESCR(r9)
1267 stw r7, VCPU_GUEST_PID(r9)
1268 std r8, VCPU_WORT(r9)
1269 mfspr r5, SPRN_TCSCR
1270 mfspr r6, SPRN_ACOP
1271 mfspr r7, SPRN_CSIGR
1272 mfspr r8, SPRN_TACR
1273 std r5, VCPU_TCSCR(r9)
1274 std r6, VCPU_ACOP(r9)
1275 std r7, VCPU_CSIGR(r9)
1276 std r8, VCPU_TACR(r9)
1277BEGIN_FTR_SECTION
1278 ld r5, STACK_SLOT_FSCR(r1)
1279 mtspr SPRN_FSCR, r5
1280END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
1281
1282
1283
1284
1285 li r0, 0
1286 mtspr SPRN_PSPB, r0
1287 mtspr SPRN_WORT, r0
1288 mtspr SPRN_TCSCR, r0
1289
1290 li r0, 1
1291 sldi r0, r0, 31
1292 mtspr SPRN_MMCRS, r0
1293
1294
1295 ld r8, STACK_SLOT_IAMR(r1)
1296 mtspr SPRN_IAMR, r8
1297
12988:
1299 mfspr r5,SPRN_AMR
1300 mfspr r6,SPRN_UAMOR
1301 std r5,VCPU_AMR(r9)
1302 std r6,VCPU_UAMOR(r9)
1303 ld r5,STACK_SLOT_AMR(r1)
1304 ld r6,STACK_SLOT_UAMOR(r1)
1305 mtspr SPRN_AMR, r5
1306 mtspr SPRN_UAMOR, r6
1307
1308
1309 mfspr r8, SPRN_DSCR
1310 ld r7, HSTATE_DSCR(r13)
1311 std r8, VCPU_DSCR(r9)
1312 mtspr SPRN_DSCR, r7
1313
1314
1315 std r14, VCPU_GPR(R14)(r9)
1316 std r15, VCPU_GPR(R15)(r9)
1317 std r16, VCPU_GPR(R16)(r9)
1318 std r17, VCPU_GPR(R17)(r9)
1319 std r18, VCPU_GPR(R18)(r9)
1320 std r19, VCPU_GPR(R19)(r9)
1321 std r20, VCPU_GPR(R20)(r9)
1322 std r21, VCPU_GPR(R21)(r9)
1323 std r22, VCPU_GPR(R22)(r9)
1324 std r23, VCPU_GPR(R23)(r9)
1325 std r24, VCPU_GPR(R24)(r9)
1326 std r25, VCPU_GPR(R25)(r9)
1327 std r26, VCPU_GPR(R26)(r9)
1328 std r27, VCPU_GPR(R27)(r9)
1329 std r28, VCPU_GPR(R28)(r9)
1330 std r29, VCPU_GPR(R29)(r9)
1331 std r30, VCPU_GPR(R30)(r9)
1332 std r31, VCPU_GPR(R31)(r9)
1333
1334
1335 mfspr r3, SPRN_SPRG0
1336 mfspr r4, SPRN_SPRG1
1337 mfspr r5, SPRN_SPRG2
1338 mfspr r6, SPRN_SPRG3
1339 std r3, VCPU_SPRG0(r9)
1340 std r4, VCPU_SPRG1(r9)
1341 std r5, VCPU_SPRG2(r9)
1342 std r6, VCPU_SPRG3(r9)
1343
1344
1345 mr r3, r9
1346 bl kvmppc_save_fp
1347
1348#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1349BEGIN_FTR_SECTION
1350 b 91f
1351END_FTR_SECTION_IFCLR(CPU_FTR_TM)
1352
1353
1354
1355 mr r3, r9
1356 ld r4, VCPU_MSR(r3)
1357 li r5, 0
1358 bl kvmppc_save_tm_hv
1359 nop
1360 ld r9, HSTATE_KVM_VCPU(r13)
136191:
1362#endif
1363
1364
1365 ld r8, VCPU_VPA(r9)
1366 cmpdi r8, 0
1367 beq 25f
1368 li r4, LPPACA_YIELDCOUNT
1369 LWZX_BE r3, r8, r4
1370 addi r3, r3, 1
1371 STWX_BE r3, r8, r4
1372 li r3, 1
1373 stb r3, VCPU_VPA_DIRTY(r9)
137425:
1375
1376
1377 mr r3, r9
1378 li r4, 1
1379 beq 21f
1380 lbz r4, LPPACA_PMCINUSE(r8)
138121: bl kvmhv_save_guest_pmu
1382 ld r9, HSTATE_KVM_VCPU(r13)
1383
1384
1385BEGIN_FTR_SECTION
1386 ld r5, STACK_SLOT_CIABR(r1)
1387 ld r6, STACK_SLOT_DAWR0(r1)
1388 ld r7, STACK_SLOT_DAWRX0(r1)
1389 mtspr SPRN_CIABR, r5
1390
1391
1392
1393
1394 mtspr SPRN_DAWR0, r6
1395 mtspr SPRN_DAWRX0, r7
1396END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
1397
1398
1399
1400
1401
1402
1403
1404kvmhv_switch_to_host:
1405
1406 ld r5,HSTATE_KVM_VCORE(r13)
1407 ld r4,VCORE_KVM(r5)
1408 lbz r3,HSTATE_PTID(r13)
1409 cmpwi r3,0
1410 beq 15f
1411 HMT_LOW
141213: lbz r3,VCORE_IN_GUEST(r5)
1413 cmpwi r3,0
1414 bne 13b
1415 HMT_MEDIUM
1416 b 16f
1417
1418
141915: lwz r3,VCORE_ENTRY_EXIT(r5)
1420 rlwinm r0,r3,32-8,0xff
1421 clrldi r3,r3,56
1422 cmpw r3,r0
1423 bne 15b
1424 isync
1425
1426
1427 lbz r6, VCORE_IN_GUEST(r5)
1428 cmpwi r6, 0
1429 beq 19f
1430
1431
1432 lwz r7,KVM_HOST_LPID(r4)
1433 ld r6,KVM_HOST_SDR1(r4)
1434 li r8,LPID_RSVD
1435 mtspr SPRN_LPID,r8
1436 ptesync
1437 mtspr SPRN_SDR1,r6
1438 mtspr SPRN_LPID,r7
1439 isync
1440
1441BEGIN_FTR_SECTION
1442
1443 mfspr r7, SPRN_DPDES
1444 mfspr r8, SPRN_VTB
1445 std r7, VCORE_DPDES(r5)
1446 std r8, VCORE_VTB(r5)
1447
1448 li r8, 0
1449 mtspr SPRN_DPDES, r8
1450END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
1451
1452
1453 ld r8, VCORE_TB_OFFSET_APPL(r5)
1454 cmpdi r8,0
1455 beq 17f
1456 li r0, 0
1457 std r0, VCORE_TB_OFFSET_APPL(r5)
1458 mftb r6
1459 subf r8,r8,r6
1460 mtspr SPRN_TBU40,r8
1461 mftb r7
1462 clrldi r6,r6,40
1463 clrldi r7,r7,40
1464 cmpld r7,r6
1465 bge 17f
1466 addis r8,r8,0x100
1467 mtspr SPRN_TBU40,r8
1468
146917:
1470
1471
1472
1473
1474
1475
1476
1477
1478 bl kvmppc_subcore_exit_guest
1479 nop
148030: ld r5,HSTATE_KVM_VCORE(r13)
1481 ld r4,VCORE_KVM(r5)
1482
1483
1484 ld r0, VCORE_PCR(r5)
1485 LOAD_REG_IMMEDIATE(r6, PCR_MASK)
1486 cmpld r0, r6
1487 beq 18f
1488 mtspr SPRN_PCR, r6
148918:
1490
1491 li r0, 0
1492 stb r0,VCORE_IN_GUEST(r5)
149319: lis r8,0x7fff
1494 mtspr SPRN_HDEC,r8
1495
149616: ld r8,KVM_HOST_LPCR(r4)
1497 mtspr SPRN_LPCR,r8
1498 isync
1499
1500#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING
1501
1502 ld r4, HSTATE_KVM_VCPU(r13)
1503 cmpdi r4, 0
1504 li r3, 0
1505 beq 2f
1506 bl kvmhv_accumulate_time
15072:
1508#endif
1509
1510 li r0, KVM_GUEST_MODE_NONE
1511 stb r0, HSTATE_IN_GUEST(r13)
1512
1513 lwz r12, STACK_SLOT_TRAP(r1)
1514 ld r0, SFS+PPC_LR_STKOFF(r1)
1515 addi r1, r1, SFS
1516 mtlr r0
1517 blr
1518
1519.balign 32
1520.global kvm_flush_link_stack
1521kvm_flush_link_stack:
1522
1523 mflr r0
1524
1525
1526 .rept 32
1527 bl .+4
1528 .endr
1529
1530
1531BEGIN_FTR_SECTION
1532 .rept 32
1533 bl .+4
1534 .endr
1535END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
1536
1537
1538 mtlr r0
1539 blr
1540
1541kvmppc_guest_external:
1542
1543
1544
1545 bl kvmppc_read_intr
1546
1547
1548
1549
1550
1551 ld r9, HSTATE_KVM_VCPU(r13)
1552 li r12, BOOK3S_INTERRUPT_EXTERNAL
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581 cmpdi r3, 1
1582 ble 1f
1583
1584
1585 li r12, BOOK3S_INTERRUPT_HV_RM_HARD
1586 stw r12, VCPU_TRAP(r9)
1587 b guest_exit_cont
1588
15891:
1590 cmpdi r3, 0
1591 bgt guest_exit_cont
1592
1593
1594maybe_reenter_guest:
1595 ld r5, HSTATE_KVM_VCORE(r13)
1596 lwz r0, VCORE_ENTRY_EXIT(r5)
1597 cmpwi r0, 0x100
1598 mr r4, r9
1599 blt deliver_guest_interrupt
1600 b guest_exit_cont
1601
1602
1603
1604
1605
1606
1607
1608
1609kvmppc_hdsi:
1610 mfspr r4, SPRN_HDAR
1611 mfspr r6, SPRN_HDSISR
1612
1613 andis. r0, r6, (DSISR_NOHPTE | DSISR_PROTFAULT)@h
1614 beq 1f
1615 andi. r0, r11, MSR_DR
1616 beq 3f
1617 clrrdi r0, r4, 28
1618 PPC_SLBFEE_DOT(R5, R0)
1619 li r0, BOOK3S_INTERRUPT_DATA_SEGMENT
1620 bne 7f
16214: std r4, VCPU_FAULT_DAR(r9)
1622 stw r6, VCPU_FAULT_DSISR(r9)
1623
1624
1625 mr r3, r9
1626 li r7, 1
1627 bl kvmppc_hpte_hv_fault
1628 ld r9, HSTATE_KVM_VCPU(r13)
1629 ld r10, VCPU_PC(r9)
1630 ld r11, VCPU_MSR(r9)
1631 li r12, BOOK3S_INTERRUPT_H_DATA_STORAGE
1632 cmpdi r3, 0
1633 beq 6f
1634 cmpdi r3, -1
1635 beq guest_exit_cont
1636 cmpdi r3, -2
1637 beq 2f
1638
1639
1640 ld r4, VCPU_FAULT_DAR(r9)
1641 mr r6, r3
16421: li r0, BOOK3S_INTERRUPT_DATA_STORAGE
1643 mtspr SPRN_DSISR, r6
16447: mtspr SPRN_DAR, r4
1645 mtspr SPRN_SRR0, r10
1646 mtspr SPRN_SRR1, r11
1647 mr r10, r0
1648 bl kvmppc_msr_interrupt
1649fast_interrupt_c_return:
16506: ld r7, VCPU_CTR(r9)
1651 ld r8, VCPU_XER(r9)
1652 mtctr r7
1653 mtxer r8
1654 mr r4, r9
1655 b fast_guest_return
1656
16573: ld r5, VCPU_KVM(r9)
1658 ld r5, KVM_VRMA_SLB_V(r5)
1659 b 4b
1660
1661
16622: li r8, KVM_INST_FETCH_FAILED
1663
1664
1665
1666 li r0, KVM_GUEST_MODE_SKIP
1667 stb r0, HSTATE_IN_GUEST(r13)
1668
1669
1670 mfmsr r3
1671 ori r4, r3, MSR_DR
1672 mtmsrd r4
1673 lwz r8, 0(r10)
1674 mtmsrd r3
1675
1676
1677 stw r8, VCPU_LAST_INST(r9)
1678
1679
1680 li r0, KVM_GUEST_MODE_HOST_HV
1681 stb r0, HSTATE_IN_GUEST(r13)
1682 b guest_exit_cont
1683
1684
1685
1686
1687
1688kvmppc_hisi:
1689 andis. r0, r11, SRR1_ISI_NOPT@h
1690 beq 1f
1691 andi. r0, r11, MSR_IR
1692 beq 3f
1693 clrrdi r0, r10, 28
1694 PPC_SLBFEE_DOT(R5, R0)
1695 li r0, BOOK3S_INTERRUPT_INST_SEGMENT
1696 bne 7f
16974:
1698
1699 mr r3, r9
1700 mr r4, r10
1701 mr r6, r11
1702 li r7, 0
1703 bl kvmppc_hpte_hv_fault
1704 ld r9, HSTATE_KVM_VCPU(r13)
1705 ld r10, VCPU_PC(r9)
1706 ld r11, VCPU_MSR(r9)
1707 li r12, BOOK3S_INTERRUPT_H_INST_STORAGE
1708 cmpdi r3, 0
1709 beq fast_interrupt_c_return
1710 cmpdi r3, -1
1711 beq guest_exit_cont
1712
1713
1714 mr r11, r3
17151: li r0, BOOK3S_INTERRUPT_INST_STORAGE
17167: mtspr SPRN_SRR0, r10
1717 mtspr SPRN_SRR1, r11
1718 mr r10, r0
1719 bl kvmppc_msr_interrupt
1720 b fast_interrupt_c_return
1721
17223: ld r6, VCPU_KVM(r9)
1723 ld r5, KVM_VRMA_SLB_V(r6)
1724 b 4b
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735hcall_try_real_mode:
1736 ld r3,VCPU_GPR(R3)(r9)
1737 andi. r0,r11,MSR_PR
1738
1739 bne sc_1_fast_return
1740 clrrdi r3,r3,2
1741 cmpldi r3,hcall_real_table_end - hcall_real_table
1742 bge guest_exit_cont
1743
1744 ld r4, VCPU_KVM(r9)
1745 srdi r0, r3, 8
1746 sldi r0, r0, 3
1747 add r4, r4, r0
1748 ld r0, KVM_ENABLED_HCALLS(r4)
1749 rlwinm r4, r3, 32-2, 0x3f
1750 srd r0, r0, r4
1751 andi. r0, r0, 1
1752 beq guest_exit_cont
1753
1754 LOAD_REG_ADDR(r4, hcall_real_table)
1755 lwax r3,r3,r4
1756 cmpwi r3,0
1757 beq guest_exit_cont
1758 add r12,r3,r4
1759 mtctr r12
1760 mr r3,r9
1761 ld r4,VCPU_GPR(R4)(r9)
1762 bctrl
1763 cmpdi r3,H_TOO_HARD
1764 beq hcall_real_fallback
1765 ld r4,HSTATE_KVM_VCPU(r13)
1766 std r3,VCPU_GPR(R3)(r4)
1767 ld r10,VCPU_PC(r4)
1768 ld r11,VCPU_MSR(r4)
1769 b fast_guest_return
1770
1771sc_1_fast_return:
1772 mtspr SPRN_SRR0,r10
1773 mtspr SPRN_SRR1,r11
1774 li r10, BOOK3S_INTERRUPT_SYSCALL
1775 bl kvmppc_msr_interrupt
1776 mr r4,r9
1777 b fast_guest_return
1778
1779
1780
1781
1782hcall_real_fallback:
1783 li r12,BOOK3S_INTERRUPT_SYSCALL
1784 ld r9, HSTATE_KVM_VCPU(r13)
1785
1786 b guest_exit_cont
1787
1788 .globl hcall_real_table
1789hcall_real_table:
1790 .long 0
1791 .long DOTSYM(kvmppc_h_remove) - hcall_real_table
1792 .long DOTSYM(kvmppc_h_enter) - hcall_real_table
1793 .long DOTSYM(kvmppc_h_read) - hcall_real_table
1794 .long DOTSYM(kvmppc_h_clear_mod) - hcall_real_table
1795 .long DOTSYM(kvmppc_h_clear_ref) - hcall_real_table
1796 .long DOTSYM(kvmppc_h_protect) - hcall_real_table
1797#ifdef CONFIG_SPAPR_TCE_IOMMU
1798 .long DOTSYM(kvmppc_h_get_tce) - hcall_real_table
1799 .long DOTSYM(kvmppc_rm_h_put_tce) - hcall_real_table
1800#else
1801 .long 0
1802 .long 0
1803#endif
1804 .long 0
1805 .long DOTSYM(kvmppc_h_set_dabr) - hcall_real_table
1806 .long DOTSYM(kvmppc_rm_h_page_init) - hcall_real_table
1807 .long 0
1808 .long 0
1809 .long 0
1810 .long 0
1811 .long 0
1812 .long 0
1813 .long 0
1814 .long 0
1815 .long 0
1816 .long 0
1817 .long 0
1818 .long 0
1819 .long 0
1820#ifdef CONFIG_KVM_XICS
1821 .long DOTSYM(kvmppc_rm_h_eoi) - hcall_real_table
1822 .long DOTSYM(kvmppc_rm_h_cppr) - hcall_real_table
1823 .long DOTSYM(kvmppc_rm_h_ipi) - hcall_real_table
1824 .long DOTSYM(kvmppc_rm_h_ipoll) - hcall_real_table
1825 .long DOTSYM(kvmppc_rm_h_xirr) - hcall_real_table
1826#else
1827 .long 0
1828 .long 0
1829 .long 0
1830 .long 0
1831 .long 0
1832#endif
1833 .long 0
1834 .long 0
1835 .long 0
1836 .long 0
1837 .long 0
1838 .long 0
1839 .long 0
1840 .long 0
1841 .long 0
1842 .long 0
1843 .long 0
1844 .long 0
1845 .long 0
1846 .long 0
1847 .long 0
1848 .long 0
1849 .long 0
1850 .long 0
1851 .long 0
1852 .long 0
1853 .long 0
1854 .long 0
1855 .long 0
1856 .long 0
1857 .long 0
1858 .long 0
1859 .long DOTSYM(kvmppc_h_cede) - hcall_real_table
1860 .long DOTSYM(kvmppc_rm_h_confer) - hcall_real_table
1861 .long 0
1862 .long 0
1863 .long 0
1864 .long 0
1865 .long 0
1866 .long 0
1867 .long 0
1868 .long 0
1869 .long 0
1870 .long 0
1871 .long 0
1872 .long 0
1873 .long 0
1874 .long 0
1875 .long 0
1876 .long DOTSYM(kvmppc_h_bulk_remove) - hcall_real_table
1877 .long 0
1878 .long 0
1879 .long 0
1880 .long DOTSYM(kvmppc_h_set_xdabr) - hcall_real_table
1881#ifdef CONFIG_SPAPR_TCE_IOMMU
1882 .long DOTSYM(kvmppc_rm_h_stuff_tce) - hcall_real_table
1883 .long DOTSYM(kvmppc_rm_h_put_tce_indirect) - hcall_real_table
1884#else
1885 .long 0
1886 .long 0
1887#endif
1888 .long 0
1889 .long 0
1890 .long 0
1891 .long 0
1892 .long 0
1893 .long 0
1894 .long 0
1895 .long 0
1896 .long 0
1897 .long 0
1898 .long 0
1899 .long 0
1900 .long 0
1901 .long 0
1902 .long 0
1903 .long 0
1904 .long 0
1905 .long 0
1906 .long 0
1907 .long 0
1908 .long 0
1909 .long 0
1910 .long 0
1911 .long 0
1912 .long 0
1913 .long 0
1914 .long 0
1915 .long 0
1916 .long 0
1917 .long 0
1918 .long 0
1919 .long 0
1920 .long 0
1921 .long 0
1922 .long 0
1923 .long 0
1924 .long 0
1925 .long 0
1926 .long 0
1927 .long 0
1928 .long 0
1929 .long 0
1930 .long 0
1931 .long 0
1932 .long 0
1933 .long 0
1934 .long 0
1935 .long 0
1936 .long 0
1937 .long 0
1938 .long 0
1939 .long 0
1940 .long 0
1941 .long 0
1942 .long 0
1943 .long 0
1944 .long 0
1945 .long 0
1946 .long 0
1947 .long 0
1948 .long 0
1949 .long 0
1950 .long 0
1951 .long 0
1952 .long 0
1953 .long 0
1954 .long 0
1955 .long 0
1956 .long 0
1957 .long 0
1958 .long 0
1959 .long 0
1960 .long 0
1961 .long 0
1962 .long 0
1963 .long 0
1964 .long 0
1965 .long 0
1966 .long 0
1967 .long 0
1968 .long 0
1969 .long 0
1970 .long 0
1971 .long 0
1972 .long 0
1973 .long 0
1974 .long 0
1975 .long 0
1976 .long 0
1977 .long 0
1978 .long 0
1979 .long 0
1980 .long 0
1981 .long 0
1982 .long 0
1983 .long 0
1984 .long 0
1985 .long 0
1986 .long 0
1987 .long 0
1988 .long 0
1989 .long 0
1990 .long 0
1991 .long 0
1992 .long 0
1993 .long 0
1994 .long 0
1995 .long 0
1996 .long 0
1997 .long 0
1998 .long 0
1999#ifdef CONFIG_KVM_XICS
2000 .long DOTSYM(kvmppc_rm_h_xirr_x) - hcall_real_table
2001#else
2002 .long 0
2003#endif
2004 .long DOTSYM(kvmppc_rm_h_random) - hcall_real_table
2005 .globl hcall_real_table_end
2006hcall_real_table_end:
2007
2008_GLOBAL(kvmppc_h_set_xdabr)
2009EXPORT_SYMBOL_GPL(kvmppc_h_set_xdabr)
2010 andi. r0, r5, DABRX_USER | DABRX_KERNEL
2011 beq 6f
2012 li r0, DABRX_USER | DABRX_KERNEL | DABRX_BTI
2013 andc. r0, r5, r0
2014 beq 3f
20156: li r3, H_PARAMETER
2016 blr
2017
2018_GLOBAL(kvmppc_h_set_dabr)
2019EXPORT_SYMBOL_GPL(kvmppc_h_set_dabr)
2020 li r5, DABRX_USER | DABRX_KERNEL
20213:
2022BEGIN_FTR_SECTION
2023 b 2f
2024END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
2025 std r4,VCPU_DABR(r3)
2026 stw r5, VCPU_DABRX(r3)
2027 mtspr SPRN_DABRX, r5
2028
20291: mtspr SPRN_DABR,r4
2030 mfspr r5, SPRN_DABR
2031 cmpd r4, r5
2032 bne 1b
2033 isync
2034 li r3,0
2035 blr
2036
20372:
2038 LOAD_REG_ADDR(r11, dawr_force_enable)
2039 lbz r11, 0(r11)
2040 cmpdi r11, 0
2041 bne 3f
2042 li r3, H_HARDWARE
2043 blr
20443:
2045
2046 rlwimi r5, r4, 5, DAWRX_DR | DAWRX_DW
2047 rlwimi r5, r4, 2, DAWRX_WT
2048 clrrdi r4, r4, 3
2049 std r4, VCPU_DAWR0(r3)
2050 std r5, VCPU_DAWRX0(r3)
2051
2052
2053
2054
2055
2056
2057 mfmsr r6
2058 andi. r6, r6, MSR_DR
2059 bne 4f
2060 mtspr SPRN_DAWR0, r4
2061 mtspr SPRN_DAWRX0, r5
20624: li r3, 0
2063 blr
2064
2065_GLOBAL(kvmppc_h_cede)
2066 ori r11,r11,MSR_EE
2067 std r11,VCPU_MSR(r3)
2068 li r0,1
2069 stb r0,VCPU_CEDED(r3)
2070 sync
2071 lbz r5,VCPU_PRODDED(r3)
2072 cmpwi r5,0
2073 bne kvm_cede_prodded
2074 li r12,0
2075 stw r12,VCPU_TRAP(r3)
2076 li r0,H_SUCCESS
2077 std r0,VCPU_GPR(R3)(r3)
2078
2079
2080
2081
2082
2083
2084 ld r5,HSTATE_KVM_VCORE(r13)
2085 lbz r6,HSTATE_PTID(r13)
2086 lwz r8,VCORE_ENTRY_EXIT(r5)
2087 clrldi r8,r8,56
2088 li r0,1
2089 sld r0,r0,r6
2090 addi r6,r5,VCORE_NAPPING_THREADS
209131: lwarx r4,0,r6
2092 or r4,r4,r0
2093 cmpw r4,r8
2094 beq kvm_cede_exit
2095 stwcx. r4,0,r6
2096 bne 31b
2097
2098 isync
2099 li r0,NAPPING_CEDE
2100 stb r0,HSTATE_NAPPING(r13)
2101 lwz r7,VCORE_ENTRY_EXIT(r5)
2102 cmpwi r7,0x100
2103 bge 33f
2104
2105
2106
2107
2108
2109
2110
2111
2112 std r14, VCPU_GPR(R14)(r3)
2113 std r15, VCPU_GPR(R15)(r3)
2114 std r16, VCPU_GPR(R16)(r3)
2115 std r17, VCPU_GPR(R17)(r3)
2116 std r18, VCPU_GPR(R18)(r3)
2117 std r19, VCPU_GPR(R19)(r3)
2118 std r20, VCPU_GPR(R20)(r3)
2119 std r21, VCPU_GPR(R21)(r3)
2120 std r22, VCPU_GPR(R22)(r3)
2121 std r23, VCPU_GPR(R23)(r3)
2122 std r24, VCPU_GPR(R24)(r3)
2123 std r25, VCPU_GPR(R25)(r3)
2124 std r26, VCPU_GPR(R26)(r3)
2125 std r27, VCPU_GPR(R27)(r3)
2126 std r28, VCPU_GPR(R28)(r3)
2127 std r29, VCPU_GPR(R29)(r3)
2128 std r30, VCPU_GPR(R30)(r3)
2129 std r31, VCPU_GPR(R31)(r3)
2130
2131
2132 bl kvmppc_save_fp
2133
2134#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
2135BEGIN_FTR_SECTION
2136 b 91f
2137END_FTR_SECTION_IFCLR(CPU_FTR_TM)
2138
2139
2140
2141 ld r3, HSTATE_KVM_VCPU(r13)
2142 ld r4, VCPU_MSR(r3)
2143 li r5, 0
2144 bl kvmppc_save_tm_hv
2145 nop
214691:
2147#endif
2148
2149
2150
2151
2152
2153
2154 mfspr r3, SPRN_DEC
2155 mfspr r4, SPRN_HDEC
2156 mftb r5
2157 extsw r3, r3
2158 extsw r4, r4
2159 cmpd r3, r4
2160 ble 67f
2161 mtspr SPRN_DEC, r4
216267:
2163
2164 add r3, r3, r5
2165 ld r4, HSTATE_KVM_VCPU(r13)
2166 ld r5, HSTATE_KVM_VCORE(r13)
2167 ld r6, VCORE_TB_OFFSET_APPL(r5)
2168 subf r3, r6, r3
2169 std r3, VCPU_DEC_EXPIRES(r4)
2170
2171#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING
2172 ld r4, HSTATE_KVM_VCPU(r13)
2173 addi r3, r4, VCPU_TB_CEDE
2174 bl kvmhv_accumulate_time
2175#endif
2176
2177 lis r3, LPCR_PECEDP@h
2178
2179
2180 ld r1, HSTATE_HOST_R1(r13)
2181
2182
2183
2184
2185
2186
2187
2188kvm_do_nap:
2189 mfspr r0, SPRN_CTRLF
2190 clrrdi r0, r0, 1
2191 mtspr SPRN_CTRLT, r0
2192
2193 li r0,1
2194 stb r0,HSTATE_HWTHREAD_REQ(r13)
2195 mfspr r5,SPRN_LPCR
2196 ori r5,r5,LPCR_PECE0 | LPCR_PECE1
2197BEGIN_FTR_SECTION
2198 ori r5, r5, LPCR_PECEDH
2199 rlwimi r5, r3, 0, LPCR_PECEDP
2200END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
2201
2202kvm_nap_sequence:
2203 li r3, PNV_THREAD_NAP
2204 mtspr SPRN_LPCR,r5
2205 isync
2206
2207 bl isa206_idle_insn_mayloss
2208
2209 mfspr r0, SPRN_CTRLF
2210 ori r0, r0, 1
2211 mtspr SPRN_CTRLT, r0
2212
2213 mtspr SPRN_SRR1, r3
2214
2215 li r0, 0
2216 stb r0, PACA_FTRACE_ENABLED(r13)
2217
2218 li r0, KVM_HWTHREAD_IN_KVM
2219 stb r0, HSTATE_HWTHREAD_STATE(r13)
2220
2221 lbz r0, HSTATE_NAPPING(r13)
2222 cmpwi r0, NAPPING_CEDE
2223 beq kvm_end_cede
2224 cmpwi r0, NAPPING_NOVCPU
2225 beq kvm_novcpu_wakeup
2226 cmpwi r0, NAPPING_UNSPLIT
2227 beq kvm_unsplit_wakeup
2228 twi 31,0,0
2229
223033: mr r4, r3
2231 li r3, 0
2232 li r12, 0
2233 b 34f
2234
2235kvm_end_cede:
2236
2237
2238
2239 ld r4, HSTATE_KVM_VCPU(r13)
2240
2241#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING
2242 addi r3, r4, VCPU_TB_RMINTR
2243 bl kvmhv_accumulate_time
2244#endif
2245
2246#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
2247BEGIN_FTR_SECTION
2248 b 91f
2249END_FTR_SECTION_IFCLR(CPU_FTR_TM)
2250
2251
2252
2253 mr r3, r4
2254 ld r4, VCPU_MSR(r3)
2255 li r5, 0
2256 bl kvmppc_restore_tm_hv
2257 nop
2258 ld r4, HSTATE_KVM_VCPU(r13)
225991:
2260#endif
2261
2262
2263 bl kvmppc_load_fp
2264
2265
2266 ld r3, VCPU_DEC_EXPIRES(r4)
2267 ld r5, HSTATE_KVM_VCORE(r13)
2268 ld r6, VCORE_TB_OFFSET_APPL(r5)
2269 add r3, r3, r6
2270 mftb r7
2271 subf r3, r7, r3
2272 mtspr SPRN_DEC, r3
2273
2274
2275 ld r14, VCPU_GPR(R14)(r4)
2276 ld r15, VCPU_GPR(R15)(r4)
2277 ld r16, VCPU_GPR(R16)(r4)
2278 ld r17, VCPU_GPR(R17)(r4)
2279 ld r18, VCPU_GPR(R18)(r4)
2280 ld r19, VCPU_GPR(R19)(r4)
2281 ld r20, VCPU_GPR(R20)(r4)
2282 ld r21, VCPU_GPR(R21)(r4)
2283 ld r22, VCPU_GPR(R22)(r4)
2284 ld r23, VCPU_GPR(R23)(r4)
2285 ld r24, VCPU_GPR(R24)(r4)
2286 ld r25, VCPU_GPR(R25)(r4)
2287 ld r26, VCPU_GPR(R26)(r4)
2288 ld r27, VCPU_GPR(R27)(r4)
2289 ld r28, VCPU_GPR(R28)(r4)
2290 ld r29, VCPU_GPR(R29)(r4)
2291 ld r30, VCPU_GPR(R30)(r4)
2292 ld r31, VCPU_GPR(R31)(r4)
2293
2294
2295 bl kvmppc_check_wake_reason
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305 ld r4, HSTATE_KVM_VCPU(r13)
2306
2307
230834: ld r5,HSTATE_KVM_VCORE(r13)
2309 lbz r7,HSTATE_PTID(r13)
2310 li r0,1
2311 sld r0,r0,r7
2312 addi r6,r5,VCORE_NAPPING_THREADS
231332: lwarx r7,0,r6
2314 andc r7,r7,r0
2315 stwcx. r7,0,r6
2316 bne 32b
2317 li r0,0
2318 stb r0,HSTATE_NAPPING(r13)
2319
2320
2321 stw r12, VCPU_TRAP(r4)
2322 mr r9, r4
2323 cmpdi r3, 0
2324 bgt guest_exit_cont
2325 b maybe_reenter_guest
2326
2327
2328kvm_cede_prodded:
2329 li r0,0
2330 stb r0,VCPU_PRODDED(r3)
2331 sync
2332 stb r0,VCPU_CEDED(r3)
2333 li r3,H_SUCCESS
2334 blr
2335
2336
2337kvm_cede_exit:
2338 ld r9, HSTATE_KVM_VCPU(r13)
2339 b guest_exit_cont
2340
2341
2342machine_check_realmode:
2343 mr r3, r9
2344 bl kvmppc_realmode_machine_check
2345 nop
2346
2347 ld r9, HSTATE_KVM_VCPU(r13)
2348 li r12, BOOK3S_INTERRUPT_MACHINE_CHECK
2349 b guest_exit_cont
2350
2351
2352
2353
2354
2355
2356
2357hmi_realmode:
2358 lbz r0, HSTATE_PTID(r13)
2359 cmpwi r0, 0
2360 bne guest_exit_cont
2361 bl kvmppc_realmode_hmi_handler
2362 ld r9, HSTATE_KVM_VCPU(r13)
2363 li r12, BOOK3S_INTERRUPT_HMI
2364 b guest_exit_cont
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381kvmppc_check_wake_reason:
2382 mfspr r6, SPRN_SRR1
2383BEGIN_FTR_SECTION
2384 rlwinm r6, r6, 45-31, 0xf
2385FTR_SECTION_ELSE
2386 rlwinm r6, r6, 45-31, 0xe
2387ALT_FTR_SECTION_END_IFSET(CPU_FTR_ARCH_207S)
2388 cmpwi r6, 8
2389 beq 7f
2390 li r3, 0
2391 li r12, 0
2392 cmpwi r6, 6
2393 beq 0f
2394BEGIN_FTR_SECTION
2395 cmpwi r6, 5
2396 beq 0f
2397 cmpwi r6, 3
2398 beq 3f
2399END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
2400 cmpwi r6, 0xa
2401 beq 4f
2402 li r3, 1
24030: blr
2404
2405
24063: li r12, BOOK3S_INTERRUPT_H_DOORBELL
2407
2408
2409
2410
2411
2412 lis r6, (PPC_DBELL_SERVER << (63-36))@h
2413 PPC_MSGCLR(6)
2414
2415 li r3, 1
2416 lbz r0, HSTATE_HOST_IPI(r13)
2417 cmpwi r0, 0
2418 bnelr
2419
2420 li r3, -1
2421 blr
2422
2423
24244: li r12, BOOK3S_INTERRUPT_HMI
2425 li r3, 1
2426 blr
2427
2428
24297: mflr r0
2430 std r0, PPC_LR_STKOFF(r1)
2431 stdu r1, -PPC_MIN_STKFRM(r1)
2432 bl kvmppc_read_intr
2433 nop
2434 li r12, BOOK3S_INTERRUPT_EXTERNAL
2435 cmpdi r3, 1
2436 ble 1f
2437
2438
2439
2440
2441
2442
2443
2444 li r12, BOOK3S_INTERRUPT_HV_RM_HARD
24451:
2446 ld r0, PPC_MIN_STKFRM+PPC_LR_STKOFF(r1)
2447 addi r1, r1, PPC_MIN_STKFRM
2448 mtlr r0
2449 blr
2450
2451
2452
2453
2454
2455
2456
2457kvmppc_save_fp:
2458 mflr r30
2459 mr r31,r3
2460 mfmsr r5
2461 ori r8,r5,MSR_FP
2462#ifdef CONFIG_ALTIVEC
2463BEGIN_FTR_SECTION
2464 oris r8,r8,MSR_VEC@h
2465END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
2466#endif
2467#ifdef CONFIG_VSX
2468BEGIN_FTR_SECTION
2469 oris r8,r8,MSR_VSX@h
2470END_FTR_SECTION_IFSET(CPU_FTR_VSX)
2471#endif
2472 mtmsrd r8
2473 addi r3,r3,VCPU_FPRS
2474 bl store_fp_state
2475#ifdef CONFIG_ALTIVEC
2476BEGIN_FTR_SECTION
2477 addi r3,r31,VCPU_VRS
2478 bl store_vr_state
2479END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
2480#endif
2481 mfspr r6,SPRN_VRSAVE
2482 stw r6,VCPU_VRSAVE(r31)
2483 mtlr r30
2484 blr
2485
2486
2487
2488
2489
2490
2491
2492kvmppc_load_fp:
2493 mflr r30
2494 mr r31,r4
2495 mfmsr r9
2496 ori r8,r9,MSR_FP
2497#ifdef CONFIG_ALTIVEC
2498BEGIN_FTR_SECTION
2499 oris r8,r8,MSR_VEC@h
2500END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
2501#endif
2502#ifdef CONFIG_VSX
2503BEGIN_FTR_SECTION
2504 oris r8,r8,MSR_VSX@h
2505END_FTR_SECTION_IFSET(CPU_FTR_VSX)
2506#endif
2507 mtmsrd r8
2508 addi r3,r4,VCPU_FPRS
2509 bl load_fp_state
2510#ifdef CONFIG_ALTIVEC
2511BEGIN_FTR_SECTION
2512 addi r3,r31,VCPU_VRS
2513 bl load_vr_state
2514END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
2515#endif
2516 lwz r7,VCPU_VRSAVE(r31)
2517 mtspr SPRN_VRSAVE,r7
2518 mtlr r30
2519 mr r4,r31
2520 blr
2521
2522#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
2523
2524
2525
2526
2527
2528
2529
2530
2531_GLOBAL_TOC(kvmppc_save_tm_hv)
2532EXPORT_SYMBOL_GPL(kvmppc_save_tm_hv)
2533
2534BEGIN_FTR_SECTION
2535 b __kvmppc_save_tm
2536END_FTR_SECTION_IFCLR(CPU_FTR_P9_TM_HV_ASSIST)
2537
2538 lbz r0, HSTATE_FAKE_SUSPEND(r13)
2539 cmpwi r0, 0
2540 beq __kvmppc_save_tm
2541
2542
2543 mflr r0
2544 std r0, PPC_LR_STKOFF(r1)
2545 stdu r1, -TM_FRAME_SIZE(r1)
2546
2547
2548 mfmsr r8
2549 li r0, 1
2550 rldimi r8, r0, MSR_TM_LG, 63-MSR_TM_LG
2551 mtmsrd r8
2552
2553 rldicl. r8, r8, 64 - MSR_TS_S_LG, 62
2554 beq 4f
2555BEGIN_FTR_SECTION
2556 bl pnv_power9_force_smt4_catch
2557END_FTR_SECTION_IFSET(CPU_FTR_P9_TM_XER_SO_BUG)
2558 nop
2559
2560
2561
2562
2563
2564
2565 mfspr r3, SPRN_DSCR
2566 mfspr r4, SPRN_XER
2567 mfspr r5, SPRN_AMR
2568
2569 mfcr r12
2570 SAVE_NVGPRS(r1)
2571 SAVE_GPR(2, r1)
2572 SAVE_GPR(3, r1)
2573 SAVE_GPR(4, r1)
2574 SAVE_GPR(5, r1)
2575 stw r12, 8(r1)
2576 std r1, HSTATE_HOST_R1(r13)
2577
2578
2579 li r3, TM_CAUSE_KVM_RESCHED
2580 TRECLAIM(R3)
2581
2582 GET_PACA(r13)
2583 ld r1, HSTATE_HOST_R1(r13)
2584 REST_GPR(2, r1)
2585 REST_GPR(3, r1)
2586 REST_GPR(4, r1)
2587 REST_GPR(5, r1)
2588 lwz r12, 8(r1)
2589 REST_NVGPRS(r1)
2590 mtspr SPRN_DSCR, r3
2591 mtspr SPRN_XER, r4
2592 mtspr SPRN_AMR, r5
2593 mtcr r12
2594 HMT_MEDIUM
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604BEGIN_FTR_SECTION
2605 bl pnv_power9_force_smt4_release
2606END_FTR_SECTION_IFSET(CPU_FTR_P9_TM_XER_SO_BUG)
2607 nop
2608
26094:
2610 mfspr r3, SPRN_PSSCR
2611
2612 li r0, PSSCR_FAKE_SUSPEND
2613 andc r3, r3, r0
2614 mtspr SPRN_PSSCR, r3
2615
2616
2617 ld r9, HSTATE_KVM_VCPU(r13)
2618 mfspr r5, SPRN_TFHAR
2619 mfspr r6, SPRN_TFIAR
2620 std r5, VCPU_TFHAR(r9)
2621 std r6, VCPU_TFIAR(r9)
2622
2623 addi r1, r1, TM_FRAME_SIZE
2624 ld r0, PPC_LR_STKOFF(r1)
2625 mtlr r0
2626 blr
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636_GLOBAL_TOC(kvmppc_restore_tm_hv)
2637EXPORT_SYMBOL_GPL(kvmppc_restore_tm_hv)
2638
2639
2640
2641
2642
2643BEGIN_FTR_SECTION
2644 b __kvmppc_restore_tm
2645END_FTR_SECTION_IFCLR(CPU_FTR_P9_TM_HV_ASSIST)
2646 mflr r0
2647 std r0, PPC_LR_STKOFF(r1)
2648
2649 li r0, 0
2650 stb r0, HSTATE_FAKE_SUSPEND(r13)
2651
2652
2653 mfmsr r5
2654 li r0, 1
2655 rldimi r5, r0, MSR_TM_LG, 63-MSR_TM_LG
2656 mtmsrd r5
2657
2658
2659
2660
2661
2662 ld r5, VCPU_TFHAR(r3)
2663 ld r6, VCPU_TFIAR(r3)
2664 ld r7, VCPU_TEXASR(r3)
2665 mtspr SPRN_TFHAR, r5
2666 mtspr SPRN_TFIAR, r6
2667 mtspr SPRN_TEXASR, r7
2668
2669 rldicl. r5, r4, 64 - MSR_TS_S_LG, 62
2670 beqlr
2671
2672
2673 oris r7, r7, (TEXASR_FS)@h
2674 mtspr SPRN_TEXASR, r7
2675
2676 cmpwi r5, 1
2677 bgt 10f
2678 stb r5, HSTATE_FAKE_SUSPEND(r13)
2679 b 9f
268010: stdu r1, -PPC_MIN_STKFRM(r1)
2681
2682 bl kvmhv_emulate_tm_rollback
2683 nop
2684 addi r1, r1, PPC_MIN_STKFRM
26859: ld r0, PPC_LR_STKOFF(r1)
2686 mtlr r0
2687 blr
2688#endif
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701kvmppc_bad_host_intr:
2702
2703
2704
2705
2706 mr r9, r1
2707 std r1, PACAR1(r13)
2708 ld r1, PACAEMERGSP(r13)
2709 subi r1, r1, THREAD_SIZE/2 + INT_FRAME_SIZE
2710 std r9, 0(r1)
2711 std r0, GPR0(r1)
2712 std r9, GPR1(r1)
2713 std r2, GPR2(r1)
2714 SAVE_4GPRS(3, r1)
2715 SAVE_2GPRS(7, r1)
2716 srdi r0, r12, 32
2717 clrldi r12, r12, 32
2718 std r0, _CCR(r1)
2719 std r12, _TRAP(r1)
2720 andi. r0, r12, 2
2721 beq 1f
2722 mfspr r3, SPRN_HSRR0
2723 mfspr r4, SPRN_HSRR1
2724 mfspr r5, SPRN_HDAR
2725 mfspr r6, SPRN_HDSISR
2726 b 2f
27271: mfspr r3, SPRN_SRR0
2728 mfspr r4, SPRN_SRR1
2729 mfspr r5, SPRN_DAR
2730 mfspr r6, SPRN_DSISR
27312: std r3, _NIP(r1)
2732 std r4, _MSR(r1)
2733 std r5, _DAR(r1)
2734 std r6, _DSISR(r1)
2735 ld r9, HSTATE_SCRATCH2(r13)
2736 ld r12, HSTATE_SCRATCH0(r13)
2737 GET_SCRATCH0(r0)
2738 SAVE_4GPRS(9, r1)
2739 std r0, GPR13(r1)
2740 SAVE_NVGPRS(r1)
2741 ld r5, HSTATE_CFAR(r13)
2742 std r5, ORIG_GPR3(r1)
2743 mflr r3
2744 mfctr r4
2745 mfxer r5
2746 lbz r6, PACAIRQSOFTMASK(r13)
2747 std r3, _LINK(r1)
2748 std r4, _CTR(r1)
2749 std r5, _XER(r1)
2750 std r6, SOFTE(r1)
2751 ld r2, PACATOC(r13)
2752 LOAD_REG_IMMEDIATE(3, 0x7265677368657265)
2753 std r3, STACK_FRAME_OVERHEAD-16(r1)
2754
2755
2756
2757
2758
2759
2760
2761 b .
2762
2763
2764
2765
2766
2767
2768
2769
2770kvmppc_msr_interrupt:
2771 rldicl r0, r11, 64 - MSR_TS_S_LG, 62
2772 cmpwi r0, 2
2773 ld r11, VCPU_INTR_MSR(r9)
2774 bne 1f
2775
2776 li r0, 1
27771: rldimi r11, r0, MSR_TS_S_LG, 63 - MSR_TS_T_LG
2778 blr
2779
2780
2781
2782
2783_GLOBAL(kvmhv_load_guest_pmu)
2784EXPORT_SYMBOL_GPL(kvmhv_load_guest_pmu)
2785 mr r4, r3
2786 mflr r0
2787 li r3, 1
2788 sldi r3, r3, 31
2789 mtspr SPRN_MMCR0, r3
2790 isync
2791BEGIN_FTR_SECTION
2792 ld r3, VCPU_MMCR(r4)
2793 andi. r5, r3, MMCR0_PMAO_SYNC | MMCR0_PMAO
2794 cmpwi r5, MMCR0_PMAO
2795 beql kvmppc_fix_pmao
2796END_FTR_SECTION_IFSET(CPU_FTR_PMAO_BUG)
2797 lwz r3, VCPU_PMC(r4)
2798 lwz r5, VCPU_PMC + 4(r4)
2799 lwz r6, VCPU_PMC + 8(r4)
2800 lwz r7, VCPU_PMC + 12(r4)
2801 lwz r8, VCPU_PMC + 16(r4)
2802 lwz r9, VCPU_PMC + 20(r4)
2803 mtspr SPRN_PMC1, r3
2804 mtspr SPRN_PMC2, r5
2805 mtspr SPRN_PMC3, r6
2806 mtspr SPRN_PMC4, r7
2807 mtspr SPRN_PMC5, r8
2808 mtspr SPRN_PMC6, r9
2809 ld r3, VCPU_MMCR(r4)
2810 ld r5, VCPU_MMCR + 8(r4)
2811 ld r6, VCPU_MMCRA(r4)
2812 ld r7, VCPU_SIAR(r4)
2813 ld r8, VCPU_SDAR(r4)
2814 mtspr SPRN_MMCR1, r5
2815 mtspr SPRN_MMCRA, r6
2816 mtspr SPRN_SIAR, r7
2817 mtspr SPRN_SDAR, r8
2818BEGIN_FTR_SECTION
2819 ld r5, VCPU_MMCR + 24(r4)
2820 ld r6, VCPU_SIER + 8(r4)
2821 ld r7, VCPU_SIER + 16(r4)
2822 mtspr SPRN_MMCR3, r5
2823 mtspr SPRN_SIER2, r6
2824 mtspr SPRN_SIER3, r7
2825END_FTR_SECTION_IFSET(CPU_FTR_ARCH_31)
2826BEGIN_FTR_SECTION
2827 ld r5, VCPU_MMCR + 16(r4)
2828 ld r6, VCPU_SIER(r4)
2829 mtspr SPRN_MMCR2, r5
2830 mtspr SPRN_SIER, r6
2831BEGIN_FTR_SECTION_NESTED(96)
2832 lwz r7, VCPU_PMC + 24(r4)
2833 lwz r8, VCPU_PMC + 28(r4)
2834 ld r9, VCPU_MMCRS(r4)
2835 mtspr SPRN_SPMC1, r7
2836 mtspr SPRN_SPMC2, r8
2837 mtspr SPRN_MMCRS, r9
2838END_FTR_SECTION_NESTED(CPU_FTR_ARCH_300, 0, 96)
2839END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
2840 mtspr SPRN_MMCR0, r3
2841 isync
2842 mtlr r0
2843 blr
2844
2845
2846
2847
2848_GLOBAL(kvmhv_load_host_pmu)
2849EXPORT_SYMBOL_GPL(kvmhv_load_host_pmu)
2850 mflr r0
2851 lbz r4, PACA_PMCINUSE(r13)
2852 cmpwi r4, 0
2853 beq 23f
2854BEGIN_FTR_SECTION
2855 ld r3, HSTATE_MMCR0(r13)
2856 andi. r4, r3, MMCR0_PMAO_SYNC | MMCR0_PMAO
2857 cmpwi r4, MMCR0_PMAO
2858 beql kvmppc_fix_pmao
2859END_FTR_SECTION_IFSET(CPU_FTR_PMAO_BUG)
2860 lwz r3, HSTATE_PMC1(r13)
2861 lwz r4, HSTATE_PMC2(r13)
2862 lwz r5, HSTATE_PMC3(r13)
2863 lwz r6, HSTATE_PMC4(r13)
2864 lwz r8, HSTATE_PMC5(r13)
2865 lwz r9, HSTATE_PMC6(r13)
2866 mtspr SPRN_PMC1, r3
2867 mtspr SPRN_PMC2, r4
2868 mtspr SPRN_PMC3, r5
2869 mtspr SPRN_PMC4, r6
2870 mtspr SPRN_PMC5, r8
2871 mtspr SPRN_PMC6, r9
2872 ld r3, HSTATE_MMCR0(r13)
2873 ld r4, HSTATE_MMCR1(r13)
2874 ld r5, HSTATE_MMCRA(r13)
2875 ld r6, HSTATE_SIAR(r13)
2876 ld r7, HSTATE_SDAR(r13)
2877 mtspr SPRN_MMCR1, r4
2878 mtspr SPRN_MMCRA, r5
2879 mtspr SPRN_SIAR, r6
2880 mtspr SPRN_SDAR, r7
2881BEGIN_FTR_SECTION
2882 ld r8, HSTATE_MMCR2(r13)
2883 ld r9, HSTATE_SIER(r13)
2884 mtspr SPRN_MMCR2, r8
2885 mtspr SPRN_SIER, r9
2886END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
2887BEGIN_FTR_SECTION
2888 ld r5, HSTATE_MMCR3(r13)
2889 ld r6, HSTATE_SIER2(r13)
2890 ld r7, HSTATE_SIER3(r13)
2891 mtspr SPRN_MMCR3, r5
2892 mtspr SPRN_SIER2, r6
2893 mtspr SPRN_SIER3, r7
2894END_FTR_SECTION_IFSET(CPU_FTR_ARCH_31)
2895 mtspr SPRN_MMCR0, r3
2896 isync
2897 mtlr r0
289823: blr
2899
2900
2901
2902
2903
2904_GLOBAL(kvmhv_save_guest_pmu)
2905EXPORT_SYMBOL_GPL(kvmhv_save_guest_pmu)
2906 mr r9, r3
2907 mr r8, r4
2908BEGIN_FTR_SECTION
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926 li r3, -1
2927 clrrdi r3, r3, 10
2928 mfspr r10, SPRN_MMCR2
2929 mtspr SPRN_MMCR2, r3
2930 isync
2931END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
2932 li r3, 1
2933 sldi r3, r3, 31
2934 mfspr r4, SPRN_MMCR0
2935 mtspr SPRN_MMCR0, r3
2936 mfspr r6, SPRN_MMCRA
2937
2938 li r7, 0
2939 mtspr SPRN_MMCRA, r7
2940 isync
2941 cmpwi r8, 0
2942 bne 21f
2943 std r3, VCPU_MMCR(r9)
2944 b 22f
294521: mfspr r5, SPRN_MMCR1
2946 mfspr r7, SPRN_SIAR
2947 mfspr r8, SPRN_SDAR
2948 std r4, VCPU_MMCR(r9)
2949 std r5, VCPU_MMCR + 8(r9)
2950 std r6, VCPU_MMCRA(r9)
2951BEGIN_FTR_SECTION
2952 std r10, VCPU_MMCR + 16(r9)
2953END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
2954BEGIN_FTR_SECTION
2955 mfspr r5, SPRN_MMCR3
2956 mfspr r6, SPRN_SIER2
2957 mfspr r7, SPRN_SIER3
2958 std r5, VCPU_MMCR + 24(r9)
2959 std r6, VCPU_SIER + 8(r9)
2960 std r7, VCPU_SIER + 16(r9)
2961END_FTR_SECTION_IFSET(CPU_FTR_ARCH_31)
2962 std r7, VCPU_SIAR(r9)
2963 std r8, VCPU_SDAR(r9)
2964 mfspr r3, SPRN_PMC1
2965 mfspr r4, SPRN_PMC2
2966 mfspr r5, SPRN_PMC3
2967 mfspr r6, SPRN_PMC4
2968 mfspr r7, SPRN_PMC5
2969 mfspr r8, SPRN_PMC6
2970 stw r3, VCPU_PMC(r9)
2971 stw r4, VCPU_PMC + 4(r9)
2972 stw r5, VCPU_PMC + 8(r9)
2973 stw r6, VCPU_PMC + 12(r9)
2974 stw r7, VCPU_PMC + 16(r9)
2975 stw r8, VCPU_PMC + 20(r9)
2976BEGIN_FTR_SECTION
2977 mfspr r5, SPRN_SIER
2978 std r5, VCPU_SIER(r9)
2979BEGIN_FTR_SECTION_NESTED(96)
2980 mfspr r6, SPRN_SPMC1
2981 mfspr r7, SPRN_SPMC2
2982 mfspr r8, SPRN_MMCRS
2983 stw r6, VCPU_PMC + 24(r9)
2984 stw r7, VCPU_PMC + 28(r9)
2985 std r8, VCPU_MMCRS(r9)
2986 lis r4, 0x8000
2987 mtspr SPRN_MMCRS, r4
2988END_FTR_SECTION_NESTED(CPU_FTR_ARCH_300, 0, 96)
2989END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
299022: blr
2991
2992
2993
2994
2995
2996
2997
2998kvmppc_fix_pmao:
2999 li r3, 0
3000 mtspr SPRN_MMCR2, r3
3001 lis r3, (MMCR0_PMXE | MMCR0_FCECE)@h
3002 ori r3, r3, MMCR0_PMCjCE | MMCR0_C56RUN
3003 mtspr SPRN_MMCR0, r3
3004 lis r3, 0x7fff
3005 ori r3, r3, 0xffff
3006 mtspr SPRN_PMC6, r3
3007 isync
3008 blr
3009
3010#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING
3011
3012
3013
3014
3015kvmhv_start_timing:
3016 ld r5, HSTATE_KVM_VCORE(r13)
3017 ld r6, VCORE_TB_OFFSET_APPL(r5)
3018 mftb r5
3019 subf r5, r6, r5
3020 std r3, VCPU_CUR_ACTIVITY(r4)
3021 std r5, VCPU_ACTIVITY_START(r4)
3022 blr
3023
3024
3025
3026
3027
3028kvmhv_accumulate_time:
3029 ld r5, HSTATE_KVM_VCORE(r13)
3030 ld r8, VCORE_TB_OFFSET_APPL(r5)
3031 ld r5, VCPU_CUR_ACTIVITY(r4)
3032 ld r6, VCPU_ACTIVITY_START(r4)
3033 std r3, VCPU_CUR_ACTIVITY(r4)
3034 mftb r7
3035 subf r7, r8, r7
3036 std r7, VCPU_ACTIVITY_START(r4)
3037 cmpdi r5, 0
3038 beqlr
3039 subf r3, r6, r7
3040 ld r8, TAS_SEQCOUNT(r5)
3041 cmpdi r8, 0
3042 addi r8, r8, 1
3043 std r8, TAS_SEQCOUNT(r5)
3044 lwsync
3045 ld r7, TAS_TOTAL(r5)
3046 add r7, r7, r3
3047 std r7, TAS_TOTAL(r5)
3048 ld r6, TAS_MIN(r5)
3049 ld r7, TAS_MAX(r5)
3050 beq 3f
3051 cmpd r3, r6
3052 bge 1f
30533: std r3, TAS_MIN(r5)
30541: cmpd r3, r7
3055 ble 2f
3056 std r3, TAS_MAX(r5)
30572: lwsync
3058 addi r8, r8, 1
3059 std r8, TAS_SEQCOUNT(r5)
3060 blr
3061#endif
3062