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/xive-regs.h>
29#include <asm/thread_info.h>
30#include <asm/asm-compat.h>
31#include <asm/feature-fixups.h>
32#include <asm/cpuidle.h>
33#include <asm/ultravisor-api.h>
34
35
36#define EXTEND_HDEC(reg) \
37BEGIN_FTR_SECTION; \
38 extsw reg, reg; \
39END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300)
40
41
42#define NAPPING_CEDE 1
43#define NAPPING_NOVCPU 2
44#define NAPPING_UNSPLIT 3
45
46
47#define SFS 208
48#define STACK_SLOT_TRAP (SFS-4)
49#define STACK_SLOT_SHORT_PATH (SFS-8)
50#define STACK_SLOT_TID (SFS-16)
51#define STACK_SLOT_PSSCR (SFS-24)
52#define STACK_SLOT_PID (SFS-32)
53#define STACK_SLOT_IAMR (SFS-40)
54#define STACK_SLOT_CIABR (SFS-48)
55#define STACK_SLOT_DAWR (SFS-56)
56#define STACK_SLOT_DAWRX (SFS-64)
57#define STACK_SLOT_HFSCR (SFS-72)
58#define STACK_SLOT_AMR (SFS-80)
59#define STACK_SLOT_UAMOR (SFS-88)
60
61#define STACK_SLOT_NVGPRS (SFS-152)
62
63
64
65
66
67
68
69
70
71_GLOBAL_TOC(kvmppc_hv_entry_trampoline)
72 mflr r0
73 std r0, PPC_LR_STKOFF(r1)
74 stdu r1, -112(r1)
75 mfmsr r10
76 std r10, HSTATE_HOST_MSR(r13)
77 LOAD_REG_ADDR(r5, kvmppc_call_hv_entry)
78 li r0,MSR_RI
79 andc r0,r10,r0
80 li r6,MSR_IR | MSR_DR
81 andc r6,r10,r6
82 mtmsrd r0,1
83 mtsrr0 r5
84 mtsrr1 r6
85 RFI_TO_KERNEL
86
87kvmppc_call_hv_entry:
88BEGIN_FTR_SECTION
89
90 ld r3, HSTATE_SPLIT_MODE(r13)
91 cmpdi r3, 0
92 beq 46f
93 lwz r4, KVM_SPLIT_DO_SET(r3)
94 cmpwi r4, 0
95 beq 46f
96 bl kvmhv_p9_set_lpcr
97 nop
9846:
99END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
100
101 ld r4, HSTATE_KVM_VCPU(r13)
102 bl kvmppc_hv_entry
103
104
105
106BEGIN_FTR_SECTION
107
108 ld r5,HSTATE_DABR(r13)
109 li r6,7
110 mtspr SPRN_DABR,r5
111 mtspr SPRN_DABRX,r6
112END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
113
114
115 ld r3,PACA_SPRG_VDSO(r13)
116 mtspr SPRN_SPRG_VDSO_WRITE,r3
117
118
119 bl kvmhv_load_host_pmu
120
121
122
123
124
125 ld r3, HSTATE_DECEXP(r13)
126 mftb r4
127 subf r4, r4, r3
128 mtspr SPRN_DEC, r4
129
130
131 li r0, 0
132 stb r0, HSTATE_HWTHREAD_REQ(r13)
133
134
135
136
137
138
139
140
141
142
143 ld r8, 112+PPC_LR_STKOFF(r1)
144 addi r1, r1, 112
145 ld r7, HSTATE_HOST_MSR(r13)
146
147
148 mr r3, r12
149
150
151
152
153
154
155 mfmsr r0
156 andi. r0, r0, MSR_IR
157 bne .Lvirt_return
158
159
160 mfmsr r6
161 li r0, MSR_RI
162 andc r6, r6, r0
163 mtmsrd r6, 1
164 mtsrr0 r8
165 mtsrr1 r7
166 RFI_TO_KERNEL
167
168
169.Lvirt_return:
170 mtlr r8
171 blr
172
173kvmppc_primary_no_guest:
174
175
176
177
178 mfspr r3, SPRN_HDEC
179 mtspr SPRN_DEC, r3
180
181
182
183
184
185 ld r5, HSTATE_KVM_VCORE(r13)
18665: lbz r0, VCORE_IN_GUEST(r5)
187 cmpwi r0, 0
188 beq 65b
189
190 ld r8,VCORE_LPCR(r5)
191 mtspr SPRN_LPCR,r8
192 isync
193
194 ld r5, HSTATE_KVM_VCORE(r13)
195 lbz r7, HSTATE_PTID(r13)
196 li r0, 1
197 sld r0, r0, r7
198 addi r6, r5, VCORE_NAPPING_THREADS
1991: lwarx r3, 0, r6
200 or r3, r3, r0
201 stwcx. r3, 0, r6
202 bne 1b
203
204 isync
205 li r12, 0
206 lwz r7, VCORE_ENTRY_EXIT(r5)
207 cmpwi r7, 0x100
208 bge kvm_novcpu_exit
209 li r3, NAPPING_NOVCPU
210 stb r3, HSTATE_NAPPING(r13)
211
212 li r3, 0
213 b kvm_do_nap
214
215
216
217
218
219
220
221
222kvm_novcpu_wakeup:
223 ld r1, HSTATE_HOST_R1(r13)
224 ld r5, HSTATE_KVM_VCORE(r13)
225 li r0, 0
226 stb r0, HSTATE_NAPPING(r13)
227
228
229 bl kvmppc_check_wake_reason
230
231
232
233
234
235
236 ld r5, HSTATE_KVM_VCORE(r13)
237
238
239 lwz r0, VCORE_ENTRY_EXIT(r5)
240 cmpwi r0, 0x100
241 bge kvm_novcpu_exit
242
243
244 lbz r7, HSTATE_PTID(r13)
245 li r0, 1
246 sld r0, r0, r7
247 addi r6, r5, VCORE_NAPPING_THREADS
2484: lwarx r7, 0, r6
249 andc r7, r7, r0
250 stwcx. r7, 0, r6
251 bne 4b
252
253
254 cmpdi r3, 0
255 bge kvm_novcpu_exit
256
257
258 mfspr r0, SPRN_HDEC
259 EXTEND_HDEC(r0)
260 li r12, BOOK3S_INTERRUPT_HV_DECREMENTER
261 cmpdi r0, 0
262 blt kvm_novcpu_exit
263
264
265 ld r4, HSTATE_KVM_VCPU(r13)
266 cmpdi r4, 0
267 beq kvmppc_primary_no_guest
268
269#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING
270 addi r3, r4, VCPU_TB_RMENTRY
271 bl kvmhv_start_timing
272#endif
273 b kvmppc_got_guest
274
275kvm_novcpu_exit:
276#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING
277 ld r4, HSTATE_KVM_VCPU(r13)
278 cmpdi r4, 0
279 beq 13f
280 addi r3, r4, VCPU_TB_RMEXIT
281 bl kvmhv_accumulate_time
282#endif
28313: mr r3, r12
284 stw r12, STACK_SLOT_TRAP(r1)
285 bl kvmhv_commence_exit
286 nop
287 b kvmhv_switch_to_host
288
289
290
291
292
293
294_GLOBAL(idle_kvm_start_guest)
295 ld r4,PACAEMERGSP(r13)
296 mfcr r5
297 mflr r0
298 std r1,0(r4)
299 std r5,8(r4)
300 std r0,16(r4)
301 subi r1,r4,STACK_FRAME_OVERHEAD
302 SAVE_NVGPRS(r1)
303
304
305
306
307
308 mtspr SPRN_SRR1,r3
309
310 li r0,0
311 stb r0,PACA_FTRACE_ENABLED(r13)
312
313 li r0,KVM_HWTHREAD_IN_KVM
314 stb r0,HSTATE_HWTHREAD_STATE(r13)
315
316
317 lbz r0,HSTATE_NAPPING(r13)
318 twnei r0,0
319
320 b 1f
321
322kvm_unsplit_wakeup:
323 li r0, 0
324 stb r0, HSTATE_NAPPING(r13)
325
3261:
327
328
329
330
331
332
333
334
335
336 bl kvmppc_check_wake_reason
337
338
339
340
341
342 cmpdi r3, 0
343 bge kvm_no_guest
344
345
346 ld r5,HSTATE_KVM_VCORE(r13)
347 cmpdi r5,0
348
349 beq kvm_no_guest
350
351kvm_secondary_got_guest:
352
353
354 ld r6, PACA_DSCR_DEFAULT(r13)
355 std r6, HSTATE_DSCR(r13)
356
357
358 lbz r4, HSTATE_PTID(r13)
359 cmpwi r4, 0
360 bne 63f
361 LOAD_REG_ADDR(r6, decrementer_max)
362 ld r6, 0(r6)
363 mtspr SPRN_HDEC, r6
364
365 ld r6, HSTATE_SPLIT_MODE(r13)
366 cmpdi r6, 0
367 beq 63f
368BEGIN_FTR_SECTION
369 ld r0, KVM_SPLIT_RPR(r6)
370 mtspr SPRN_RPR, r0
371 ld r0, KVM_SPLIT_PMMAR(r6)
372 mtspr SPRN_PMMAR, r0
373 ld r0, KVM_SPLIT_LDBAR(r6)
374 mtspr SPRN_LDBAR, r0
375 isync
376FTR_SECTION_ELSE
377
378 lwz r4, KVM_SPLIT_DO_SET(r6)
379 cmpwi r4, 0
380 beq 1f
381 mr r3, r6
382 bl kvmhv_p9_set_lpcr
383 nop
3841:
385ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_300)
38663:
387
388 lwsync
389 ld r4, HSTATE_KVM_VCPU(r13)
390 bl kvmppc_hv_entry
391
392
393
394 li r0, 0
395 std r0, HSTATE_KVM_VCPU(r13)
396
397
398
399
400
401
402 lwsync
403 std r0, HSTATE_KVM_VCORE(r13)
404
405
406
407
408
409
410
411
412 cmpwi r12, BOOK3S_INTERRUPT_HMI
413 bne kvm_no_guest
414
415 li r3,0
416 bl hmi_exception_realmode
417
418
419
420
421
422
423kvm_no_guest:
424 lbz r3, HSTATE_HWTHREAD_REQ(r13)
425 cmpwi r3, 0
426 bne 53f
427 HMT_MEDIUM
428 li r0, KVM_HWTHREAD_IN_KERNEL
429 stb r0, HSTATE_HWTHREAD_STATE(r13)
430
431 sync
432 lbz r3, HSTATE_HWTHREAD_REQ(r13)
433 cmpwi r3, 0
434 bne 54f
435
436
437
438
439
440 li r3, LPCR_PECE0
441 mfspr r4, SPRN_LPCR
442 rlwimi r4, r3, 0, LPCR_PECE0 | LPCR_PECE1
443 mtspr SPRN_LPCR, r4
444
445 mfspr r3,SPRN_SRR1
446 REST_NVGPRS(r1)
447 addi r1, r1, STACK_FRAME_OVERHEAD
448 ld r0, 16(r1)
449 ld r5, 8(r1)
450 ld r1, 0(r1)
451 mtlr r0
452 mtcr r5
453 blr
454
45553: HMT_LOW
456 ld r5, HSTATE_KVM_VCORE(r13)
457 cmpdi r5, 0
458 bne 60f
459 ld r3, HSTATE_SPLIT_MODE(r13)
460 cmpdi r3, 0
461 beq kvm_no_guest
462 lwz r0, KVM_SPLIT_DO_SET(r3)
463 cmpwi r0, 0
464 bne kvmhv_do_set
465 lwz r0, KVM_SPLIT_DO_RESTORE(r3)
466 cmpwi r0, 0
467 bne kvmhv_do_restore
468 lbz r0, KVM_SPLIT_DO_NAP(r3)
469 cmpwi r0, 0
470 beq kvm_no_guest
471 HMT_MEDIUM
472 b kvm_unsplit_nap
47360: HMT_MEDIUM
474 b kvm_secondary_got_guest
475
47654: li r0, KVM_HWTHREAD_IN_KVM
477 stb r0, HSTATE_HWTHREAD_STATE(r13)
478 b kvm_no_guest
479
480kvmhv_do_set:
481
482 HMT_MEDIUM
483 bl kvmhv_p9_set_lpcr
484 nop
485 b kvm_no_guest
486
487kvmhv_do_restore:
488 HMT_MEDIUM
489 bl kvmhv_p9_restore_lpcr
490 nop
491 b kvm_no_guest
492
493
494
495
496
497kvm_unsplit_nap:
498
499
500
501
502
503
504
505
506
507
508
509 cmpwi r12, BOOK3S_INTERRUPT_HMI
510 bne 55f
511 li r3, 0
512 bl hmi_exception_realmode
51355:
514
515
516
517
518 sync
519 ld r0, HSTATE_KVM_VCORE(r13)
520 cmpdi r0, 0
521 bne kvm_no_guest
522
523BEGIN_FTR_SECTION
524 lis r6, (PPC_DBELL_SERVER << (63-36))@h
525 PPC_MSGCLR(6)
526END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
527
528 ld r3, HSTATE_SPLIT_MODE(r13)
529 li r0, 1
530 lbz r4, HSTATE_TID(r13)
531 addi r4, r4, KVM_SPLIT_NAPPED
532 stbx r0, r3, r4
533
534 sync
535 lbz r0, KVM_SPLIT_DO_NAP(r3)
536 cmpwi r0, 0
537 beq 57f
538 li r3, NAPPING_UNSPLIT
539 stb r3, HSTATE_NAPPING(r13)
540 li r3, (LPCR_PECEDH | LPCR_PECE0) >> 4
541 mfspr r5, SPRN_LPCR
542 rlwimi r5, r3, 4, (LPCR_PECEDP | LPCR_PECEDH | LPCR_PECE0 | LPCR_PECE1)
543 b kvm_nap_sequence
544
54557: li r0, 0
546 stbx r0, r3, r4
547 b kvm_no_guest
548
549
550
551
552
553
554
555.global kvmppc_hv_entry
556kvmppc_hv_entry:
557
558
559
560
561
562
563
564
565
566
567
568 mflr r0
569 std r0, PPC_LR_STKOFF(r1)
570 stdu r1, -SFS(r1)
571
572
573 std r1, HSTATE_HOST_R1(r13)
574
575 li r6, KVM_GUEST_MODE_HOST_HV
576 stb r6, HSTATE_IN_GUEST(r13)
577
578#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING
579
580 cmpdi r4, 0
581 beq 1f
582 addi r3, r4, VCPU_TB_RMENTRY
583 bl kvmhv_start_timing
5841:
585#endif
586
587 ld r5, HSTATE_KVM_VCORE(r13)
588 ld r9, VCORE_KVM(r5)
589
590
591
592
593
594
595
596 li r7, 1
597 lbz r6, HSTATE_PTID(r13)
598 sld r7, r7, r6
599 addi r8, r5, VCORE_ENTRY_EXIT
60021: lwarx r3, 0, r8
601 cmpwi r3, 0x100
602 bge secondary_too_late
603 or r3, r3, r7
604 stwcx. r3, 0, r8
605 bne 21b
606
607
608 cmpwi r6,0
609 bne 10f
610
611 lwz r7,KVM_LPID(r9)
612BEGIN_FTR_SECTION
613 ld r6,KVM_SDR1(r9)
614 li r0,LPID_RSVD
615 mtspr SPRN_LPID,r0
616 ptesync
617 mtspr SPRN_SDR1,r6
618END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300)
619 mtspr SPRN_LPID,r7
620 isync
621
622
623 mr r3, r9
624 lhz r4, PACAPACAINDEX(r13)
625 li r5, 0
626 bl kvmppc_check_need_tlb_flush
627 nop
628 ld r5, HSTATE_KVM_VCORE(r13)
629
630
63122: ld r8,VCORE_TB_OFFSET(r5)
632 cmpdi r8,0
633 beq 37f
634 std r8, VCORE_TB_OFFSET_APPL(r5)
635 mftb r6
636 add r8,r8,r6
637 mtspr SPRN_TBU40,r8
638 mftb r7
639 clrldi r6,r6,40
640 clrldi r7,r7,40
641 cmpld r7,r6
642 bge 37f
643 addis r8,r8,0x100
644 mtspr SPRN_TBU40,r8
645
646
64737: ld r7, VCORE_PCR(r5)
648 LOAD_REG_IMMEDIATE(r6, PCR_MASK)
649 cmpld r7, r6
650 beq 38f
651 or r7, r7, r6
652 mtspr SPRN_PCR, r7
65338:
654
655BEGIN_FTR_SECTION
656
657 ld r8, VCORE_DPDES(r5)
658 ld r7, VCORE_VTB(r5)
659 mtspr SPRN_DPDES, r8
660 mtspr SPRN_VTB, r7
661END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
662
663
664 bl kvmppc_subcore_enter_guest
665 nop
666 ld r5, HSTATE_KVM_VCORE(r13)
667 ld r4, HSTATE_KVM_VCPU(r13)
668 li r0,1
669 stb r0,VCORE_IN_GUEST(r5)
670
671
67210: cmpdi r4, 0
673 beq kvmppc_primary_no_guest
674kvmppc_got_guest:
675
676 ld r3, VCPU_VPA(r4)
677 cmpdi r3, 0
678 beq 25f
679 li r6, LPPACA_YIELDCOUNT
680 LWZX_BE r5, r3, r6
681 addi r5, r5, 1
682 STWX_BE r5, r3, r6
683 li r6, 1
684 stb r6, VCPU_VPA_DIRTY(r4)
68525:
686
687
688 mfspr r5,SPRN_PURR
689 mfspr r6,SPRN_SPURR
690 std r5,HSTATE_PURR(r13)
691 std r6,HSTATE_SPURR(r13)
692 ld r7,VCPU_PURR(r4)
693 ld r8,VCPU_SPURR(r4)
694 mtspr SPRN_PURR,r7
695 mtspr SPRN_SPURR,r8
696
697
698BEGIN_FTR_SECTION
699 mfspr r5, SPRN_TIDR
700 mfspr r6, SPRN_PSSCR
701 mfspr r7, SPRN_PID
702 std r5, STACK_SLOT_TID(r1)
703 std r6, STACK_SLOT_PSSCR(r1)
704 std r7, STACK_SLOT_PID(r1)
705 mfspr r5, SPRN_HFSCR
706 std r5, STACK_SLOT_HFSCR(r1)
707END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
708BEGIN_FTR_SECTION
709 mfspr r5, SPRN_CIABR
710 mfspr r6, SPRN_DAWR0
711 mfspr r7, SPRN_DAWRX0
712 mfspr r8, SPRN_IAMR
713 std r5, STACK_SLOT_CIABR(r1)
714 std r6, STACK_SLOT_DAWR(r1)
715 std r7, STACK_SLOT_DAWRX(r1)
716 std r8, STACK_SLOT_IAMR(r1)
717END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
718
719 mfspr r5, SPRN_AMR
720 std r5, STACK_SLOT_AMR(r1)
721 mfspr r6, SPRN_UAMOR
722 std r6, STACK_SLOT_UAMOR(r1)
723
724BEGIN_FTR_SECTION
725
726
727 lwz r5,VCPU_DABRX(r4)
728 ld r6,VCPU_DABR(r4)
729 mtspr SPRN_DABRX,r5
730 mtspr SPRN_DABR,r6
731 isync
732END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
733
734#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
735
736
737
738
739BEGIN_FTR_SECTION
740 b 91f
741END_FTR_SECTION(CPU_FTR_TM | CPU_FTR_P9_TM_HV_ASSIST, 0)
742
743
744
745 mr r3, r4
746 ld r4, VCPU_MSR(r3)
747 li r5, 0
748 bl kvmppc_restore_tm_hv
749 nop
750 ld r4, HSTATE_KVM_VCPU(r13)
75191:
752#endif
753
754
755 mr r3, r4
756 bl kvmhv_load_guest_pmu
757
758
759 ld r4, HSTATE_KVM_VCPU(r13)
760 bl kvmppc_load_fp
761
762 ld r14, VCPU_GPR(R14)(r4)
763 ld r15, VCPU_GPR(R15)(r4)
764 ld r16, VCPU_GPR(R16)(r4)
765 ld r17, VCPU_GPR(R17)(r4)
766 ld r18, VCPU_GPR(R18)(r4)
767 ld r19, VCPU_GPR(R19)(r4)
768 ld r20, VCPU_GPR(R20)(r4)
769 ld r21, VCPU_GPR(R21)(r4)
770 ld r22, VCPU_GPR(R22)(r4)
771 ld r23, VCPU_GPR(R23)(r4)
772 ld r24, VCPU_GPR(R24)(r4)
773 ld r25, VCPU_GPR(R25)(r4)
774 ld r26, VCPU_GPR(R26)(r4)
775 ld r27, VCPU_GPR(R27)(r4)
776 ld r28, VCPU_GPR(R28)(r4)
777 ld r29, VCPU_GPR(R29)(r4)
778 ld r30, VCPU_GPR(R30)(r4)
779 ld r31, VCPU_GPR(R31)(r4)
780
781
782 ld r5, VCPU_DSCR(r4)
783 mtspr SPRN_DSCR, r5
784
785BEGIN_FTR_SECTION
786
787 b 8f
788END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
789
790 ld r5, VCPU_IAMR(r4)
791 lwz r6, VCPU_PSPB(r4)
792 ld r7, VCPU_FSCR(r4)
793 mtspr SPRN_IAMR, r5
794 mtspr SPRN_PSPB, r6
795 mtspr SPRN_FSCR, r7
796
797
798
799
800 LOAD_REG_ADDR(r5, dawr_force_enable)
801 lbz r5, 0(r5)
802 cmpdi r5, 0
803 beq 1f
804 ld r5, VCPU_DAWR(r4)
805 ld r6, VCPU_DAWRX(r4)
806 mtspr SPRN_DAWR0, r5
807 mtspr SPRN_DAWRX0, r6
8081:
809 ld r7, VCPU_CIABR(r4)
810 ld r8, VCPU_TAR(r4)
811 mtspr SPRN_CIABR, r7
812 mtspr SPRN_TAR, r8
813 ld r5, VCPU_IC(r4)
814 ld r8, VCPU_EBBHR(r4)
815 mtspr SPRN_IC, r5
816 mtspr SPRN_EBBHR, r8
817 ld r5, VCPU_EBBRR(r4)
818 ld r6, VCPU_BESCR(r4)
819 lwz r7, VCPU_GUEST_PID(r4)
820 ld r8, VCPU_WORT(r4)
821 mtspr SPRN_EBBRR, r5
822 mtspr SPRN_BESCR, r6
823 mtspr SPRN_PID, r7
824 mtspr SPRN_WORT, r8
825BEGIN_FTR_SECTION
826
827 ld r5, VCPU_TCSCR(r4)
828 ld r6, VCPU_ACOP(r4)
829 ld r7, VCPU_CSIGR(r4)
830 ld r8, VCPU_TACR(r4)
831 mtspr SPRN_TCSCR, r5
832 mtspr SPRN_ACOP, r6
833 mtspr SPRN_CSIGR, r7
834 mtspr SPRN_TACR, r8
835 nop
836FTR_SECTION_ELSE
837
838 ld r5, VCPU_TID(r4)
839 ld r6, VCPU_PSSCR(r4)
840 lbz r8, HSTATE_FAKE_SUSPEND(r13)
841 oris r6, r6, PSSCR_EC@h
842 rldimi r6, r8, PSSCR_FAKE_SUSPEND_LG, 63 - PSSCR_FAKE_SUSPEND_LG
843 ld r7, VCPU_HFSCR(r4)
844 mtspr SPRN_TIDR, r5
845 mtspr SPRN_PSSCR, r6
846 mtspr SPRN_HFSCR, r7
847ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_300)
8488:
849
850 ld r5, VCPU_SPRG0(r4)
851 ld r6, VCPU_SPRG1(r4)
852 ld r7, VCPU_SPRG2(r4)
853 ld r8, VCPU_SPRG3(r4)
854 mtspr SPRN_SPRG0, r5
855 mtspr SPRN_SPRG1, r6
856 mtspr SPRN_SPRG2, r7
857 mtspr SPRN_SPRG3, r8
858
859
860 ld r5, VCPU_DAR(r4)
861 lwz r6, VCPU_DSISR(r4)
862 mtspr SPRN_DAR, r5
863 mtspr SPRN_DSISR, r6
864
865
866 ld r5,VCPU_AMR(r4)
867 ld r6,VCPU_UAMOR(r4)
868 li r7,-1
869 mtspr SPRN_AMR,r5
870 mtspr SPRN_UAMOR,r6
871 mtspr SPRN_AMOR,r7
872
873
874 lwz r5,VCPU_CTRL(r4)
875 andi. r5,r5,1
876 bne 4f
877 mfspr r6,SPRN_CTRLF
878 clrrdi r6,r6,1
879 mtspr SPRN_CTRLT,r6
8804:
881
882 ld r5, HSTATE_KVM_VCORE(r13)
883 lbz r6, HSTATE_PTID(r13)
884 cmpwi r6, 0
885 beq 21f
886 lbz r0, VCORE_IN_GUEST(r5)
887 cmpwi r0, 0
888 bne 21f
889 HMT_LOW
89020: lwz r3, VCORE_ENTRY_EXIT(r5)
891 cmpwi r3, 0x100
892 bge no_switch_exit
893 lbz r0, VCORE_IN_GUEST(r5)
894 cmpwi r0, 0
895 beq 20b
896 HMT_MEDIUM
89721:
898
899 ld r8,VCORE_LPCR(r5)
900 mtspr SPRN_LPCR,r8
901 isync
902
903
904
905
906 ld r8,VCPU_DEC_EXPIRES(r4)
907
908 ld r5,HSTATE_KVM_VCORE(r13)
909 ld r6,VCORE_TB_OFFSET_APPL(r5)
910 add r8,r8,r6
911 mftb r7
912 subf r3,r7,r8
913 mtspr SPRN_DEC,r3
914
915
916 mfspr r3, SPRN_HDEC
917 EXTEND_HDEC(r3)
918 cmpdi r3, 512
919 blt hdec_soon
920
921
922 ld r6, VCPU_KVM(r4)
923 lbz r0, KVM_RADIX(r6)
924 cmpwi r0, 0
925 bne 9f
926 li r6, 0
927 slbmte r6, r6
928 slbia
929 ptesync
930
931
932 lwz r5,VCPU_SLB_MAX(r4)
933 cmpwi r5,0
934 beq 9f
935 mtctr r5
936 addi r6,r4,VCPU_SLB
9371: ld r8,VCPU_SLB_E(r6)
938 ld r9,VCPU_SLB_V(r6)
939 slbmte r9,r8
940 addi r6,r6,VCPU_SLB_SIZE
941 bdnz 1b
9429:
943
944#ifdef CONFIG_KVM_XICS
945
946 ld r11, VCPU_XIVE_SAVED_STATE(r4)
947 li r9, TM_QW1_OS
948 lwz r8, VCPU_XIVE_CAM_WORD(r4)
949 cmpwi r8, 0
950 beq no_xive
951 li r7, TM_QW1_OS + TM_WORD2
952 mfmsr r0
953 andi. r0, r0, MSR_DR
954 beq 2f
955 ld r10, HSTATE_XIVE_TIMA_VIRT(r13)
956 cmpldi cr1, r10, 0
957 beq cr1, no_xive
958 eieio
959 stdx r11,r9,r10
960 stwx r8,r7,r10
961 b 3f
9622: ld r10, HSTATE_XIVE_TIMA_PHYS(r13)
963 cmpldi cr1, r10, 0
964 beq cr1, no_xive
965 eieio
966 stdcix r11,r9,r10
967 stwcix r8,r7,r10
9683: li r9, 1
969 stb r9, VCPU_XIVE_PUSHED(r4)
970 eieio
971
972
973
974
975
976
977
978
979 li r0,0
980 stb r0, VCPU_IRQ_PENDING(r4)
981
982
983
984
985
986 lbz r0, VCPU_XIVE_ESC_ON(r4)
987 cmpwi cr1, r0,0
988 beq cr1, 1f
989 li r9, XIVE_ESB_SET_PQ_01
990 beq 4f
991 ld r10, VCPU_XIVE_ESC_VADDR(r4)
992 ldx r0, r10, r9
993 b 5f
9944: ld r10, VCPU_XIVE_ESC_RADDR(r4)
995 ldcix r0, r10, r9
9965: sync
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013 andi. r0, r0, XIVE_ESB_VAL_P
1014 bne- 1f
1015
1016
1017 li r0, 0
1018 stb r0, VCPU_XIVE_ESC_ON(r4)
10191:
1020no_xive:
1021#endif
1022
1023 li r0, 0
1024 stw r0, STACK_SLOT_SHORT_PATH(r1)
1025
1026deliver_guest_interrupt:
1027
1028 ld r0, VCPU_PENDING_EXC(r4)
1029BEGIN_FTR_SECTION
1030
1031 lbz r3, VCPU_DBELL_REQ(r4)
1032 or r0, r0, r3
1033END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
1034 cmpdi r0, 0
1035 beq 71f
1036 mr r3, r4
1037 bl kvmppc_guest_entry_inject_int
1038 ld r4, HSTATE_KVM_VCPU(r13)
103971:
1040 ld r6, VCPU_SRR0(r4)
1041 ld r7, VCPU_SRR1(r4)
1042 mtspr SPRN_SRR0, r6
1043 mtspr SPRN_SRR1, r7
1044
1045fast_guest_entry_c:
1046 ld r10, VCPU_PC(r4)
1047 ld r11, VCPU_MSR(r4)
1048
1049 rldicl r11, r11, 63 - MSR_HV_LG, 1
1050 rotldi r11, r11, 1 + MSR_HV_LG
1051 ori r11, r11, MSR_ME
1052
1053 ld r6, VCPU_CTR(r4)
1054 ld r7, VCPU_XER(r4)
1055 mtctr r6
1056 mtxer r7
1057
1058
1059
1060
1061
1062
1063
1064
1065fast_guest_return:
1066 li r0,0
1067 stb r0,VCPU_CEDED(r4)
1068 mtspr SPRN_HSRR0,r10
1069 mtspr SPRN_HSRR1,r11
1070
1071
1072 li r9, KVM_GUEST_MODE_GUEST_HV
1073 stb r9, HSTATE_IN_GUEST(r13)
1074
1075#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING
1076
1077 addi r3, r4, VCPU_TB_GUEST
1078 bl kvmhv_accumulate_time
1079#endif
1080
1081
1082
1083BEGIN_FTR_SECTION
1084 ld r5, VCPU_CFAR(r4)
1085 mtspr SPRN_CFAR, r5
1086END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
1087BEGIN_FTR_SECTION
1088 ld r0, VCPU_PPR(r4)
1089END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
1090
1091 ld r5, VCPU_LR(r4)
1092 mtlr r5
1093
1094 ld r1, VCPU_GPR(R1)(r4)
1095 ld r5, VCPU_GPR(R5)(r4)
1096 ld r8, VCPU_GPR(R8)(r4)
1097 ld r9, VCPU_GPR(R9)(r4)
1098 ld r10, VCPU_GPR(R10)(r4)
1099 ld r11, VCPU_GPR(R11)(r4)
1100 ld r12, VCPU_GPR(R12)(r4)
1101 ld r13, VCPU_GPR(R13)(r4)
1102
1103BEGIN_FTR_SECTION
1104 mtspr SPRN_PPR, r0
1105END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
1106
1107
1108BEGIN_FTR_SECTION
1109 li r0, 0x7fff
1110 mtspr SPRN_HDSISR, r0
1111END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
1112
1113 ld r6, VCPU_KVM(r4)
1114 lbz r7, KVM_SECURE_GUEST(r6)
1115 cmpdi r7, 0
1116 ld r6, VCPU_GPR(R6)(r4)
1117 ld r7, VCPU_GPR(R7)(r4)
1118 bne ret_to_ultra
1119
1120 ld r0, VCPU_CR(r4)
1121 mtcr r0
1122
1123 ld r0, VCPU_GPR(R0)(r4)
1124 ld r2, VCPU_GPR(R2)(r4)
1125 ld r3, VCPU_GPR(R3)(r4)
1126 ld r4, VCPU_GPR(R4)(r4)
1127 HRFI_TO_GUEST
1128 b .
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139ret_to_ultra:
1140 ld r0, VCPU_CR(r4)
1141 mtcr r0
1142
1143 ld r0, VCPU_GPR(R3)(r4)
1144 mfspr r2, SPRN_SRR1
1145 li r3, 0
1146 ori r3, r3, UV_RETURN
1147 ld r4, VCPU_GPR(R4)(r4)
1148 sc 2
1149
1150
1151
1152
1153
1154
1155
1156
1157_GLOBAL(__kvmhv_vcpu_entry_p9)
1158EXPORT_SYMBOL_GPL(__kvmhv_vcpu_entry_p9)
1159 mflr r0
1160 std r0, PPC_LR_STKOFF(r1)
1161 stdu r1, -SFS(r1)
1162
1163 li r0, 1
1164 stw r0, STACK_SLOT_SHORT_PATH(r1)
1165
1166 std r3, HSTATE_KVM_VCPU(r13)
1167 mfcr r4
1168 stw r4, SFS+8(r1)
1169
1170 std r1, HSTATE_HOST_R1(r13)
1171
1172 reg = 14
1173 .rept 18
1174 std reg, STACK_SLOT_NVGPRS + ((reg - 14) * 8)(r1)
1175 reg = reg + 1
1176 .endr
1177
1178 reg = 14
1179 .rept 18
1180 ld reg, __VCPU_GPR(reg)(r3)
1181 reg = reg + 1
1182 .endr
1183
1184 mfmsr r10
1185 std r10, HSTATE_HOST_MSR(r13)
1186
1187 mr r4, r3
1188 b fast_guest_entry_c
1189guest_exit_short_path:
1190
1191 li r0, KVM_GUEST_MODE_NONE
1192 stb r0, HSTATE_IN_GUEST(r13)
1193
1194 reg = 14
1195 .rept 18
1196 std reg, __VCPU_GPR(reg)(r9)
1197 reg = reg + 1
1198 .endr
1199
1200 reg = 14
1201 .rept 18
1202 ld reg, STACK_SLOT_NVGPRS + ((reg - 14) * 8)(r1)
1203 reg = reg + 1
1204 .endr
1205
1206 lwz r4, SFS+8(r1)
1207 mtcr r4
1208
1209 mr r3, r12
1210
1211 addi r1, r1, SFS
1212 ld r0, PPC_LR_STKOFF(r1)
1213 mtlr r0
1214
1215
1216 mfmsr r4
1217 andi. r5, r4, MSR_IR
1218 bnelr
1219 rldicl r5, r4, 64 - MSR_TS_S_LG, 62
1220 mtspr SPRN_SRR0, r0
1221 ld r10, HSTATE_HOST_MSR(r13)
1222 rldimi r10, r5, MSR_TS_S_LG, 63 - MSR_TS_T_LG
1223 mtspr SPRN_SRR1, r10
1224 RFI_TO_KERNEL
1225 b .
1226
1227secondary_too_late:
1228 li r12, 0
1229 stw r12, STACK_SLOT_TRAP(r1)
1230 cmpdi r4, 0
1231 beq 11f
1232 stw r12, VCPU_TRAP(r4)
1233#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING
1234 addi r3, r4, VCPU_TB_RMEXIT
1235 bl kvmhv_accumulate_time
1236#endif
123711: b kvmhv_switch_to_host
1238
1239no_switch_exit:
1240 HMT_MEDIUM
1241 li r12, 0
1242 b 12f
1243hdec_soon:
1244 li r12, BOOK3S_INTERRUPT_HV_DECREMENTER
124512: stw r12, VCPU_TRAP(r4)
1246 mr r9, r4
1247#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING
1248 addi r3, r4, VCPU_TB_RMEXIT
1249 bl kvmhv_accumulate_time
1250#endif
1251 b guest_bypass
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262 .globl kvmppc_interrupt_hv
1263kvmppc_interrupt_hv:
1264
1265
1266
1267
1268
1269
1270
1271 std r9, HSTATE_SCRATCH2(r13)
1272 lbz r9, HSTATE_IN_GUEST(r13)
1273 cmpwi r9, KVM_GUEST_MODE_HOST_HV
1274 beq kvmppc_bad_host_intr
1275#ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
1276 cmpwi r9, KVM_GUEST_MODE_GUEST
1277 ld r9, HSTATE_SCRATCH2(r13)
1278 beq kvmppc_interrupt_pr
1279#endif
1280
1281 li r9, KVM_GUEST_MODE_HOST_HV
1282 stb r9, HSTATE_IN_GUEST(r13)
1283
1284 ld r9, HSTATE_KVM_VCPU(r13)
1285
1286
1287
1288 std r0, VCPU_GPR(R0)(r9)
1289 std r1, VCPU_GPR(R1)(r9)
1290 std r2, VCPU_GPR(R2)(r9)
1291 std r3, VCPU_GPR(R3)(r9)
1292 std r4, VCPU_GPR(R4)(r9)
1293 std r5, VCPU_GPR(R5)(r9)
1294 std r6, VCPU_GPR(R6)(r9)
1295 std r7, VCPU_GPR(R7)(r9)
1296 std r8, VCPU_GPR(R8)(r9)
1297 ld r0, HSTATE_SCRATCH2(r13)
1298 std r0, VCPU_GPR(R9)(r9)
1299 std r10, VCPU_GPR(R10)(r9)
1300 std r11, VCPU_GPR(R11)(r9)
1301 ld r3, HSTATE_SCRATCH0(r13)
1302 std r3, VCPU_GPR(R12)(r9)
1303
1304 srdi r4, r12, 32
1305 std r4, VCPU_CR(r9)
1306BEGIN_FTR_SECTION
1307 ld r3, HSTATE_CFAR(r13)
1308 std r3, VCPU_CFAR(r9)
1309END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
1310BEGIN_FTR_SECTION
1311 ld r4, HSTATE_PPR(r13)
1312 std r4, VCPU_PPR(r9)
1313END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
1314
1315
1316 ld r1, HSTATE_HOST_R1(r13)
1317 ld r2, PACATOC(r13)
1318
1319 mfspr r10, SPRN_SRR0
1320 mfspr r11, SPRN_SRR1
1321 std r10, VCPU_SRR0(r9)
1322 std r11, VCPU_SRR1(r9)
1323
1324 clrldi r12, r12, 32
1325 andi. r0, r12, 2
1326 beq 1f
1327 mfspr r10, SPRN_HSRR0
1328 mfspr r11, SPRN_HSRR1
1329 clrrdi r12, r12, 2
13301: std r10, VCPU_PC(r9)
1331 std r11, VCPU_MSR(r9)
1332
1333 GET_SCRATCH0(r3)
1334 mflr r4
1335 std r3, VCPU_GPR(R13)(r9)
1336 std r4, VCPU_LR(r9)
1337
1338 stw r12,VCPU_TRAP(r9)
1339
1340
1341
1342
1343
1344
1345
1346 li r0, MSR_RI
1347 mtmsrd r0, 1
1348
1349#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING
1350 addi r3, r9, VCPU_TB_RMINTR
1351 mr r4, r9
1352 bl kvmhv_accumulate_time
1353 ld r5, VCPU_GPR(R5)(r9)
1354 ld r6, VCPU_GPR(R6)(r9)
1355 ld r7, VCPU_GPR(R7)(r9)
1356 ld r8, VCPU_GPR(R8)(r9)
1357#endif
1358
1359
1360
1361 li r3,KVM_INST_FETCH_FAILED
1362 stw r3,VCPU_LAST_INST(r9)
1363 cmpwi r12,BOOK3S_INTERRUPT_H_EMUL_ASSIST
1364 bne 11f
1365 mfspr r3,SPRN_HEIR
136611: stw r3,VCPU_HEIR(r9)
1367
1368
1369 mfctr r3
1370 mfxer r4
1371 std r3, VCPU_CTR(r9)
1372 std r4, VCPU_XER(r9)
1373
1374
1375 mfdar r3
1376 mfdsisr r4
1377 std r3, VCPU_DAR(r9)
1378 stw r4, VCPU_DSISR(r9)
1379
1380
1381 cmpwi r12, BOOK3S_INTERRUPT_H_DATA_STORAGE
1382 beq kvmppc_hdsi
1383 std r3, VCPU_FAULT_DAR(r9)
1384 stw r4, VCPU_FAULT_DSISR(r9)
1385 cmpwi r12, BOOK3S_INTERRUPT_H_INST_STORAGE
1386 beq kvmppc_hisi
1387
1388#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1389
1390 cmpwi r12, BOOK3S_INTERRUPT_HV_SOFTPATCH
1391 beq kvmppc_tm_emul
1392#endif
1393
1394
1395 cmpwi r12,BOOK3S_INTERRUPT_HV_DECREMENTER
1396 bne 2f
1397 mfspr r3,SPRN_HDEC
1398 EXTEND_HDEC(r3)
1399 cmpdi r3,0
1400 mr r4,r9
1401 bge fast_guest_return
14022:
1403
1404 cmpwi r12,BOOK3S_INTERRUPT_SYSCALL
1405 beq hcall_try_real_mode
1406
1407
1408 cmpwi r12, BOOK3S_INTERRUPT_H_DOORBELL
1409 bne 3f
1410BEGIN_FTR_SECTION
1411 PPC_MSGSYNC
1412 lwsync
1413
1414 ld r0, VCPU_NESTED(r9)
1415 cmpdi r0, 0
1416 bne guest_exit_cont
1417END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
1418 lbz r0, HSTATE_HOST_IPI(r13)
1419 cmpwi r0, 0
1420 beq maybe_reenter_guest
1421 b guest_exit_cont
14223:
1423
1424 cmpwi r12, BOOK3S_INTERRUPT_H_FAC_UNAVAIL
1425 bne 14f
1426 mfspr r3, SPRN_HFSCR
1427 std r3, VCPU_HFSCR(r9)
1428 b guest_exit_cont
142914:
1430
1431 cmpwi r12, BOOK3S_INTERRUPT_EXTERNAL
1432 beq kvmppc_guest_external
1433
1434 cmpwi r12, BOOK3S_INTERRUPT_MACHINE_CHECK
1435 beq machine_check_realmode
1436
1437 cmpwi r12, BOOK3S_INTERRUPT_HMI
1438 beq hmi_realmode
1439
1440guest_exit_cont:
1441
1442#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING
1443 addi r3, r9, VCPU_TB_RMEXIT
1444 mr r4, r9
1445 bl kvmhv_accumulate_time
1446#endif
1447#ifdef CONFIG_KVM_XICS
1448
1449 lbz r0, VCPU_XIVE_PUSHED(r9)
1450 cmpwi cr0, r0, 0
1451 beq 1f
1452 li r7, TM_SPC_PULL_OS_CTX
1453 li r6, TM_QW1_OS
1454 mfmsr r0
1455 andi. r0, r0, MSR_DR
1456 beq 2f
1457 ld r10, HSTATE_XIVE_TIMA_VIRT(r13)
1458 cmpldi cr0, r10, 0
1459 beq 1f
1460
1461 eieio
1462 lwzx r11, r7, r10
1463
1464 ldx r11, r6, r10
1465 b 3f
14662: ld r10, HSTATE_XIVE_TIMA_PHYS(r13)
1467 cmpldi cr0, r10, 0
1468 beq 1f
1469
1470 eieio
1471 lwzcix r11, r7, r10
1472
1473 ldcix r11, r6, r10
14743: std r11, VCPU_XIVE_SAVED_STATE(r9)
1475
1476 li r10, 0
1477 li r0, 0xff
1478 stb r10, VCPU_XIVE_PUSHED(r9)
1479 stb r10, (VCPU_XIVE_SAVED_STATE+3)(r9)
1480 stb r0, (VCPU_XIVE_SAVED_STATE+4)(r9)
1481 eieio
14821:
1483#endif
1484
1485
1486
1487
1488
14891: nop
1490 patch_site 1b patch__call_kvm_flush_link_stack
1491
1492
1493 lwz r0, STACK_SLOT_SHORT_PATH(r1)
1494 cmpwi r0, 0
1495 bne guest_exit_short_path
1496
1497
1498 ld r5, VCPU_KVM(r9)
1499 lbz r0, KVM_RADIX(r5)
1500 li r5, 0
1501 cmpwi r0, 0
1502 bne 3f
1503 lwz r0,VCPU_SLB_NR(r9)
1504 mtctr r0
1505 li r6,0
1506 addi r7,r9,VCPU_SLB
15071: slbmfee r8,r6
1508 andis. r0,r8,SLB_ESID_V@h
1509 beq 2f
1510 add r8,r8,r6
1511 slbmfev r3,r6
1512 std r8,VCPU_SLB_E(r7)
1513 std r3,VCPU_SLB_V(r7)
1514 addi r7,r7,VCPU_SLB_SIZE
1515 addi r5,r5,1
15162: addi r6,r6,1
1517 bdnz 1b
1518
1519 li r0,0
1520 slbmte r0,r0
1521 slbia
1522 ptesync
15233: stw r5,VCPU_SLB_MAX(r9)
1524
1525
1526BEGIN_MMU_FTR_SECTION
1527 b 0f
1528END_MMU_FTR_SECTION_IFSET(MMU_FTR_TYPE_RADIX)
1529 ld r8,PACA_SLBSHADOWPTR(r13)
1530
1531 .rept SLB_NUM_BOLTED
1532 li r3, SLBSHADOW_SAVEAREA
1533 LDX_BE r5, r8, r3
1534 addi r3, r3, 8
1535 LDX_BE r6, r8, r3
1536 andis. r7,r5,SLB_ESID_V@h
1537 beq 1f
1538 slbmte r6,r5
15391: addi r8,r8,16
1540 .endr
15410:
1542
1543guest_bypass:
1544 stw r12, STACK_SLOT_TRAP(r1)
1545
1546
1547
1548 ld r3, HSTATE_KVM_VCORE(r13)
1549 mfspr r5,SPRN_DEC
1550 mftb r6
1551
1552BEGIN_FTR_SECTION
1553 ld r4, VCORE_LPCR(r3)
1554 andis. r4, r4, LPCR_LD@h
1555 bne 16f
1556END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
1557 extsw r5,r5
155816: add r5,r5,r6
1559
1560 ld r4,VCORE_TB_OFFSET_APPL(r3)
1561 subf r5,r4,r5
1562 std r5,VCPU_DEC_EXPIRES(r9)
1563
1564
1565 mr r3, r12
1566 bl kvmhv_commence_exit
1567 nop
1568 ld r9, HSTATE_KVM_VCPU(r13)
1569
1570
1571 li r0, -1
1572 stw r0, VCPU_CPU(r9)
1573 stw r0, VCPU_THREAD_CPU(r9)
1574
1575
1576 mfspr r6,SPRN_CTRLF
1577 stw r6,VCPU_CTRL(r9)
1578 andi. r0,r6,1
1579 bne 4f
1580 ori r6,r6,1
1581 mtspr SPRN_CTRLT,r6
15824:
1583
1584
1585
1586 mfspr r5,SPRN_PURR
1587 mfspr r6,SPRN_SPURR
1588 ld r7,VCPU_PURR(r9)
1589 ld r8,VCPU_SPURR(r9)
1590 std r5,VCPU_PURR(r9)
1591 std r6,VCPU_SPURR(r9)
1592 subf r5,r7,r5
1593 subf r6,r8,r6
1594
1595
1596
1597
1598
1599 ld r3,HSTATE_PURR(r13)
1600 ld r4,HSTATE_SPURR(r13)
1601 add r3,r3,r5
1602 add r4,r4,r6
1603 mtspr SPRN_PURR,r3
1604 mtspr SPRN_SPURR,r4
1605
1606BEGIN_FTR_SECTION
1607 b 8f
1608END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
1609
1610 mfspr r5, SPRN_IAMR
1611 mfspr r6, SPRN_PSPB
1612 mfspr r7, SPRN_FSCR
1613 std r5, VCPU_IAMR(r9)
1614 stw r6, VCPU_PSPB(r9)
1615 std r7, VCPU_FSCR(r9)
1616 mfspr r5, SPRN_IC
1617 mfspr r7, SPRN_TAR
1618 std r5, VCPU_IC(r9)
1619 std r7, VCPU_TAR(r9)
1620 mfspr r8, SPRN_EBBHR
1621 std r8, VCPU_EBBHR(r9)
1622 mfspr r5, SPRN_EBBRR
1623 mfspr r6, SPRN_BESCR
1624 mfspr r7, SPRN_PID
1625 mfspr r8, SPRN_WORT
1626 std r5, VCPU_EBBRR(r9)
1627 std r6, VCPU_BESCR(r9)
1628 stw r7, VCPU_GUEST_PID(r9)
1629 std r8, VCPU_WORT(r9)
1630BEGIN_FTR_SECTION
1631 mfspr r5, SPRN_TCSCR
1632 mfspr r6, SPRN_ACOP
1633 mfspr r7, SPRN_CSIGR
1634 mfspr r8, SPRN_TACR
1635 std r5, VCPU_TCSCR(r9)
1636 std r6, VCPU_ACOP(r9)
1637 std r7, VCPU_CSIGR(r9)
1638 std r8, VCPU_TACR(r9)
1639FTR_SECTION_ELSE
1640 mfspr r5, SPRN_TIDR
1641 mfspr r6, SPRN_PSSCR
1642 std r5, VCPU_TID(r9)
1643 rldicl r6, r6, 4, 50
1644 rotldi r6, r6, 60
1645 std r6, VCPU_PSSCR(r9)
1646
1647 ld r7, STACK_SLOT_HFSCR(r1)
1648 mtspr SPRN_HFSCR, r7
1649ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_300)
1650
1651
1652
1653
1654 li r0, 0
1655 mtspr SPRN_PSPB, r0
1656 mtspr SPRN_WORT, r0
1657BEGIN_FTR_SECTION
1658 mtspr SPRN_TCSCR, r0
1659
1660 li r0, 1
1661 sldi r0, r0, 31
1662 mtspr SPRN_MMCRS, r0
1663END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300)
1664
1665
1666 ld r8, STACK_SLOT_IAMR(r1)
1667 mtspr SPRN_IAMR, r8
1668
16698:
1670 mfspr r5,SPRN_AMR
1671 mfspr r6,SPRN_UAMOR
1672 std r5,VCPU_AMR(r9)
1673 std r6,VCPU_UAMOR(r9)
1674 ld r5,STACK_SLOT_AMR(r1)
1675 ld r6,STACK_SLOT_UAMOR(r1)
1676 mtspr SPRN_AMR, r5
1677 mtspr SPRN_UAMOR, r6
1678
1679
1680 mfspr r8, SPRN_DSCR
1681 ld r7, HSTATE_DSCR(r13)
1682 std r8, VCPU_DSCR(r9)
1683 mtspr SPRN_DSCR, r7
1684
1685
1686 std r14, VCPU_GPR(R14)(r9)
1687 std r15, VCPU_GPR(R15)(r9)
1688 std r16, VCPU_GPR(R16)(r9)
1689 std r17, VCPU_GPR(R17)(r9)
1690 std r18, VCPU_GPR(R18)(r9)
1691 std r19, VCPU_GPR(R19)(r9)
1692 std r20, VCPU_GPR(R20)(r9)
1693 std r21, VCPU_GPR(R21)(r9)
1694 std r22, VCPU_GPR(R22)(r9)
1695 std r23, VCPU_GPR(R23)(r9)
1696 std r24, VCPU_GPR(R24)(r9)
1697 std r25, VCPU_GPR(R25)(r9)
1698 std r26, VCPU_GPR(R26)(r9)
1699 std r27, VCPU_GPR(R27)(r9)
1700 std r28, VCPU_GPR(R28)(r9)
1701 std r29, VCPU_GPR(R29)(r9)
1702 std r30, VCPU_GPR(R30)(r9)
1703 std r31, VCPU_GPR(R31)(r9)
1704
1705
1706 mfspr r3, SPRN_SPRG0
1707 mfspr r4, SPRN_SPRG1
1708 mfspr r5, SPRN_SPRG2
1709 mfspr r6, SPRN_SPRG3
1710 std r3, VCPU_SPRG0(r9)
1711 std r4, VCPU_SPRG1(r9)
1712 std r5, VCPU_SPRG2(r9)
1713 std r6, VCPU_SPRG3(r9)
1714
1715
1716 mr r3, r9
1717 bl kvmppc_save_fp
1718
1719#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1720
1721
1722
1723
1724BEGIN_FTR_SECTION
1725 b 91f
1726END_FTR_SECTION(CPU_FTR_TM | CPU_FTR_P9_TM_HV_ASSIST, 0)
1727
1728
1729
1730 mr r3, r9
1731 ld r4, VCPU_MSR(r3)
1732 li r5, 0
1733 bl kvmppc_save_tm_hv
1734 nop
1735 ld r9, HSTATE_KVM_VCPU(r13)
173691:
1737#endif
1738
1739
1740 ld r8, VCPU_VPA(r9)
1741 cmpdi r8, 0
1742 beq 25f
1743 li r4, LPPACA_YIELDCOUNT
1744 LWZX_BE r3, r8, r4
1745 addi r3, r3, 1
1746 STWX_BE r3, r8, r4
1747 li r3, 1
1748 stb r3, VCPU_VPA_DIRTY(r9)
174925:
1750
1751
1752 mr r3, r9
1753 li r4, 1
1754 beq 21f
1755 lbz r4, LPPACA_PMCINUSE(r8)
175621: bl kvmhv_save_guest_pmu
1757 ld r9, HSTATE_KVM_VCPU(r13)
1758
1759
1760BEGIN_FTR_SECTION
1761 ld r5, STACK_SLOT_CIABR(r1)
1762 ld r6, STACK_SLOT_DAWR(r1)
1763 ld r7, STACK_SLOT_DAWRX(r1)
1764 mtspr SPRN_CIABR, r5
1765
1766
1767
1768
1769 mtspr SPRN_DAWR0, r6
1770 mtspr SPRN_DAWRX0, r7
1771END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
1772BEGIN_FTR_SECTION
1773 ld r5, STACK_SLOT_TID(r1)
1774 ld r6, STACK_SLOT_PSSCR(r1)
1775 ld r7, STACK_SLOT_PID(r1)
1776 mtspr SPRN_TIDR, r5
1777 mtspr SPRN_PSSCR, r6
1778 mtspr SPRN_PID, r7
1779END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
1780
1781#ifdef CONFIG_PPC_RADIX_MMU
1782
1783
1784
1785 ld r5, VCPU_KVM(r9)
1786 lbz r0, KVM_RADIX(r5)
1787 cmpwi cr2, r0, 0
1788 beq cr2, 2f
1789
1790
1791
1792
1793
1794 eieio
1795 tlbsync
1796 ptesync
1797
1798BEGIN_FTR_SECTION
1799
1800 LOAD_REG_ADDR(r4, mmu_base_pid)
1801 lwz r3, VCPU_GUEST_PID(r9)
1802 lwz r5, 0(r4)
1803 cmpw cr0,r3,r5
1804 blt 2f
1805
1806
1807
1808
1809
1810
1811
1812
1813 li r0,0
1814 mtspr SPRN_LPID,r0
1815 isync
1816
1817
1818 ld r6,VCPU_KVM(r9)
1819 lwz r0,KVM_TLB_SETS(r6)
1820 mtctr r0
1821 li r7,0x400
1822 ptesync
1823 sldi r0,r3,32
18241: PPC_TLBIEL(7,0,2,1,1)
1825 addi r7,r7,0x1000
1826 bdnz 1b
1827 ptesync
1828END_FTR_SECTION_IFSET(CPU_FTR_P9_RADIX_PREFETCH_BUG)
1829
18302:
1831#endif
1832
1833
1834
1835
1836
1837
1838
1839kvmhv_switch_to_host:
1840
1841 ld r5,HSTATE_KVM_VCORE(r13)
1842 ld r4,VCORE_KVM(r5)
1843 lbz r3,HSTATE_PTID(r13)
1844 cmpwi r3,0
1845 beq 15f
1846 HMT_LOW
184713: lbz r3,VCORE_IN_GUEST(r5)
1848 cmpwi r3,0
1849 bne 13b
1850 HMT_MEDIUM
1851 b 16f
1852
1853
185415: lwz r3,VCORE_ENTRY_EXIT(r5)
1855 rlwinm r0,r3,32-8,0xff
1856 clrldi r3,r3,56
1857 cmpw r3,r0
1858 bne 15b
1859 isync
1860
1861
1862 lbz r6, VCORE_IN_GUEST(r5)
1863 cmpwi r6, 0
1864 beq 19f
1865
1866
1867 lwz r7,KVM_HOST_LPID(r4)
1868BEGIN_FTR_SECTION
1869 ld r6,KVM_HOST_SDR1(r4)
1870 li r8,LPID_RSVD
1871 mtspr SPRN_LPID,r8
1872 ptesync
1873 mtspr SPRN_SDR1,r6
1874END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300)
1875 mtspr SPRN_LPID,r7
1876 isync
1877
1878BEGIN_FTR_SECTION
1879
1880 mfspr r7, SPRN_DPDES
1881 mfspr r8, SPRN_VTB
1882 std r7, VCORE_DPDES(r5)
1883 std r8, VCORE_VTB(r5)
1884
1885 li r8, 0
1886 mtspr SPRN_DPDES, r8
1887END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
1888
1889
1890 ld r8, VCORE_TB_OFFSET_APPL(r5)
1891 cmpdi r8,0
1892 beq 17f
1893 li r0, 0
1894 std r0, VCORE_TB_OFFSET_APPL(r5)
1895 mftb r6
1896 subf r8,r8,r6
1897 mtspr SPRN_TBU40,r8
1898 mftb r7
1899 clrldi r6,r6,40
1900 clrldi r7,r7,40
1901 cmpld r7,r6
1902 bge 17f
1903 addis r8,r8,0x100
1904 mtspr SPRN_TBU40,r8
1905
190617:
1907
1908
1909
1910
1911
1912
1913
1914
1915 bl kvmppc_subcore_exit_guest
1916 nop
191730: ld r5,HSTATE_KVM_VCORE(r13)
1918 ld r4,VCORE_KVM(r5)
1919
1920
1921 ld r0, VCORE_PCR(r5)
1922 LOAD_REG_IMMEDIATE(r6, PCR_MASK)
1923 cmpld r0, r6
1924 beq 18f
1925 mtspr SPRN_PCR, r6
192618:
1927
1928 li r0, 0
1929 stb r0,VCORE_IN_GUEST(r5)
193019: lis r8,0x7fff
1931 mtspr SPRN_HDEC,r8
1932
193316:
1934BEGIN_FTR_SECTION
1935
1936 ld r3, HSTATE_SPLIT_MODE(r13)
1937 cmpdi r3, 0
1938 beq 47f
1939 lwz r8, KVM_SPLIT_DO_RESTORE(r3)
1940 cmpwi r8, 0
1941 beq 47f
1942 bl kvmhv_p9_restore_lpcr
1943 nop
1944 b 48f
194547:
1946END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
1947 ld r8,KVM_HOST_LPCR(r4)
1948 mtspr SPRN_LPCR,r8
1949 isync
195048:
1951#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING
1952
1953 ld r4, HSTATE_KVM_VCPU(r13)
1954 cmpdi r4, 0
1955 li r3, 0
1956 beq 2f
1957 bl kvmhv_accumulate_time
19582:
1959#endif
1960
1961 li r0, KVM_GUEST_MODE_NONE
1962 stb r0, HSTATE_IN_GUEST(r13)
1963
1964 lwz r12, STACK_SLOT_TRAP(r1)
1965 ld r0, SFS+PPC_LR_STKOFF(r1)
1966 addi r1, r1, SFS
1967 mtlr r0
1968 blr
1969
1970.balign 32
1971.global kvm_flush_link_stack
1972kvm_flush_link_stack:
1973
1974 mflr r0
1975
1976
1977 .rept 32
1978 bl .+4
1979 .endr
1980
1981
1982BEGIN_FTR_SECTION
1983 .rept 32
1984 bl .+4
1985 .endr
1986END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
1987
1988
1989 mtlr r0
1990 blr
1991
1992kvmppc_guest_external:
1993
1994
1995
1996 bl kvmppc_read_intr
1997
1998
1999
2000
2001
2002 ld r9, HSTATE_KVM_VCPU(r13)
2003 li r12, BOOK3S_INTERRUPT_EXTERNAL
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032 cmpdi r3, 1
2033 ble 1f
2034
2035
2036 li r12, BOOK3S_INTERRUPT_HV_RM_HARD
2037 stw r12, VCPU_TRAP(r9)
2038 b guest_exit_cont
2039
20401:
2041 cmpdi r3, 0
2042 bgt guest_exit_cont
2043
2044
2045maybe_reenter_guest:
2046 ld r5, HSTATE_KVM_VCORE(r13)
2047 lwz r0, VCORE_ENTRY_EXIT(r5)
2048 cmpwi r0, 0x100
2049 mr r4, r9
2050 blt deliver_guest_interrupt
2051 b guest_exit_cont
2052
2053#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
2054
2055
2056
2057
2058
2059kvmppc_tm_emul:
2060
2061 mfspr r3, SPRN_HEIR
2062 stw r3, VCPU_HEIR(r9)
2063
2064
2065
2066
2067
2068
2069 lbz r0, HSTATE_FAKE_SUSPEND(r13)
2070 cmpwi r0, 0
2071 bne guest_exit_cont
2072 rldicl r3, r11, 64 - MSR_TS_S_LG, 62
2073 cmpwi r3, 1
2074 bne guest_exit_cont
2075
2076
2077 mr r3, r9
2078 bl kvmhv_p9_tm_emulation_early
2079 nop
2080 ld r9, HSTATE_KVM_VCPU(r13)
2081 li r12, BOOK3S_INTERRUPT_HV_SOFTPATCH
2082 cmpwi r3, 0
2083 beq guest_exit_cont
2084 ld r10, VCPU_PC(r9)
2085 ld r11, VCPU_MSR(r9)
2086 b fast_interrupt_c_return
2087#endif
2088
2089
2090
2091
2092
2093
2094
2095
2096kvmppc_hdsi:
2097 ld r3, VCPU_KVM(r9)
2098 lbz r0, KVM_RADIX(r3)
2099 mfspr r4, SPRN_HDAR
2100 mfspr r6, SPRN_HDSISR
2101BEGIN_FTR_SECTION
2102
2103 cmpdi r6, 0x7fff
2104 beq 6f
2105END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
2106 cmpwi r0, 0
2107 bne .Lradix_hdsi
2108
2109 andis. r0, r6, (DSISR_NOHPTE | DSISR_PROTFAULT)@h
2110 beq 1f
2111 andi. r0, r11, MSR_DR
2112 beq 3f
2113BEGIN_FTR_SECTION
2114 mfspr r5, SPRN_ASDR
2115 b 4f
2116END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
2117 clrrdi r0, r4, 28
2118 PPC_SLBFEE_DOT(R5, R0)
2119 li r0, BOOK3S_INTERRUPT_DATA_SEGMENT
2120 bne 7f
21214: std r4, VCPU_FAULT_DAR(r9)
2122 stw r6, VCPU_FAULT_DSISR(r9)
2123
2124
2125 mr r3, r9
2126 li r7, 1
2127 bl kvmppc_hpte_hv_fault
2128 ld r9, HSTATE_KVM_VCPU(r13)
2129 ld r10, VCPU_PC(r9)
2130 ld r11, VCPU_MSR(r9)
2131 li r12, BOOK3S_INTERRUPT_H_DATA_STORAGE
2132 cmpdi r3, 0
2133 beq 6f
2134 cmpdi r3, -1
2135 beq guest_exit_cont
2136 cmpdi r3, -2
2137 beq 2f
2138
2139
2140 ld r4, VCPU_FAULT_DAR(r9)
2141 mr r6, r3
21421: li r0, BOOK3S_INTERRUPT_DATA_STORAGE
2143 mtspr SPRN_DSISR, r6
21447: mtspr SPRN_DAR, r4
2145 mtspr SPRN_SRR0, r10
2146 mtspr SPRN_SRR1, r11
2147 mr r10, r0
2148 bl kvmppc_msr_interrupt
2149fast_interrupt_c_return:
21506: ld r7, VCPU_CTR(r9)
2151 ld r8, VCPU_XER(r9)
2152 mtctr r7
2153 mtxer r8
2154 mr r4, r9
2155 b fast_guest_return
2156
21573: ld r5, VCPU_KVM(r9)
2158 ld r5, KVM_VRMA_SLB_V(r5)
2159 b 4b
2160
2161
21622: li r8, KVM_INST_FETCH_FAILED
2163
2164
2165
2166 li r0, KVM_GUEST_MODE_SKIP
2167 stb r0, HSTATE_IN_GUEST(r13)
2168
2169
2170 mfmsr r3
2171 ori r4, r3, MSR_DR
2172 mtmsrd r4
2173 lwz r8, 0(r10)
2174 mtmsrd r3
2175
2176
2177 stw r8, VCPU_LAST_INST(r9)
2178
2179
2180 li r0, KVM_GUEST_MODE_HOST_HV
2181 stb r0, HSTATE_IN_GUEST(r13)
2182 b guest_exit_cont
2183
2184.Lradix_hdsi:
2185 std r4, VCPU_FAULT_DAR(r9)
2186 stw r6, VCPU_FAULT_DSISR(r9)
2187.Lradix_hisi:
2188 mfspr r5, SPRN_ASDR
2189 std r5, VCPU_FAULT_GPA(r9)
2190 b guest_exit_cont
2191
2192
2193
2194
2195
2196kvmppc_hisi:
2197 ld r3, VCPU_KVM(r9)
2198 lbz r0, KVM_RADIX(r3)
2199 cmpwi r0, 0
2200 bne .Lradix_hisi
2201 andis. r0, r11, SRR1_ISI_NOPT@h
2202 beq 1f
2203 andi. r0, r11, MSR_IR
2204 beq 3f
2205BEGIN_FTR_SECTION
2206 mfspr r5, SPRN_ASDR
2207 b 4f
2208END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
2209 clrrdi r0, r10, 28
2210 PPC_SLBFEE_DOT(R5, R0)
2211 li r0, BOOK3S_INTERRUPT_INST_SEGMENT
2212 bne 7f
22134:
2214
2215 mr r3, r9
2216 mr r4, r10
2217 mr r6, r11
2218 li r7, 0
2219 bl kvmppc_hpte_hv_fault
2220 ld r9, HSTATE_KVM_VCPU(r13)
2221 ld r10, VCPU_PC(r9)
2222 ld r11, VCPU_MSR(r9)
2223 li r12, BOOK3S_INTERRUPT_H_INST_STORAGE
2224 cmpdi r3, 0
2225 beq fast_interrupt_c_return
2226 cmpdi r3, -1
2227 beq guest_exit_cont
2228
2229
2230 mr r11, r3
22311: li r0, BOOK3S_INTERRUPT_INST_STORAGE
22327: mtspr SPRN_SRR0, r10
2233 mtspr SPRN_SRR1, r11
2234 mr r10, r0
2235 bl kvmppc_msr_interrupt
2236 b fast_interrupt_c_return
2237
22383: ld r6, VCPU_KVM(r9)
2239 ld r5, KVM_VRMA_SLB_V(r6)
2240 b 4b
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251hcall_try_real_mode:
2252 ld r3,VCPU_GPR(R3)(r9)
2253 andi. r0,r11,MSR_PR
2254
2255 bne sc_1_fast_return
2256
2257 ld r0, VCPU_NESTED(r9)
2258 cmpdi r0, 0
2259 bne guest_exit_cont
2260 clrrdi r3,r3,2
2261 cmpldi r3,hcall_real_table_end - hcall_real_table
2262 bge guest_exit_cont
2263
2264 ld r4, VCPU_KVM(r9)
2265 srdi r0, r3, 8
2266 sldi r0, r0, 3
2267 add r4, r4, r0
2268 ld r0, KVM_ENABLED_HCALLS(r4)
2269 rlwinm r4, r3, 32-2, 0x3f
2270 srd r0, r0, r4
2271 andi. r0, r0, 1
2272 beq guest_exit_cont
2273
2274 LOAD_REG_ADDR(r4, hcall_real_table)
2275 lwax r3,r3,r4
2276 cmpwi r3,0
2277 beq guest_exit_cont
2278 add r12,r3,r4
2279 mtctr r12
2280 mr r3,r9
2281 ld r4,VCPU_GPR(R4)(r9)
2282 bctrl
2283 cmpdi r3,H_TOO_HARD
2284 beq hcall_real_fallback
2285 ld r4,HSTATE_KVM_VCPU(r13)
2286 std r3,VCPU_GPR(R3)(r4)
2287 ld r10,VCPU_PC(r4)
2288 ld r11,VCPU_MSR(r4)
2289 b fast_guest_return
2290
2291sc_1_fast_return:
2292 mtspr SPRN_SRR0,r10
2293 mtspr SPRN_SRR1,r11
2294 li r10, BOOK3S_INTERRUPT_SYSCALL
2295 bl kvmppc_msr_interrupt
2296 mr r4,r9
2297 b fast_guest_return
2298
2299
2300
2301
2302hcall_real_fallback:
2303 li r12,BOOK3S_INTERRUPT_SYSCALL
2304 ld r9, HSTATE_KVM_VCPU(r13)
2305
2306 b guest_exit_cont
2307
2308 .globl hcall_real_table
2309hcall_real_table:
2310 .long 0
2311 .long DOTSYM(kvmppc_h_remove) - hcall_real_table
2312 .long DOTSYM(kvmppc_h_enter) - hcall_real_table
2313 .long DOTSYM(kvmppc_h_read) - hcall_real_table
2314 .long DOTSYM(kvmppc_h_clear_mod) - hcall_real_table
2315 .long DOTSYM(kvmppc_h_clear_ref) - hcall_real_table
2316 .long DOTSYM(kvmppc_h_protect) - hcall_real_table
2317#ifdef CONFIG_SPAPR_TCE_IOMMU
2318 .long DOTSYM(kvmppc_h_get_tce) - hcall_real_table
2319 .long DOTSYM(kvmppc_rm_h_put_tce) - hcall_real_table
2320#else
2321 .long 0
2322 .long 0
2323#endif
2324 .long 0
2325 .long DOTSYM(kvmppc_h_set_dabr) - hcall_real_table
2326 .long DOTSYM(kvmppc_rm_h_page_init) - hcall_real_table
2327 .long 0
2328 .long 0
2329 .long 0
2330 .long 0
2331 .long 0
2332 .long 0
2333 .long 0
2334 .long 0
2335 .long 0
2336 .long 0
2337 .long 0
2338 .long 0
2339 .long 0
2340#ifdef CONFIG_KVM_XICS
2341 .long DOTSYM(kvmppc_rm_h_eoi) - hcall_real_table
2342 .long DOTSYM(kvmppc_rm_h_cppr) - hcall_real_table
2343 .long DOTSYM(kvmppc_rm_h_ipi) - hcall_real_table
2344 .long DOTSYM(kvmppc_rm_h_ipoll) - hcall_real_table
2345 .long DOTSYM(kvmppc_rm_h_xirr) - hcall_real_table
2346#else
2347 .long 0
2348 .long 0
2349 .long 0
2350 .long 0
2351 .long 0
2352#endif
2353 .long 0
2354 .long 0
2355 .long 0
2356 .long 0
2357 .long 0
2358 .long 0
2359 .long 0
2360 .long 0
2361 .long 0
2362 .long 0
2363 .long 0
2364 .long 0
2365 .long 0
2366 .long 0
2367 .long 0
2368 .long 0
2369 .long 0
2370 .long 0
2371 .long 0
2372 .long 0
2373 .long 0
2374 .long 0
2375 .long 0
2376 .long 0
2377 .long 0
2378 .long 0
2379 .long DOTSYM(kvmppc_h_cede) - hcall_real_table
2380 .long DOTSYM(kvmppc_rm_h_confer) - hcall_real_table
2381 .long 0
2382 .long 0
2383 .long 0
2384 .long 0
2385 .long 0
2386 .long 0
2387 .long 0
2388 .long 0
2389 .long 0
2390 .long 0
2391 .long 0
2392 .long 0
2393 .long 0
2394 .long 0
2395 .long 0
2396 .long DOTSYM(kvmppc_h_bulk_remove) - hcall_real_table
2397 .long 0
2398 .long 0
2399 .long 0
2400 .long DOTSYM(kvmppc_h_set_xdabr) - hcall_real_table
2401#ifdef CONFIG_SPAPR_TCE_IOMMU
2402 .long DOTSYM(kvmppc_rm_h_stuff_tce) - hcall_real_table
2403 .long DOTSYM(kvmppc_rm_h_put_tce_indirect) - hcall_real_table
2404#else
2405 .long 0
2406 .long 0
2407#endif
2408 .long 0
2409 .long 0
2410 .long 0
2411 .long 0
2412 .long 0
2413 .long 0
2414 .long 0
2415 .long 0
2416 .long 0
2417 .long 0
2418 .long 0
2419 .long 0
2420 .long 0
2421 .long 0
2422 .long 0
2423 .long 0
2424 .long 0
2425 .long 0
2426 .long 0
2427 .long 0
2428 .long 0
2429 .long 0
2430 .long 0
2431 .long 0
2432 .long 0
2433 .long 0
2434 .long 0
2435 .long 0
2436 .long 0
2437 .long 0
2438 .long 0
2439 .long 0
2440 .long 0
2441 .long 0
2442 .long 0
2443 .long 0
2444 .long 0
2445 .long 0
2446 .long 0
2447 .long 0
2448 .long 0
2449 .long 0
2450 .long 0
2451 .long 0
2452 .long 0
2453 .long 0
2454 .long 0
2455 .long 0
2456 .long 0
2457 .long 0
2458 .long 0
2459 .long 0
2460 .long 0
2461 .long 0
2462 .long 0
2463 .long 0
2464 .long 0
2465 .long 0
2466 .long 0
2467 .long 0
2468 .long 0
2469 .long 0
2470 .long 0
2471 .long 0
2472 .long 0
2473 .long 0
2474 .long 0
2475 .long 0
2476 .long 0
2477 .long 0
2478 .long 0
2479 .long 0
2480 .long 0
2481 .long 0
2482 .long 0
2483 .long 0
2484 .long 0
2485 .long 0
2486 .long 0
2487 .long 0
2488 .long 0
2489 .long 0
2490 .long 0
2491 .long 0
2492 .long 0
2493 .long 0
2494 .long 0
2495 .long 0
2496 .long 0
2497 .long 0
2498 .long 0
2499 .long 0
2500 .long 0
2501 .long 0
2502 .long 0
2503 .long 0
2504 .long 0
2505 .long 0
2506 .long 0
2507 .long 0
2508 .long 0
2509 .long 0
2510 .long 0
2511 .long 0
2512 .long 0
2513 .long 0
2514 .long 0
2515 .long 0
2516 .long 0
2517 .long 0
2518 .long 0
2519#ifdef CONFIG_KVM_XICS
2520 .long DOTSYM(kvmppc_rm_h_xirr_x) - hcall_real_table
2521#else
2522 .long 0
2523#endif
2524 .long DOTSYM(kvmppc_h_random) - hcall_real_table
2525 .globl hcall_real_table_end
2526hcall_real_table_end:
2527
2528_GLOBAL(kvmppc_h_set_xdabr)
2529EXPORT_SYMBOL_GPL(kvmppc_h_set_xdabr)
2530 andi. r0, r5, DABRX_USER | DABRX_KERNEL
2531 beq 6f
2532 li r0, DABRX_USER | DABRX_KERNEL | DABRX_BTI
2533 andc. r0, r5, r0
2534 beq 3f
25356: li r3, H_PARAMETER
2536 blr
2537
2538_GLOBAL(kvmppc_h_set_dabr)
2539EXPORT_SYMBOL_GPL(kvmppc_h_set_dabr)
2540 li r5, DABRX_USER | DABRX_KERNEL
25413:
2542BEGIN_FTR_SECTION
2543 b 2f
2544END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
2545 std r4,VCPU_DABR(r3)
2546 stw r5, VCPU_DABRX(r3)
2547 mtspr SPRN_DABRX, r5
2548
25491: mtspr SPRN_DABR,r4
2550 mfspr r5, SPRN_DABR
2551 cmpd r4, r5
2552 bne 1b
2553 isync
2554 li r3,0
2555 blr
2556
25572:
2558 LOAD_REG_ADDR(r11, dawr_force_enable)
2559 lbz r11, 0(r11)
2560 cmpdi r11, 0
2561 bne 3f
2562 li r3, H_HARDWARE
2563 blr
25643:
2565
2566 rlwimi r5, r4, 5, DAWRX_DR | DAWRX_DW
2567 rlwimi r5, r4, 2, DAWRX_WT
2568 clrrdi r4, r4, 3
2569 std r4, VCPU_DAWR(r3)
2570 std r5, VCPU_DAWRX(r3)
2571
2572
2573
2574
2575
2576
2577 mfmsr r6
2578 andi. r6, r6, MSR_DR
2579 bne 4f
2580 mtspr SPRN_DAWR0, r4
2581 mtspr SPRN_DAWRX0, r5
25824: li r3, 0
2583 blr
2584
2585_GLOBAL(kvmppc_h_cede)
2586 ori r11,r11,MSR_EE
2587 std r11,VCPU_MSR(r3)
2588 li r0,1
2589 stb r0,VCPU_CEDED(r3)
2590 sync
2591 lbz r5,VCPU_PRODDED(r3)
2592 cmpwi r5,0
2593 bne kvm_cede_prodded
2594 li r12,0
2595 stw r12,VCPU_TRAP(r3)
2596 li r0,H_SUCCESS
2597 std r0,VCPU_GPR(R3)(r3)
2598
2599
2600
2601
2602
2603
2604 ld r5,HSTATE_KVM_VCORE(r13)
2605 lbz r6,HSTATE_PTID(r13)
2606 lwz r8,VCORE_ENTRY_EXIT(r5)
2607 clrldi r8,r8,56
2608 li r0,1
2609 sld r0,r0,r6
2610 addi r6,r5,VCORE_NAPPING_THREADS
261131: lwarx r4,0,r6
2612 or r4,r4,r0
2613 cmpw r4,r8
2614 beq kvm_cede_exit
2615 stwcx. r4,0,r6
2616 bne 31b
2617
2618 isync
2619 li r0,NAPPING_CEDE
2620 stb r0,HSTATE_NAPPING(r13)
2621 lwz r7,VCORE_ENTRY_EXIT(r5)
2622 cmpwi r7,0x100
2623 bge 33f
2624
2625
2626
2627
2628
2629
2630
2631
2632 std r14, VCPU_GPR(R14)(r3)
2633 std r15, VCPU_GPR(R15)(r3)
2634 std r16, VCPU_GPR(R16)(r3)
2635 std r17, VCPU_GPR(R17)(r3)
2636 std r18, VCPU_GPR(R18)(r3)
2637 std r19, VCPU_GPR(R19)(r3)
2638 std r20, VCPU_GPR(R20)(r3)
2639 std r21, VCPU_GPR(R21)(r3)
2640 std r22, VCPU_GPR(R22)(r3)
2641 std r23, VCPU_GPR(R23)(r3)
2642 std r24, VCPU_GPR(R24)(r3)
2643 std r25, VCPU_GPR(R25)(r3)
2644 std r26, VCPU_GPR(R26)(r3)
2645 std r27, VCPU_GPR(R27)(r3)
2646 std r28, VCPU_GPR(R28)(r3)
2647 std r29, VCPU_GPR(R29)(r3)
2648 std r30, VCPU_GPR(R30)(r3)
2649 std r31, VCPU_GPR(R31)(r3)
2650
2651
2652 bl kvmppc_save_fp
2653
2654#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
2655
2656
2657
2658
2659BEGIN_FTR_SECTION
2660 b 91f
2661END_FTR_SECTION(CPU_FTR_TM | CPU_FTR_P9_TM_HV_ASSIST, 0)
2662
2663
2664
2665 ld r3, HSTATE_KVM_VCPU(r13)
2666 ld r4, VCPU_MSR(r3)
2667 li r5, 0
2668 bl kvmppc_save_tm_hv
2669 nop
267091:
2671#endif
2672
2673
2674
2675
2676
2677
2678 mfspr r3, SPRN_DEC
2679 mfspr r4, SPRN_HDEC
2680 mftb r5
2681BEGIN_FTR_SECTION
2682
2683 ld r6, HSTATE_KVM_VCORE(r13)
2684 ld r6, VCORE_LPCR(r6)
2685 andis. r6, r6, LPCR_LD@h
2686 bne 68f
2687END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
2688 extsw r3, r3
268968: EXTEND_HDEC(r4)
2690 cmpd r3, r4
2691 ble 67f
2692 mtspr SPRN_DEC, r4
269367:
2694
2695 add r3, r3, r5
2696 ld r4, HSTATE_KVM_VCPU(r13)
2697 ld r5, HSTATE_KVM_VCORE(r13)
2698 ld r6, VCORE_TB_OFFSET_APPL(r5)
2699 subf r3, r6, r3
2700 std r3, VCPU_DEC_EXPIRES(r4)
2701
2702#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING
2703 ld r4, HSTATE_KVM_VCPU(r13)
2704 addi r3, r4, VCPU_TB_CEDE
2705 bl kvmhv_accumulate_time
2706#endif
2707
2708 lis r3, LPCR_PECEDP@h
2709
2710
2711 ld r1, HSTATE_HOST_R1(r13)
2712
2713
2714
2715
2716
2717
2718
2719kvm_do_nap:
2720 mfspr r0, SPRN_CTRLF
2721 clrrdi r0, r0, 1
2722 mtspr SPRN_CTRLT, r0
2723
2724 li r0,1
2725 stb r0,HSTATE_HWTHREAD_REQ(r13)
2726 mfspr r5,SPRN_LPCR
2727 ori r5,r5,LPCR_PECE0 | LPCR_PECE1
2728BEGIN_FTR_SECTION
2729 ori r5, r5, LPCR_PECEDH
2730 rlwimi r5, r3, 0, LPCR_PECEDP
2731END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
2732
2733kvm_nap_sequence:
2734BEGIN_FTR_SECTION
2735
2736
2737
2738
2739
2740 lis r3, (PSSCR_EC | PSSCR_ESL)@h
2741
2742 li r4, LPCR_PECE_HVEE@higher
2743 sldi r4, r4, 32
2744 or r5, r5, r4
2745FTR_SECTION_ELSE
2746 li r3, PNV_THREAD_NAP
2747ALT_FTR_SECTION_END_IFSET(CPU_FTR_ARCH_300)
2748 mtspr SPRN_LPCR,r5
2749 isync
2750
2751BEGIN_FTR_SECTION
2752 bl isa300_idle_stop_mayloss
2753FTR_SECTION_ELSE
2754 bl isa206_idle_insn_mayloss
2755ALT_FTR_SECTION_END_IFSET(CPU_FTR_ARCH_300)
2756
2757 mfspr r0, SPRN_CTRLF
2758 ori r0, r0, 1
2759 mtspr SPRN_CTRLT, r0
2760
2761 mtspr SPRN_SRR1, r3
2762
2763 li r0, 0
2764 stb r0, PACA_FTRACE_ENABLED(r13)
2765
2766 li r0, KVM_HWTHREAD_IN_KVM
2767 stb r0, HSTATE_HWTHREAD_STATE(r13)
2768
2769 lbz r0, HSTATE_NAPPING(r13)
2770 cmpwi r0, NAPPING_CEDE
2771 beq kvm_end_cede
2772 cmpwi r0, NAPPING_NOVCPU
2773 beq kvm_novcpu_wakeup
2774 cmpwi r0, NAPPING_UNSPLIT
2775 beq kvm_unsplit_wakeup
2776 twi 31,0,0
2777
277833: mr r4, r3
2779 li r3, 0
2780 li r12, 0
2781 b 34f
2782
2783kvm_end_cede:
2784
2785
2786
2787 ld r4, HSTATE_KVM_VCPU(r13)
2788
2789#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING
2790 addi r3, r4, VCPU_TB_RMINTR
2791 bl kvmhv_accumulate_time
2792#endif
2793
2794#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
2795
2796
2797
2798
2799BEGIN_FTR_SECTION
2800 b 91f
2801END_FTR_SECTION(CPU_FTR_TM | CPU_FTR_P9_TM_HV_ASSIST, 0)
2802
2803
2804
2805 mr r3, r4
2806 ld r4, VCPU_MSR(r3)
2807 li r5, 0
2808 bl kvmppc_restore_tm_hv
2809 nop
2810 ld r4, HSTATE_KVM_VCPU(r13)
281191:
2812#endif
2813
2814
2815 bl kvmppc_load_fp
2816
2817
2818 ld r3, VCPU_DEC_EXPIRES(r4)
2819 ld r5, HSTATE_KVM_VCORE(r13)
2820 ld r6, VCORE_TB_OFFSET_APPL(r5)
2821 add r3, r3, r6
2822 mftb r7
2823 subf r3, r7, r3
2824 mtspr SPRN_DEC, r3
2825
2826
2827 ld r14, VCPU_GPR(R14)(r4)
2828 ld r15, VCPU_GPR(R15)(r4)
2829 ld r16, VCPU_GPR(R16)(r4)
2830 ld r17, VCPU_GPR(R17)(r4)
2831 ld r18, VCPU_GPR(R18)(r4)
2832 ld r19, VCPU_GPR(R19)(r4)
2833 ld r20, VCPU_GPR(R20)(r4)
2834 ld r21, VCPU_GPR(R21)(r4)
2835 ld r22, VCPU_GPR(R22)(r4)
2836 ld r23, VCPU_GPR(R23)(r4)
2837 ld r24, VCPU_GPR(R24)(r4)
2838 ld r25, VCPU_GPR(R25)(r4)
2839 ld r26, VCPU_GPR(R26)(r4)
2840 ld r27, VCPU_GPR(R27)(r4)
2841 ld r28, VCPU_GPR(R28)(r4)
2842 ld r29, VCPU_GPR(R29)(r4)
2843 ld r30, VCPU_GPR(R30)(r4)
2844 ld r31, VCPU_GPR(R31)(r4)
2845
2846
2847 bl kvmppc_check_wake_reason
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857 ld r4, HSTATE_KVM_VCPU(r13)
2858
2859
286034: ld r5,HSTATE_KVM_VCORE(r13)
2861 lbz r7,HSTATE_PTID(r13)
2862 li r0,1
2863 sld r0,r0,r7
2864 addi r6,r5,VCORE_NAPPING_THREADS
286532: lwarx r7,0,r6
2866 andc r7,r7,r0
2867 stwcx. r7,0,r6
2868 bne 32b
2869 li r0,0
2870 stb r0,HSTATE_NAPPING(r13)
2871
2872
2873 stw r12, VCPU_TRAP(r4)
2874 mr r9, r4
2875 cmpdi r3, 0
2876 bgt guest_exit_cont
2877 b maybe_reenter_guest
2878
2879
2880kvm_cede_prodded:
2881 li r0,0
2882 stb r0,VCPU_PRODDED(r3)
2883 sync
2884 stb r0,VCPU_CEDED(r3)
2885 li r3,H_SUCCESS
2886 blr
2887
2888
2889kvm_cede_exit:
2890 ld r9, HSTATE_KVM_VCPU(r13)
2891#ifdef CONFIG_KVM_XICS
2892
2893 ld r10, VCPU_XIVE_ESC_VADDR(r9)
2894 cmpdi r10, 0
2895 beq 3f
2896 li r6, XIVE_ESB_SET_PQ_00
2897
2898
2899
2900
2901
2902
2903
2904
2905 lbz r5, VCPU_XIVE_ESC_ON(r9)
2906 cmpwi r5, 0
2907 beq 4f
2908 li r0, 0
2909 stb r0, VCPU_CEDED(r9)
2910
2911
2912
2913
2914
2915 li r6, XIVE_ESB_SET_PQ_10
2916 b 5f
29174: li r0, 1
2918 stb r0, VCPU_XIVE_ESC_ON(r9)
2919
2920 sync
29215:
2922 mfmsr r0
2923 andi. r0, r0, MSR_DR
2924 beq 1f
2925 ldx r0, r10, r6
2926 b 2f
29271: ld r10, VCPU_XIVE_ESC_RADDR(r9)
2928 ldcix r0, r10, r6
29292: sync
2930#endif
29313: b guest_exit_cont
2932
2933
2934machine_check_realmode:
2935 mr r3, r9
2936 bl kvmppc_realmode_machine_check
2937 nop
2938
2939 ld r9, HSTATE_KVM_VCPU(r13)
2940 li r12, BOOK3S_INTERRUPT_MACHINE_CHECK
2941 b guest_exit_cont
2942
2943
2944
2945
2946
2947
2948
2949hmi_realmode:
2950 lbz r0, HSTATE_PTID(r13)
2951 cmpwi r0, 0
2952 bne guest_exit_cont
2953 bl kvmppc_realmode_hmi_handler
2954 ld r9, HSTATE_KVM_VCPU(r13)
2955 li r12, BOOK3S_INTERRUPT_HMI
2956 b guest_exit_cont
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973kvmppc_check_wake_reason:
2974 mfspr r6, SPRN_SRR1
2975BEGIN_FTR_SECTION
2976 rlwinm r6, r6, 45-31, 0xf
2977FTR_SECTION_ELSE
2978 rlwinm r6, r6, 45-31, 0xe
2979ALT_FTR_SECTION_END_IFSET(CPU_FTR_ARCH_207S)
2980 cmpwi r6, 8
2981 beq 7f
2982 li r3, 0
2983 li r12, 0
2984 cmpwi r6, 6
2985 beq 0f
2986BEGIN_FTR_SECTION
2987 cmpwi r6, 5
2988 beq 0f
2989 cmpwi r6, 3
2990 beq 3f
2991END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
2992 cmpwi r6, 0xa
2993 beq 4f
2994 li r3, 1
29950: blr
2996
2997
29983: li r12, BOOK3S_INTERRUPT_H_DOORBELL
2999
3000
3001
3002
3003
3004 lis r6, (PPC_DBELL_SERVER << (63-36))@h
3005 PPC_MSGCLR(6)
3006
3007 li r3, 1
3008BEGIN_FTR_SECTION
3009 PPC_MSGSYNC
3010 lwsync
3011END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
3012 lbz r0, HSTATE_HOST_IPI(r13)
3013 cmpwi r0, 0
3014 bnelr
3015
3016 li r3, -1
3017 blr
3018
3019
30204: li r12, BOOK3S_INTERRUPT_HMI
3021 li r3, 1
3022 blr
3023
3024
30257: mflr r0
3026 std r0, PPC_LR_STKOFF(r1)
3027 stdu r1, -PPC_MIN_STKFRM(r1)
3028 bl kvmppc_read_intr
3029 nop
3030 li r12, BOOK3S_INTERRUPT_EXTERNAL
3031 cmpdi r3, 1
3032 ble 1f
3033
3034
3035
3036
3037
3038
3039
3040 li r12, BOOK3S_INTERRUPT_HV_RM_HARD
30411:
3042 ld r0, PPC_MIN_STKFRM+PPC_LR_STKOFF(r1)
3043 addi r1, r1, PPC_MIN_STKFRM
3044 mtlr r0
3045 blr
3046
3047
3048
3049
3050
3051
3052
3053kvmppc_save_fp:
3054 mflr r30
3055 mr r31,r3
3056 mfmsr r5
3057 ori r8,r5,MSR_FP
3058#ifdef CONFIG_ALTIVEC
3059BEGIN_FTR_SECTION
3060 oris r8,r8,MSR_VEC@h
3061END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
3062#endif
3063#ifdef CONFIG_VSX
3064BEGIN_FTR_SECTION
3065 oris r8,r8,MSR_VSX@h
3066END_FTR_SECTION_IFSET(CPU_FTR_VSX)
3067#endif
3068 mtmsrd r8
3069 addi r3,r3,VCPU_FPRS
3070 bl store_fp_state
3071#ifdef CONFIG_ALTIVEC
3072BEGIN_FTR_SECTION
3073 addi r3,r31,VCPU_VRS
3074 bl store_vr_state
3075END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
3076#endif
3077 mfspr r6,SPRN_VRSAVE
3078 stw r6,VCPU_VRSAVE(r31)
3079 mtlr r30
3080 blr
3081
3082
3083
3084
3085
3086
3087
3088kvmppc_load_fp:
3089 mflr r30
3090 mr r31,r4
3091 mfmsr r9
3092 ori r8,r9,MSR_FP
3093#ifdef CONFIG_ALTIVEC
3094BEGIN_FTR_SECTION
3095 oris r8,r8,MSR_VEC@h
3096END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
3097#endif
3098#ifdef CONFIG_VSX
3099BEGIN_FTR_SECTION
3100 oris r8,r8,MSR_VSX@h
3101END_FTR_SECTION_IFSET(CPU_FTR_VSX)
3102#endif
3103 mtmsrd r8
3104 addi r3,r4,VCPU_FPRS
3105 bl load_fp_state
3106#ifdef CONFIG_ALTIVEC
3107BEGIN_FTR_SECTION
3108 addi r3,r31,VCPU_VRS
3109 bl load_vr_state
3110END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
3111#endif
3112 lwz r7,VCPU_VRSAVE(r31)
3113 mtspr SPRN_VRSAVE,r7
3114 mtlr r30
3115 mr r4,r31
3116 blr
3117
3118#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
3119
3120
3121
3122
3123
3124
3125
3126
3127_GLOBAL_TOC(kvmppc_save_tm_hv)
3128EXPORT_SYMBOL_GPL(kvmppc_save_tm_hv)
3129
3130BEGIN_FTR_SECTION
3131 b __kvmppc_save_tm
3132END_FTR_SECTION_IFCLR(CPU_FTR_P9_TM_HV_ASSIST)
3133
3134 lbz r0, HSTATE_FAKE_SUSPEND(r13)
3135 cmpwi r0, 0
3136 beq __kvmppc_save_tm
3137
3138
3139 mflr r0
3140 std r0, PPC_LR_STKOFF(r1)
3141 stdu r1, -PPC_MIN_STKFRM(r1)
3142
3143
3144 mfmsr r8
3145 li r0, 1
3146 rldimi r8, r0, MSR_TM_LG, 63-MSR_TM_LG
3147 mtmsrd r8
3148
3149 rldicl. r8, r8, 64 - MSR_TS_S_LG, 62
3150 beq 4f
3151BEGIN_FTR_SECTION
3152 bl pnv_power9_force_smt4_catch
3153END_FTR_SECTION_IFSET(CPU_FTR_P9_TM_XER_SO_BUG)
3154 nop
3155
3156
3157 li r3, TM_CAUSE_KVM_RESCHED
3158 TRECLAIM(R3)
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168BEGIN_FTR_SECTION
3169 bl pnv_power9_force_smt4_release
3170END_FTR_SECTION_IFSET(CPU_FTR_P9_TM_XER_SO_BUG)
3171 nop
3172
31734:
3174 mfspr r3, SPRN_PSSCR
3175
3176 li r0, PSSCR_FAKE_SUSPEND
3177 andc r3, r3, r0
3178 mtspr SPRN_PSSCR, r3
3179
3180
3181 ld r9, HSTATE_KVM_VCPU(r13)
3182 mfspr r5, SPRN_TFHAR
3183 mfspr r6, SPRN_TFIAR
3184 std r5, VCPU_TFHAR(r9)
3185 std r6, VCPU_TFIAR(r9)
3186
3187 addi r1, r1, PPC_MIN_STKFRM
3188 ld r0, PPC_LR_STKOFF(r1)
3189 mtlr r0
3190 blr
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200_GLOBAL_TOC(kvmppc_restore_tm_hv)
3201EXPORT_SYMBOL_GPL(kvmppc_restore_tm_hv)
3202
3203
3204
3205
3206
3207BEGIN_FTR_SECTION
3208 b __kvmppc_restore_tm
3209END_FTR_SECTION_IFCLR(CPU_FTR_P9_TM_HV_ASSIST)
3210 mflr r0
3211 std r0, PPC_LR_STKOFF(r1)
3212
3213 li r0, 0
3214 stb r0, HSTATE_FAKE_SUSPEND(r13)
3215
3216
3217 mfmsr r5
3218 li r0, 1
3219 rldimi r5, r0, MSR_TM_LG, 63-MSR_TM_LG
3220 mtmsrd r5
3221
3222
3223
3224
3225
3226 ld r5, VCPU_TFHAR(r3)
3227 ld r6, VCPU_TFIAR(r3)
3228 ld r7, VCPU_TEXASR(r3)
3229 mtspr SPRN_TFHAR, r5
3230 mtspr SPRN_TFIAR, r6
3231 mtspr SPRN_TEXASR, r7
3232
3233 rldicl. r5, r4, 64 - MSR_TS_S_LG, 62
3234 beqlr
3235
3236
3237 oris r7, r7, (TEXASR_FS)@h
3238 mtspr SPRN_TEXASR, r7
3239
3240 cmpwi r5, 1
3241 bgt 10f
3242 stb r5, HSTATE_FAKE_SUSPEND(r13)
3243 b 9f
324410: stdu r1, -PPC_MIN_STKFRM(r1)
3245
3246 bl kvmhv_emulate_tm_rollback
3247 nop
3248 addi r1, r1, PPC_MIN_STKFRM
32499: ld r0, PPC_LR_STKOFF(r1)
3250 mtlr r0
3251 blr
3252#endif
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265kvmppc_bad_host_intr:
3266
3267
3268
3269
3270 mr r9, r1
3271 std r1, PACAR1(r13)
3272 ld r1, PACAEMERGSP(r13)
3273 subi r1, r1, THREAD_SIZE/2 + INT_FRAME_SIZE
3274 std r9, 0(r1)
3275 std r0, GPR0(r1)
3276 std r9, GPR1(r1)
3277 std r2, GPR2(r1)
3278 SAVE_4GPRS(3, r1)
3279 SAVE_2GPRS(7, r1)
3280 srdi r0, r12, 32
3281 clrldi r12, r12, 32
3282 std r0, _CCR(r1)
3283 std r12, _TRAP(r1)
3284 andi. r0, r12, 2
3285 beq 1f
3286 mfspr r3, SPRN_HSRR0
3287 mfspr r4, SPRN_HSRR1
3288 mfspr r5, SPRN_HDAR
3289 mfspr r6, SPRN_HDSISR
3290 b 2f
32911: mfspr r3, SPRN_SRR0
3292 mfspr r4, SPRN_SRR1
3293 mfspr r5, SPRN_DAR
3294 mfspr r6, SPRN_DSISR
32952: std r3, _NIP(r1)
3296 std r4, _MSR(r1)
3297 std r5, _DAR(r1)
3298 std r6, _DSISR(r1)
3299 ld r9, HSTATE_SCRATCH2(r13)
3300 ld r12, HSTATE_SCRATCH0(r13)
3301 GET_SCRATCH0(r0)
3302 SAVE_4GPRS(9, r1)
3303 std r0, GPR13(r1)
3304 SAVE_NVGPRS(r1)
3305 ld r5, HSTATE_CFAR(r13)
3306 std r5, ORIG_GPR3(r1)
3307 mflr r3
3308 mfctr r4
3309 mfxer r5
3310 lbz r6, PACAIRQSOFTMASK(r13)
3311 std r3, _LINK(r1)
3312 std r4, _CTR(r1)
3313 std r5, _XER(r1)
3314 std r6, SOFTE(r1)
3315 ld r2, PACATOC(r13)
3316 LOAD_REG_IMMEDIATE(3, 0x7265677368657265)
3317 std r3, STACK_FRAME_OVERHEAD-16(r1)
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327BEGIN_FTR_SECTION
3328 b .
3329END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300)
3330 ld r9, HSTATE_KVM_VCPU(r13)
3331 ld r10, VCPU_KVM(r9)
3332
3333 li r0, 0
3334 mtspr SPRN_AMR, r0
3335 mtspr SPRN_IAMR, r0
3336 mtspr SPRN_CIABR, r0
3337 mtspr SPRN_DAWRX0, r0
3338
3339BEGIN_MMU_FTR_SECTION
3340 b 4f
3341END_MMU_FTR_SECTION_IFSET(MMU_FTR_TYPE_RADIX)
3342
3343 slbmte r0, r0
3344 slbia
3345 ptesync
3346 ld r8, PACA_SLBSHADOWPTR(r13)
3347 .rept SLB_NUM_BOLTED
3348 li r3, SLBSHADOW_SAVEAREA
3349 LDX_BE r5, r8, r3
3350 addi r3, r3, 8
3351 LDX_BE r6, r8, r3
3352 andis. r7, r5, SLB_ESID_V@h
3353 beq 3f
3354 slbmte r6, r5
33553: addi r8, r8, 16
3356 .endr
3357
33584: lwz r7, KVM_HOST_LPID(r10)
3359 mtspr SPRN_LPID, r7
3360 mtspr SPRN_PID, r0
3361 ld r8, KVM_HOST_LPCR(r10)
3362 mtspr SPRN_LPCR, r8
3363 isync
3364 li r0, KVM_GUEST_MODE_NONE
3365 stb r0, HSTATE_IN_GUEST(r13)
3366
3367
3368
3369
3370 bcl 20, 31, .+4
33715: mflr r3
3372 addi r3, r3, 9f - 5b
3373 li r4, -1
3374 rldimi r3, r4, 62, 0
3375 ld r4, PACAKMSR(r13)
3376 mtspr SPRN_SRR0, r3
3377 mtspr SPRN_SRR1, r4
3378 RFI_TO_KERNEL
33799: addi r3, r1, STACK_FRAME_OVERHEAD
3380 bl kvmppc_bad_interrupt
3381 b 9b
3382
3383
3384
3385
3386
3387
3388
3389
3390kvmppc_msr_interrupt:
3391 rldicl r0, r11, 64 - MSR_TS_S_LG, 62
3392 cmpwi r0, 2
3393 ld r11, VCPU_INTR_MSR(r9)
3394 bne 1f
3395
3396 li r0, 1
33971: rldimi r11, r0, MSR_TS_S_LG, 63 - MSR_TS_T_LG
3398 blr
3399
3400
3401
3402
3403_GLOBAL(kvmhv_load_guest_pmu)
3404EXPORT_SYMBOL_GPL(kvmhv_load_guest_pmu)
3405 mr r4, r3
3406 mflr r0
3407 li r3, 1
3408 sldi r3, r3, 31
3409 mtspr SPRN_MMCR0, r3
3410 isync
3411BEGIN_FTR_SECTION
3412 ld r3, VCPU_MMCR(r4)
3413 andi. r5, r3, MMCR0_PMAO_SYNC | MMCR0_PMAO
3414 cmpwi r5, MMCR0_PMAO
3415 beql kvmppc_fix_pmao
3416END_FTR_SECTION_IFSET(CPU_FTR_PMAO_BUG)
3417 lwz r3, VCPU_PMC(r4)
3418 lwz r5, VCPU_PMC + 4(r4)
3419 lwz r6, VCPU_PMC + 8(r4)
3420 lwz r7, VCPU_PMC + 12(r4)
3421 lwz r8, VCPU_PMC + 16(r4)
3422 lwz r9, VCPU_PMC + 20(r4)
3423 mtspr SPRN_PMC1, r3
3424 mtspr SPRN_PMC2, r5
3425 mtspr SPRN_PMC3, r6
3426 mtspr SPRN_PMC4, r7
3427 mtspr SPRN_PMC5, r8
3428 mtspr SPRN_PMC6, r9
3429 ld r3, VCPU_MMCR(r4)
3430 ld r5, VCPU_MMCR + 8(r4)
3431 ld r6, VCPU_MMCRA(r4)
3432 ld r7, VCPU_SIAR(r4)
3433 ld r8, VCPU_SDAR(r4)
3434 mtspr SPRN_MMCR1, r5
3435 mtspr SPRN_MMCRA, r6
3436 mtspr SPRN_SIAR, r7
3437 mtspr SPRN_SDAR, r8
3438BEGIN_FTR_SECTION
3439 ld r5, VCPU_MMCR + 24(r4)
3440 ld r6, VCPU_SIER + 8(r4)
3441 ld r7, VCPU_SIER + 16(r4)
3442 mtspr SPRN_MMCR3, r5
3443 mtspr SPRN_SIER2, r6
3444 mtspr SPRN_SIER3, r7
3445END_FTR_SECTION_IFSET(CPU_FTR_ARCH_31)
3446BEGIN_FTR_SECTION
3447 ld r5, VCPU_MMCR + 16(r4)
3448 ld r6, VCPU_SIER(r4)
3449 mtspr SPRN_MMCR2, r5
3450 mtspr SPRN_SIER, r6
3451BEGIN_FTR_SECTION_NESTED(96)
3452 lwz r7, VCPU_PMC + 24(r4)
3453 lwz r8, VCPU_PMC + 28(r4)
3454 ld r9, VCPU_MMCRS(r4)
3455 mtspr SPRN_SPMC1, r7
3456 mtspr SPRN_SPMC2, r8
3457 mtspr SPRN_MMCRS, r9
3458END_FTR_SECTION_NESTED(CPU_FTR_ARCH_300, 0, 96)
3459END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
3460 mtspr SPRN_MMCR0, r3
3461 isync
3462 mtlr r0
3463 blr
3464
3465
3466
3467
3468_GLOBAL(kvmhv_load_host_pmu)
3469EXPORT_SYMBOL_GPL(kvmhv_load_host_pmu)
3470 mflr r0
3471 lbz r4, PACA_PMCINUSE(r13)
3472 cmpwi r4, 0
3473 beq 23f
3474BEGIN_FTR_SECTION
3475 ld r3, HSTATE_MMCR0(r13)
3476 andi. r4, r3, MMCR0_PMAO_SYNC | MMCR0_PMAO
3477 cmpwi r4, MMCR0_PMAO
3478 beql kvmppc_fix_pmao
3479END_FTR_SECTION_IFSET(CPU_FTR_PMAO_BUG)
3480 lwz r3, HSTATE_PMC1(r13)
3481 lwz r4, HSTATE_PMC2(r13)
3482 lwz r5, HSTATE_PMC3(r13)
3483 lwz r6, HSTATE_PMC4(r13)
3484 lwz r8, HSTATE_PMC5(r13)
3485 lwz r9, HSTATE_PMC6(r13)
3486 mtspr SPRN_PMC1, r3
3487 mtspr SPRN_PMC2, r4
3488 mtspr SPRN_PMC3, r5
3489 mtspr SPRN_PMC4, r6
3490 mtspr SPRN_PMC5, r8
3491 mtspr SPRN_PMC6, r9
3492 ld r3, HSTATE_MMCR0(r13)
3493 ld r4, HSTATE_MMCR1(r13)
3494 ld r5, HSTATE_MMCRA(r13)
3495 ld r6, HSTATE_SIAR(r13)
3496 ld r7, HSTATE_SDAR(r13)
3497 mtspr SPRN_MMCR1, r4
3498 mtspr SPRN_MMCRA, r5
3499 mtspr SPRN_SIAR, r6
3500 mtspr SPRN_SDAR, r7
3501BEGIN_FTR_SECTION
3502 ld r8, HSTATE_MMCR2(r13)
3503 ld r9, HSTATE_SIER(r13)
3504 mtspr SPRN_MMCR2, r8
3505 mtspr SPRN_SIER, r9
3506END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
3507BEGIN_FTR_SECTION
3508 ld r5, HSTATE_MMCR3(r13)
3509 ld r6, HSTATE_SIER2(r13)
3510 ld r7, HSTATE_SIER3(r13)
3511 mtspr SPRN_MMCR3, r5
3512 mtspr SPRN_SIER2, r6
3513 mtspr SPRN_SIER3, r7
3514END_FTR_SECTION_IFSET(CPU_FTR_ARCH_31)
3515 mtspr SPRN_MMCR0, r3
3516 isync
3517 mtlr r0
351823: blr
3519
3520
3521
3522
3523
3524_GLOBAL(kvmhv_save_guest_pmu)
3525EXPORT_SYMBOL_GPL(kvmhv_save_guest_pmu)
3526 mr r9, r3
3527 mr r8, r4
3528BEGIN_FTR_SECTION
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546 li r3, -1
3547 clrrdi r3, r3, 10
3548 mfspr r10, SPRN_MMCR2
3549 mtspr SPRN_MMCR2, r3
3550 isync
3551END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
3552 li r3, 1
3553 sldi r3, r3, 31
3554 mfspr r4, SPRN_MMCR0
3555 mtspr SPRN_MMCR0, r3
3556 mfspr r6, SPRN_MMCRA
3557
3558 li r7, 0
3559 mtspr SPRN_MMCRA, r7
3560 isync
3561 cmpwi r8, 0
3562 bne 21f
3563 std r3, VCPU_MMCR(r9)
3564 b 22f
356521: mfspr r5, SPRN_MMCR1
3566 mfspr r7, SPRN_SIAR
3567 mfspr r8, SPRN_SDAR
3568 std r4, VCPU_MMCR(r9)
3569 std r5, VCPU_MMCR + 8(r9)
3570 std r6, VCPU_MMCRA(r9)
3571BEGIN_FTR_SECTION
3572 std r10, VCPU_MMCR + 16(r9)
3573END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
3574BEGIN_FTR_SECTION
3575 mfspr r5, SPRN_MMCR3
3576 mfspr r6, SPRN_SIER2
3577 mfspr r7, SPRN_SIER3
3578 std r5, VCPU_MMCR + 24(r9)
3579 std r6, VCPU_SIER + 8(r9)
3580 std r7, VCPU_SIER + 16(r9)
3581END_FTR_SECTION_IFSET(CPU_FTR_ARCH_31)
3582 std r7, VCPU_SIAR(r9)
3583 std r8, VCPU_SDAR(r9)
3584 mfspr r3, SPRN_PMC1
3585 mfspr r4, SPRN_PMC2
3586 mfspr r5, SPRN_PMC3
3587 mfspr r6, SPRN_PMC4
3588 mfspr r7, SPRN_PMC5
3589 mfspr r8, SPRN_PMC6
3590 stw r3, VCPU_PMC(r9)
3591 stw r4, VCPU_PMC + 4(r9)
3592 stw r5, VCPU_PMC + 8(r9)
3593 stw r6, VCPU_PMC + 12(r9)
3594 stw r7, VCPU_PMC + 16(r9)
3595 stw r8, VCPU_PMC + 20(r9)
3596BEGIN_FTR_SECTION
3597 mfspr r5, SPRN_SIER
3598 std r5, VCPU_SIER(r9)
3599BEGIN_FTR_SECTION_NESTED(96)
3600 mfspr r6, SPRN_SPMC1
3601 mfspr r7, SPRN_SPMC2
3602 mfspr r8, SPRN_MMCRS
3603 stw r6, VCPU_PMC + 24(r9)
3604 stw r7, VCPU_PMC + 28(r9)
3605 std r8, VCPU_MMCRS(r9)
3606 lis r4, 0x8000
3607 mtspr SPRN_MMCRS, r4
3608END_FTR_SECTION_NESTED(CPU_FTR_ARCH_300, 0, 96)
3609END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
361022: blr
3611
3612
3613
3614
3615
3616
3617
3618kvmppc_fix_pmao:
3619 li r3, 0
3620 mtspr SPRN_MMCR2, r3
3621 lis r3, (MMCR0_PMXE | MMCR0_FCECE)@h
3622 ori r3, r3, MMCR0_PMCjCE | MMCR0_C56RUN
3623 mtspr SPRN_MMCR0, r3
3624 lis r3, 0x7fff
3625 ori r3, r3, 0xffff
3626 mtspr SPRN_PMC6, r3
3627 isync
3628 blr
3629
3630#ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING
3631
3632
3633
3634
3635kvmhv_start_timing:
3636 ld r5, HSTATE_KVM_VCORE(r13)
3637 ld r6, VCORE_TB_OFFSET_APPL(r5)
3638 mftb r5
3639 subf r5, r6, r5
3640 std r3, VCPU_CUR_ACTIVITY(r4)
3641 std r5, VCPU_ACTIVITY_START(r4)
3642 blr
3643
3644
3645
3646
3647
3648kvmhv_accumulate_time:
3649 ld r5, HSTATE_KVM_VCORE(r13)
3650 ld r8, VCORE_TB_OFFSET_APPL(r5)
3651 ld r5, VCPU_CUR_ACTIVITY(r4)
3652 ld r6, VCPU_ACTIVITY_START(r4)
3653 std r3, VCPU_CUR_ACTIVITY(r4)
3654 mftb r7
3655 subf r7, r8, r7
3656 std r7, VCPU_ACTIVITY_START(r4)
3657 cmpdi r5, 0
3658 beqlr
3659 subf r3, r6, r7
3660 ld r8, TAS_SEQCOUNT(r5)
3661 cmpdi r8, 0
3662 addi r8, r8, 1
3663 std r8, TAS_SEQCOUNT(r5)
3664 lwsync
3665 ld r7, TAS_TOTAL(r5)
3666 add r7, r7, r3
3667 std r7, TAS_TOTAL(r5)
3668 ld r6, TAS_MIN(r5)
3669 ld r7, TAS_MAX(r5)
3670 beq 3f
3671 cmpd r3, r6
3672 bge 1f
36733: std r3, TAS_MIN(r5)
36741: cmpd r3, r7
3675 ble 2f
3676 std r3, TAS_MAX(r5)
36772: lwsync
3678 addi r8, r8, 1
3679 std r8, TAS_SEQCOUNT(r5)
3680 blr
3681#endif
3682