1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#include <asm/ppc_asm.h>
21#include <asm/kvm_asm.h>
22#include <asm/reg.h>
23#include <asm/mmu.h>
24#include <asm/page.h>
25#include <asm/ptrace.h>
26#include <asm/hvcall.h>
27#include <asm/asm-offsets.h>
28#include <asm/exception-64s.h>
29#include <asm/kvm_book3s_asm.h>
30#include <asm/mmu-hash64.h>
31#include <asm/tm.h>
32
33#define VCPU_GPRS_TM(reg) (((reg) * ULONG_SIZE) + VCPU_GPR_TM)
34
35#ifdef __LITTLE_ENDIAN__
36
37#endif
38
39
40#define NAPPING_CEDE 1
41#define NAPPING_NOVCPU 2
42
43
44
45
46
47
48
49
50
51_GLOBAL_TOC(kvmppc_hv_entry_trampoline)
52 mflr r0
53 std r0, PPC_LR_STKOFF(r1)
54 stdu r1, -112(r1)
55 mfmsr r10
56 LOAD_REG_ADDR(r5, kvmppc_call_hv_entry)
57 li r0,MSR_RI
58 andc r0,r10,r0
59 li r6,MSR_IR | MSR_DR
60 andc r6,r10,r6
61 mtmsrd r0,1
62 mtsrr0 r5
63 mtsrr1 r6
64 RFI
65
66kvmppc_call_hv_entry:
67 ld r4, HSTATE_KVM_VCPU(r13)
68 bl kvmppc_hv_entry
69
70
71
72BEGIN_FTR_SECTION
73
74 ld r5,HSTATE_DABR(r13)
75 li r6,7
76 mtspr SPRN_DABR,r5
77 mtspr SPRN_DABRX,r6
78END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
79
80
81 ld r3,PACA_SPRG_VDSO(r13)
82 mtspr SPRN_SPRG_VDSO_WRITE,r3
83
84
85 ld r3, PACALPPACAPTR(r13)
86 lbz r4, LPPACA_PMCINUSE(r3)
87 cmpwi r4, 0
88 beq 23f
89BEGIN_FTR_SECTION
90 ld r3, HSTATE_MMCR(r13)
91 andi. r4, r3, MMCR0_PMAO_SYNC | MMCR0_PMAO
92 cmpwi r4, MMCR0_PMAO
93 beql kvmppc_fix_pmao
94END_FTR_SECTION_IFSET(CPU_FTR_PMAO_BUG)
95 lwz r3, HSTATE_PMC(r13)
96 lwz r4, HSTATE_PMC + 4(r13)
97 lwz r5, HSTATE_PMC + 8(r13)
98 lwz r6, HSTATE_PMC + 12(r13)
99 lwz r8, HSTATE_PMC + 16(r13)
100 lwz r9, HSTATE_PMC + 20(r13)
101BEGIN_FTR_SECTION
102 lwz r10, HSTATE_PMC + 24(r13)
103 lwz r11, HSTATE_PMC + 28(r13)
104END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201)
105 mtspr SPRN_PMC1, r3
106 mtspr SPRN_PMC2, r4
107 mtspr SPRN_PMC3, r5
108 mtspr SPRN_PMC4, r6
109 mtspr SPRN_PMC5, r8
110 mtspr SPRN_PMC6, r9
111BEGIN_FTR_SECTION
112 mtspr SPRN_PMC7, r10
113 mtspr SPRN_PMC8, r11
114END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201)
115 ld r3, HSTATE_MMCR(r13)
116 ld r4, HSTATE_MMCR + 8(r13)
117 ld r5, HSTATE_MMCR + 16(r13)
118 ld r6, HSTATE_MMCR + 24(r13)
119 ld r7, HSTATE_MMCR + 32(r13)
120 mtspr SPRN_MMCR1, r4
121 mtspr SPRN_MMCRA, r5
122 mtspr SPRN_SIAR, r6
123 mtspr SPRN_SDAR, r7
124BEGIN_FTR_SECTION
125 ld r8, HSTATE_MMCR + 40(r13)
126 ld r9, HSTATE_MMCR + 48(r13)
127 mtspr SPRN_MMCR2, r8
128 mtspr SPRN_SIER, r9
129END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
130 mtspr SPRN_MMCR0, r3
131 isync
13223:
133
134
135
136
137
138 ld r3, HSTATE_DECEXP(r13)
139 mftb r4
140 subf r4, r4, r3
141 mtspr SPRN_DEC, r4
142
143
144
145
146
147
148
149
150
151
152
153
154 ld r8, 112+PPC_LR_STKOFF(r1)
155 addi r1, r1, 112
156 ld r7, HSTATE_HOST_MSR(r13)
157
158 cmpwi cr1, r12, BOOK3S_INTERRUPT_MACHINE_CHECK
159 cmpwi r12, BOOK3S_INTERRUPT_EXTERNAL
160BEGIN_FTR_SECTION
161 beq 11f
162END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206)
163
164
165 mfmsr r6
166 li r0, MSR_RI
167 andc r6, r6, r0
168 mtmsrd r6, 1
169 mtsrr0 r8
170 mtsrr1 r7
171 beqa 0x500
172 beq cr1, 13f
173 RFI
174
175
17611: mtspr SPRN_HSRR0, r8
177 mtspr SPRN_HSRR1, r7
178 ba 0x500
179
18013: b machine_check_fwnmi
181
182kvmppc_primary_no_guest:
183
184
185 ld r5, HSTATE_KVM_VCORE(r13)
186 lbz r7, HSTATE_PTID(r13)
187 li r0, 1
188 sld r0, r0, r7
189 addi r6, r5, VCORE_NAPPING_THREADS
1901: lwarx r3, 0, r6
191 or r3, r3, r0
192 stwcx. r3, 0, r6
193 bne 1b
194
195 isync
196 li r12, 0
197 lwz r7, VCORE_ENTRY_EXIT(r5)
198 cmpwi r7, 0x100
199 bge kvm_novcpu_exit
200 li r3, NAPPING_NOVCPU
201 stb r3, HSTATE_NAPPING(r13)
202 li r3, 1
203 stb r3, HSTATE_HWTHREAD_REQ(r13)
204
205 b kvm_do_nap
206
207kvm_novcpu_wakeup:
208 ld r1, HSTATE_HOST_R1(r13)
209 ld r5, HSTATE_KVM_VCORE(r13)
210 li r0, 0
211 stb r0, HSTATE_NAPPING(r13)
212 stb r0, HSTATE_HWTHREAD_REQ(r13)
213
214
215 bl kvmppc_check_wake_reason
216
217
218 lwz r0, VCORE_ENTRY_EXIT(r5)
219 cmpwi r0, 0x100
220 bge kvm_novcpu_exit
221
222
223 lbz r7, HSTATE_PTID(r13)
224 li r0, 1
225 sld r0, r0, r7
226 addi r6, r5, VCORE_NAPPING_THREADS
2274: lwarx r7, 0, r6
228 andc r7, r7, r0
229 stwcx. r7, 0, r6
230 bne 4b
231
232
233 cmpdi r3, 0
234 bge kvm_novcpu_exit
235
236
237 ld r4, HSTATE_KVM_VCPU(r13)
238 cmpdi r4, 0
239 bne kvmppc_got_guest
240
241kvm_novcpu_exit:
242 b hdec_soon
243
244
245
246
247
248
249 .globl kvm_start_guest
250kvm_start_guest:
251
252
253 mfspr r1, SPRN_CTRLF
254 ori r1, r1, 1
255 mtspr SPRN_CTRLT, r1
256
257 ld r2,PACATOC(r13)
258
259 li r0,KVM_HWTHREAD_IN_KVM
260 stb r0,HSTATE_HWTHREAD_STATE(r13)
261
262
263 li r0,1
264 stb r0,PACA_NAPSTATELOST(r13)
265
266
267 lbz r0,HSTATE_NAPPING(r13)
268 cmpwi r0,NAPPING_CEDE
269 beq kvm_end_cede
270 cmpwi r0,NAPPING_NOVCPU
271 beq kvm_novcpu_wakeup
272
273 ld r1,PACAEMERGSP(r13)
274 subi r1,r1,STACK_FRAME_OVERHEAD
275
276
277
278
279
280
281
282
283
284 bl kvmppc_check_wake_reason
285 cmpdi r3, 0
286 bge kvm_no_guest
287
288
289 ld r4,HSTATE_KVM_VCPU(r13)
290 cmpdi r4,0
291
292 beq kvm_no_guest
293
294
295 ld r6, PACA_DSCR(r13)
296 std r6, HSTATE_DSCR(r13)
297
298 bl kvmppc_hv_entry
299
300
301
302 li r0, 0
303 std r0, HSTATE_KVM_VCPU(r13)
304
305
306
307
308
309 lwsync
310
311
312 ld r4, HSTATE_KVM_VCORE(r13)
313 addi r4, r4, VCORE_NAP_COUNT
31451: lwarx r3, 0, r4
315 addi r3, r3, 1
316 stwcx. r3, 0, r4
317 bne 51b
318
319kvm_no_guest:
320 li r0, KVM_HWTHREAD_IN_NAP
321 stb r0, HSTATE_HWTHREAD_STATE(r13)
322kvm_do_nap:
323
324 mfspr r2, SPRN_CTRLF
325 clrrdi r2, r2, 1
326 mtspr SPRN_CTRLT, r2
327
328 li r3, LPCR_PECE0
329 mfspr r4, SPRN_LPCR
330 rlwimi r4, r3, 0, LPCR_PECE0 | LPCR_PECE1
331 mtspr SPRN_LPCR, r4
332 isync
333 std r0, HSTATE_SCRATCH0(r13)
334 ptesync
335 ld r0, HSTATE_SCRATCH0(r13)
3361: cmpd r0, r0
337 bne 1b
338 nap
339 b .
340
341
342
343
344
345
346
347.global kvmppc_hv_entry
348kvmppc_hv_entry:
349
350
351
352
353
354
355
356
357
358 mflr r0
359 std r0, PPC_LR_STKOFF(r1)
360 stdu r1, -112(r1)
361
362
363 std r1, HSTATE_HOST_R1(r13)
364
365 li r6, KVM_GUEST_MODE_HOST_HV
366 stb r6, HSTATE_IN_GUEST(r13)
367
368
369 li r6,0
370 slbmte r6,r6
371 slbia
372 ptesync
373
374BEGIN_FTR_SECTION
375 b 30f
376END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201)
377
378
379
380
381
382
383 ld r5,HSTATE_KVM_VCORE(r13)
384 addi r9,r5,VCORE_ENTRY_EXIT
38521: lwarx r3,0,r9
386 cmpwi r3,0x100
387 bge secondary_too_late
388 addi r3,r3,1
389 stwcx. r3,0,r9
390 bne 21b
391
392
393 ld r9,VCORE_KVM(r5)
394 lbz r6,HSTATE_PTID(r13)
395 cmpwi r6,0
396 bne 20f
397 ld r6,KVM_SDR1(r9)
398 lwz r7,KVM_LPID(r9)
399 li r0,LPID_RSVD
400 mtspr SPRN_LPID,r0
401 ptesync
402 mtspr SPRN_SDR1,r6
403 mtspr SPRN_LPID,r7
404 isync
405
406
407 lhz r6,PACAPACAINDEX(r13)
408 clrldi r7,r6,64-6
409 srdi r6,r6,6
410 sldi r6,r6,3
411 add r6,r6,r9
412 addi r6,r6,KVM_NEED_FLUSH
413 li r0,1
414 sld r0,r0,r7
415 ld r7,0(r6)
416 and. r7,r7,r0
417 beq 22f
41823: ldarx r7,0,r6
419 andc r7,r7,r0
420 stdcx. r7,0,r6
421 bne 23b
422
423
424BEGIN_FTR_SECTION
425 li r6,512
426FTR_SECTION_ELSE
427 li r6,128
428ALT_FTR_SECTION_END_IFSET(CPU_FTR_ARCH_207S)
429 mtctr r6
430 li r7,0x800
431 ptesync
43228: tlbiel r7
433 addi r7,r7,0x1000
434 bdnz 28b
435 ptesync
436
437
43822: ld r8,VCORE_TB_OFFSET(r5)
439 cmpdi r8,0
440 beq 37f
441 mftb r6
442 add r8,r8,r6
443 mtspr SPRN_TBU40,r8
444 mftb r7
445 clrldi r6,r6,40
446 clrldi r7,r7,40
447 cmpld r7,r6
448 bge 37f
449 addis r8,r8,0x100
450 mtspr SPRN_TBU40,r8
451
452
45337: ld r7, VCORE_PCR(r5)
454 cmpdi r7, 0
455 beq 38f
456 mtspr SPRN_PCR, r7
45738:
458
459BEGIN_FTR_SECTION
460
461 ld r8, VCORE_DPDES(r5)
462 mtspr SPRN_DPDES, r8
463END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
464
465 li r0,1
466 stb r0,VCORE_IN_GUEST(r5)
467 b 10f
468
469
47020: lbz r0,VCORE_IN_GUEST(r5)
471 cmpwi r0,0
472 beq 20b
473
474
47510: ld r8,VCORE_LPCR(r5)
476 mtspr SPRN_LPCR,r8
477 ld r8,KVM_RMOR(r9)
478 mtspr SPRN_RMOR,r8
479 isync
480
481
482 mfspr r3,SPRN_HDEC
483 cmpwi r3,512
484 li r12,BOOK3S_INTERRUPT_HV_DECREMENTER
485 blt hdec_soon
486 b 31f
487
488
489
490
491
492
493
494
495
49630: ld r5,HSTATE_KVM_VCORE(r13)
497 ld r9,VCORE_KVM(r5)
498
499
500 .section ".toc","aw"
501toc_tlbie_lock:
502 .tc native_tlbie_lock[TC],native_tlbie_lock
503 .previous
504 ld r3,toc_tlbie_lock@toc(2)
505#ifdef __BIG_ENDIAN__
506 lwz r8,PACA_LOCK_TOKEN(r13)
507#else
508 lwz r8,PACAPACAINDEX(r13)
509#endif
51024: lwarx r0,0,r3
511 cmpwi r0,0
512 bne 24b
513 stwcx. r8,0,r3
514 bne 24b
515 isync
516
517 ld r5,HSTATE_KVM_VCORE(r13)
518 ld r7,VCORE_LPCR(r5)
519 li r0,0x18f
520 rotldi r0,r0,HID4_LPID5_SH
521 or r0,r7,r0
522 ptesync
523 sync
524 mtspr SPRN_HID4,r0
525 isync
526 li r0,0
527 stw r0,0(r3)
528
529
530 li r0,256
531 mtctr r0
532 li r6,0
53325: tlbiel r6
534 addi r6,r6,0x1000
535 bdnz 25b
536 ptesync
537
538
539 addi r3,r9,KVM_TLBIE_LOCK
54024: lwarx r0,0,r3
541 cmpwi r0,0
542 bne 24b
543 stwcx. r8,0,r3
544 bne 24b
545 isync
546 ld r6,KVM_SDR1(r9)
547 mtspr SPRN_SDR1,r6
548
549
550 sync
551 mtspr SPRN_HID4,r7
552 isync
553
554
555 li r0,0
556 stw r0,0(r3)
557
558
559 mfspr r3,SPRN_HDEC
560 cmpwi r3,10
561 li r12,BOOK3S_INTERRUPT_HV_DECREMENTER
562 blt hdec_soon
563
564
565 mfspr r0,SPRN_HID0
566 li r3,1
567 rldimi r0,r3, HID0_HDICE_SH, 64-HID0_HDICE_SH-1
568 sync
569 mtspr SPRN_HID0,r0
570 mfspr r0,SPRN_HID0
571 mfspr r0,SPRN_HID0
572 mfspr r0,SPRN_HID0
573 mfspr r0,SPRN_HID0
574 mfspr r0,SPRN_HID0
575 mfspr r0,SPRN_HID0
57631:
577
578 cmpdi r4, 0
579 beq kvmppc_primary_no_guest
580kvmppc_got_guest:
581
582
583 lwz r5,VCPU_SLB_MAX(r4)
584 cmpwi r5,0
585 beq 9f
586 mtctr r5
587 addi r6,r4,VCPU_SLB
5881: ld r8,VCPU_SLB_E(r6)
589 ld r9,VCPU_SLB_V(r6)
590 slbmte r9,r8
591 addi r6,r6,VCPU_SLB_SIZE
592 bdnz 1b
5939:
594
595 ld r3, VCPU_VPA(r4)
596 cmpdi r3, 0
597 beq 25f
598 lwz r5, LPPACA_YIELDCOUNT(r3)
599 addi r5, r5, 1
600 stw r5, LPPACA_YIELDCOUNT(r3)
601 li r6, 1
602 stb r6, VCPU_VPA_DIRTY(r4)
60325:
604
605BEGIN_FTR_SECTION
606
607 mfspr r5,SPRN_PURR
608 mfspr r6,SPRN_SPURR
609 std r5,HSTATE_PURR(r13)
610 std r6,HSTATE_SPURR(r13)
611 ld r7,VCPU_PURR(r4)
612 ld r8,VCPU_SPURR(r4)
613 mtspr SPRN_PURR,r7
614 mtspr SPRN_SPURR,r8
615END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206)
616
617BEGIN_FTR_SECTION
618
619
620 lwz r5,VCPU_DABRX(r4)
621 ld r6,VCPU_DABR(r4)
622 mtspr SPRN_DABRX,r5
623 mtspr SPRN_DABR,r6
624 BEGIN_FTR_SECTION_NESTED(89)
625 isync
626 END_FTR_SECTION_NESTED(CPU_FTR_ARCH_206, CPU_FTR_ARCH_206, 89)
627END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
628
629#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
630BEGIN_FTR_SECTION
631 b skip_tm
632END_FTR_SECTION_IFCLR(CPU_FTR_TM)
633
634
635 mfmsr r5
636 li r6, MSR_TM >> 32
637 sldi r6, r6, 32
638 or r5, r5, r6
639 ori r5, r5, MSR_FP
640 oris r5, r5, (MSR_VEC | MSR_VSX)@h
641 mtmsrd r5
642
643
644
645
646
647 ld r5, VCPU_TFHAR(r4)
648 ld r6, VCPU_TFIAR(r4)
649 ld r7, VCPU_TEXASR(r4)
650 mtspr SPRN_TFHAR, r5
651 mtspr SPRN_TFIAR, r6
652 mtspr SPRN_TEXASR, r7
653
654 ld r5, VCPU_MSR(r4)
655 rldicl. r5, r5, 64 - MSR_TS_S_LG, 62
656 beq skip_tm
657
658
659
660
661
662
663 oris r7, r7, (TEXASR_FS)@h
664 mtspr SPRN_TEXASR, r7
665
666
667
668
669
670
671
672 mr r31, r4
673 addi r3, r31, VCPU_FPRS_TM
674 bl .load_fp_state
675 addi r3, r31, VCPU_VRS_TM
676 bl .load_vr_state
677 mr r4, r31
678 lwz r7, VCPU_VRSAVE_TM(r4)
679 mtspr SPRN_VRSAVE, r7
680
681 ld r5, VCPU_LR_TM(r4)
682 lwz r6, VCPU_CR_TM(r4)
683 ld r7, VCPU_CTR_TM(r4)
684 ld r8, VCPU_AMR_TM(r4)
685 ld r9, VCPU_TAR_TM(r4)
686 mtlr r5
687 mtcr r6
688 mtctr r7
689 mtspr SPRN_AMR, r8
690 mtspr SPRN_TAR, r9
691
692
693
694
695
696
697 ld r29, VCPU_DSCR_TM(r4)
698 ld r30, VCPU_PPR_TM(r4)
699
700 std r2, PACATMSCRATCH(r13)
701
702
703 li r5, 0
704 mtmsrd r5, 1
705
706
707 reg = 0
708 .rept 29
709 ld reg, VCPU_GPRS_TM(reg)(r31)
710 reg = reg + 1
711 .endr
712
713 mtspr SPRN_DSCR, r29
714 mtspr SPRN_PPR, r30
715
716
717 ld 29, VCPU_GPRS_TM(29)(r31)
718 ld 30, VCPU_GPRS_TM(30)(r31)
719 ld 31, VCPU_GPRS_TM(31)(r31)
720
721
722 TRECHKPT
723
724
725 HMT_MEDIUM
726 GET_PACA(r13)
727 ld r29, HSTATE_DSCR(r13)
728 mtspr SPRN_DSCR, r29
729 ld r4, HSTATE_KVM_VCPU(r13)
730 ld r1, HSTATE_HOST_R1(r13)
731 ld r2, PACATMSCRATCH(r13)
732
733
734 li r5, MSR_RI
735 mtmsrd r5, 1
736skip_tm:
737#endif
738
739
740
741 li r3, 1
742 sldi r3, r3, 31
743 mtspr SPRN_MMCR0, r3
744 isync
745BEGIN_FTR_SECTION
746 ld r3, VCPU_MMCR(r4)
747 andi. r5, r3, MMCR0_PMAO_SYNC | MMCR0_PMAO
748 cmpwi r5, MMCR0_PMAO
749 beql kvmppc_fix_pmao
750END_FTR_SECTION_IFSET(CPU_FTR_PMAO_BUG)
751 lwz r3, VCPU_PMC(r4)
752 lwz r5, VCPU_PMC + 4(r4)
753 lwz r6, VCPU_PMC + 8(r4)
754 lwz r7, VCPU_PMC + 12(r4)
755 lwz r8, VCPU_PMC + 16(r4)
756 lwz r9, VCPU_PMC + 20(r4)
757BEGIN_FTR_SECTION
758 lwz r10, VCPU_PMC + 24(r4)
759 lwz r11, VCPU_PMC + 28(r4)
760END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201)
761 mtspr SPRN_PMC1, r3
762 mtspr SPRN_PMC2, r5
763 mtspr SPRN_PMC3, r6
764 mtspr SPRN_PMC4, r7
765 mtspr SPRN_PMC5, r8
766 mtspr SPRN_PMC6, r9
767BEGIN_FTR_SECTION
768 mtspr SPRN_PMC7, r10
769 mtspr SPRN_PMC8, r11
770END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201)
771 ld r3, VCPU_MMCR(r4)
772 ld r5, VCPU_MMCR + 8(r4)
773 ld r6, VCPU_MMCR + 16(r4)
774 ld r7, VCPU_SIAR(r4)
775 ld r8, VCPU_SDAR(r4)
776 mtspr SPRN_MMCR1, r5
777 mtspr SPRN_MMCRA, r6
778 mtspr SPRN_SIAR, r7
779 mtspr SPRN_SDAR, r8
780BEGIN_FTR_SECTION
781 ld r5, VCPU_MMCR + 24(r4)
782 ld r6, VCPU_SIER(r4)
783 lwz r7, VCPU_PMC + 24(r4)
784 lwz r8, VCPU_PMC + 28(r4)
785 ld r9, VCPU_MMCR + 32(r4)
786 mtspr SPRN_MMCR2, r5
787 mtspr SPRN_SIER, r6
788 mtspr SPRN_SPMC1, r7
789 mtspr SPRN_SPMC2, r8
790 mtspr SPRN_MMCRS, r9
791END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
792 mtspr SPRN_MMCR0, r3
793 isync
794
795
796 bl kvmppc_load_fp
797
798 ld r14, VCPU_GPR(R14)(r4)
799 ld r15, VCPU_GPR(R15)(r4)
800 ld r16, VCPU_GPR(R16)(r4)
801 ld r17, VCPU_GPR(R17)(r4)
802 ld r18, VCPU_GPR(R18)(r4)
803 ld r19, VCPU_GPR(R19)(r4)
804 ld r20, VCPU_GPR(R20)(r4)
805 ld r21, VCPU_GPR(R21)(r4)
806 ld r22, VCPU_GPR(R22)(r4)
807 ld r23, VCPU_GPR(R23)(r4)
808 ld r24, VCPU_GPR(R24)(r4)
809 ld r25, VCPU_GPR(R25)(r4)
810 ld r26, VCPU_GPR(R26)(r4)
811 ld r27, VCPU_GPR(R27)(r4)
812 ld r28, VCPU_GPR(R28)(r4)
813 ld r29, VCPU_GPR(R29)(r4)
814 ld r30, VCPU_GPR(R30)(r4)
815 ld r31, VCPU_GPR(R31)(r4)
816
817BEGIN_FTR_SECTION
818
819 ld r5, VCPU_DSCR(r4)
820 mtspr SPRN_DSCR, r5
821END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206)
822
823BEGIN_FTR_SECTION
824
825 b 8f
826END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
827
828 mfmsr r8
829 li r0, 1
830 rldimi r8, r0, MSR_TM_LG, 63-MSR_TM_LG
831 mtmsrd r8
832
833
834 ld r5, VCPU_IAMR(r4)
835 lwz r6, VCPU_PSPB(r4)
836 ld r7, VCPU_FSCR(r4)
837 mtspr SPRN_IAMR, r5
838 mtspr SPRN_PSPB, r6
839 mtspr SPRN_FSCR, r7
840 ld r5, VCPU_DAWR(r4)
841 ld r6, VCPU_DAWRX(r4)
842 ld r7, VCPU_CIABR(r4)
843 ld r8, VCPU_TAR(r4)
844 mtspr SPRN_DAWR, r5
845 mtspr SPRN_DAWRX, r6
846 mtspr SPRN_CIABR, r7
847 mtspr SPRN_TAR, r8
848 ld r5, VCPU_IC(r4)
849 ld r6, VCPU_VTB(r4)
850 mtspr SPRN_IC, r5
851 mtspr SPRN_VTB, r6
852 ld r8, VCPU_EBBHR(r4)
853 mtspr SPRN_EBBHR, r8
854 ld r5, VCPU_EBBRR(r4)
855 ld r6, VCPU_BESCR(r4)
856 ld r7, VCPU_CSIGR(r4)
857 ld r8, VCPU_TACR(r4)
858 mtspr SPRN_EBBRR, r5
859 mtspr SPRN_BESCR, r6
860 mtspr SPRN_CSIGR, r7
861 mtspr SPRN_TACR, r8
862 ld r5, VCPU_TCSCR(r4)
863 ld r6, VCPU_ACOP(r4)
864 lwz r7, VCPU_GUEST_PID(r4)
865 ld r8, VCPU_WORT(r4)
866 mtspr SPRN_TCSCR, r5
867 mtspr SPRN_ACOP, r6
868 mtspr SPRN_PID, r7
869 mtspr SPRN_WORT, r8
8708:
871
872
873
874
875 ld r8,VCPU_DEC_EXPIRES(r4)
876
877 ld r5,HSTATE_KVM_VCORE(r13)
878 ld r6,VCORE_TB_OFFSET(r5)
879 add r8,r8,r6
880 mftb r7
881 subf r3,r7,r8
882 mtspr SPRN_DEC,r3
883 stw r3,VCPU_DEC(r4)
884
885 ld r5, VCPU_SPRG0(r4)
886 ld r6, VCPU_SPRG1(r4)
887 ld r7, VCPU_SPRG2(r4)
888 ld r8, VCPU_SPRG3(r4)
889 mtspr SPRN_SPRG0, r5
890 mtspr SPRN_SPRG1, r6
891 mtspr SPRN_SPRG2, r7
892 mtspr SPRN_SPRG3, r8
893
894
895 ld r5, VCPU_DAR(r4)
896 lwz r6, VCPU_DSISR(r4)
897 mtspr SPRN_DAR, r5
898 mtspr SPRN_DSISR, r6
899
900BEGIN_FTR_SECTION
901
902 ld r5,VCPU_AMR(r4)
903 ld r6,VCPU_UAMOR(r4)
904 li r7,-1
905 mtspr SPRN_AMR,r5
906 mtspr SPRN_UAMOR,r6
907 mtspr SPRN_AMOR,r7
908END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206)
909
910
911 lwz r5,VCPU_CTRL(r4)
912 andi. r5,r5,1
913 bne 4f
914 mfspr r6,SPRN_CTRLF
915 clrrdi r6,r6,1
916 mtspr SPRN_CTRLT,r6
9174:
918 ld r6, VCPU_CTR(r4)
919 lwz r7, VCPU_XER(r4)
920
921 mtctr r6
922 mtxer r7
923
924kvmppc_cede_reentry:
925 ld r10, VCPU_PC(r4)
926 ld r11, VCPU_MSR(r4)
927 ld r6, VCPU_SRR0(r4)
928 ld r7, VCPU_SRR1(r4)
929 mtspr SPRN_SRR0, r6
930 mtspr SPRN_SRR1, r7
931
932deliver_guest_interrupt:
933
934 rldicl r11, r11, 63 - MSR_HV_LG, 1
935 rotldi r11, r11, 1 + MSR_HV_LG
936 ori r11, r11, MSR_ME
937
938
939 ld r0, VCPU_PENDING_EXC(r4)
940 rldicl r0, r0, 64 - BOOK3S_IRQPRIO_EXTERNAL_LEVEL, 63
941 cmpdi cr1, r0, 0
942 andi. r8, r11, MSR_EE
943BEGIN_FTR_SECTION
944 mfspr r8, SPRN_LPCR
945
946 rldimi r8, r0, LPCR_MER_SH, 63 - LPCR_MER_SH
947 mtspr SPRN_LPCR, r8
948 isync
949END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206)
950 beq 5f
951 li r0, BOOK3S_INTERRUPT_EXTERNAL
952 bne cr1, 12f
953 mfspr r0, SPRN_DEC
954 cmpwi r0, 0
955 li r0, BOOK3S_INTERRUPT_DECREMENTER
956 bge 5f
957
95812: mtspr SPRN_SRR0, r10
959 mr r10,r0
960 mtspr SPRN_SRR1, r11
961 mr r9, r4
962 bl kvmppc_msr_interrupt
9635:
964
965
966
967
968
969
970
971
972fast_guest_return:
973 li r0,0
974 stb r0,VCPU_CEDED(r4)
975 mtspr SPRN_HSRR0,r10
976 mtspr SPRN_HSRR1,r11
977
978
979 li r9, KVM_GUEST_MODE_GUEST_HV
980 stb r9, HSTATE_IN_GUEST(r13)
981
982
983
984BEGIN_FTR_SECTION
985 ld r5, VCPU_CFAR(r4)
986 mtspr SPRN_CFAR, r5
987END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
988BEGIN_FTR_SECTION
989 ld r0, VCPU_PPR(r4)
990END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
991
992 ld r5, VCPU_LR(r4)
993 lwz r6, VCPU_CR(r4)
994 mtlr r5
995 mtcr r6
996
997 ld r1, VCPU_GPR(R1)(r4)
998 ld r2, VCPU_GPR(R2)(r4)
999 ld r3, VCPU_GPR(R3)(r4)
1000 ld r5, VCPU_GPR(R5)(r4)
1001 ld r6, VCPU_GPR(R6)(r4)
1002 ld r7, VCPU_GPR(R7)(r4)
1003 ld r8, VCPU_GPR(R8)(r4)
1004 ld r9, VCPU_GPR(R9)(r4)
1005 ld r10, VCPU_GPR(R10)(r4)
1006 ld r11, VCPU_GPR(R11)(r4)
1007 ld r12, VCPU_GPR(R12)(r4)
1008 ld r13, VCPU_GPR(R13)(r4)
1009
1010BEGIN_FTR_SECTION
1011 mtspr SPRN_PPR, r0
1012END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
1013 ld r0, VCPU_GPR(R0)(r4)
1014 ld r4, VCPU_GPR(R4)(r4)
1015
1016 hrfid
1017 b .
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028 .globl kvmppc_interrupt_hv
1029kvmppc_interrupt_hv:
1030
1031
1032
1033
1034
1035
1036
1037 std r9, HSTATE_SCRATCH2(r13)
1038
1039 lbz r9, HSTATE_IN_GUEST(r13)
1040 cmpwi r9, KVM_GUEST_MODE_HOST_HV
1041 beq kvmppc_bad_host_intr
1042#ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
1043 cmpwi r9, KVM_GUEST_MODE_GUEST
1044 ld r9, HSTATE_SCRATCH2(r13)
1045 beq kvmppc_interrupt_pr
1046#endif
1047
1048 li r9, KVM_GUEST_MODE_HOST_HV
1049 stb r9, HSTATE_IN_GUEST(r13)
1050
1051 ld r9, HSTATE_KVM_VCPU(r13)
1052
1053
1054
1055 std r0, VCPU_GPR(R0)(r9)
1056 std r1, VCPU_GPR(R1)(r9)
1057 std r2, VCPU_GPR(R2)(r9)
1058 std r3, VCPU_GPR(R3)(r9)
1059 std r4, VCPU_GPR(R4)(r9)
1060 std r5, VCPU_GPR(R5)(r9)
1061 std r6, VCPU_GPR(R6)(r9)
1062 std r7, VCPU_GPR(R7)(r9)
1063 std r8, VCPU_GPR(R8)(r9)
1064 ld r0, HSTATE_SCRATCH2(r13)
1065 std r0, VCPU_GPR(R9)(r9)
1066 std r10, VCPU_GPR(R10)(r9)
1067 std r11, VCPU_GPR(R11)(r9)
1068 ld r3, HSTATE_SCRATCH0(r13)
1069 lwz r4, HSTATE_SCRATCH1(r13)
1070 std r3, VCPU_GPR(R12)(r9)
1071 stw r4, VCPU_CR(r9)
1072BEGIN_FTR_SECTION
1073 ld r3, HSTATE_CFAR(r13)
1074 std r3, VCPU_CFAR(r9)
1075END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
1076BEGIN_FTR_SECTION
1077 ld r4, HSTATE_PPR(r13)
1078 std r4, VCPU_PPR(r9)
1079END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
1080
1081
1082 ld r1, HSTATE_HOST_R1(r13)
1083 ld r2, PACATOC(r13)
1084
1085 mfspr r10, SPRN_SRR0
1086 mfspr r11, SPRN_SRR1
1087 std r10, VCPU_SRR0(r9)
1088 std r11, VCPU_SRR1(r9)
1089 andi. r0, r12, 2
1090 beq 1f
1091 mfspr r10, SPRN_HSRR0
1092 mfspr r11, SPRN_HSRR1
1093 clrrdi r12, r12, 2
10941: std r10, VCPU_PC(r9)
1095 std r11, VCPU_MSR(r9)
1096
1097 GET_SCRATCH0(r3)
1098 mflr r4
1099 std r3, VCPU_GPR(R13)(r9)
1100 std r4, VCPU_LR(r9)
1101
1102 stw r12,VCPU_TRAP(r9)
1103
1104
1105
1106 li r3,KVM_INST_FETCH_FAILED
1107BEGIN_FTR_SECTION
1108 cmpwi r12,BOOK3S_INTERRUPT_H_EMUL_ASSIST
1109 bne 11f
1110 mfspr r3,SPRN_HEIR
1111END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206)
111211: stw r3,VCPU_LAST_INST(r9)
1113
1114
1115 mfctr r3
1116 mfxer r4
1117 std r3, VCPU_CTR(r9)
1118 stw r4, VCPU_XER(r9)
1119
1120BEGIN_FTR_SECTION
1121
1122 cmpwi r12, BOOK3S_INTERRUPT_H_DATA_STORAGE
1123 beq kvmppc_hdsi
1124 cmpwi r12, BOOK3S_INTERRUPT_H_INST_STORAGE
1125 beq kvmppc_hisi
1126END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206)
1127
1128
1129 cmpwi r12,BOOK3S_INTERRUPT_HV_DECREMENTER
1130 bne 2f
1131 mfspr r3,SPRN_HDEC
1132 cmpwi r3,0
1133 bge ignore_hdec
11342:
1135
1136 cmpwi r12,BOOK3S_INTERRUPT_SYSCALL
1137 beq hcall_try_real_mode
1138
1139
1140BEGIN_FTR_SECTION
1141 b ext_interrupt_to_host
1142END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_206)
1143
1144
1145 cmpwi r12, BOOK3S_INTERRUPT_EXTERNAL
1146 bne+ ext_interrupt_to_host
1147
1148
1149
1150
1151 bl kvmppc_read_intr
1152 cmpdi r3, 0
1153 bgt ext_interrupt_to_host
1154
1155
1156 ld r5, HSTATE_KVM_VCORE(r13)
1157 lwz r0, VCORE_ENTRY_EXIT(r5)
1158 cmpwi r0, 0x100
1159 bge ext_interrupt_to_host
1160
1161
1162 mr r4, r9
1163 b deliver_guest_interrupt
1164
1165ext_interrupt_to_host:
1166
1167guest_exit_cont:
1168
1169 mfdar r6
1170 mfdsisr r7
1171 std r6, VCPU_DAR(r9)
1172 stw r7, VCPU_DSISR(r9)
1173BEGIN_FTR_SECTION
1174
1175 cmpwi r12,BOOK3S_INTERRUPT_H_DATA_STORAGE
1176 beq 6f
1177END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206)
1178 std r6, VCPU_FAULT_DAR(r9)
1179 stw r7, VCPU_FAULT_DSISR(r9)
1180
1181
1182 cmpwi r12, BOOK3S_INTERRUPT_MACHINE_CHECK
1183 beq machine_check_realmode
1184mc_cont:
1185
1186
11876: mfspr r6,SPRN_CTRLF
1188 stw r6,VCPU_CTRL(r9)
1189 andi. r0,r6,1
1190 bne 4f
1191 ori r6,r6,1
1192 mtspr SPRN_CTRLT,r6
11934:
1194
1195 lwz r0,VCPU_SLB_NR(r9)
1196 mtctr r0
1197 li r6,0
1198 addi r7,r9,VCPU_SLB
1199 li r5,0
12001: slbmfee r8,r6
1201 andis. r0,r8,SLB_ESID_V@h
1202 beq 2f
1203 add r8,r8,r6
1204 slbmfev r3,r6
1205 std r8,VCPU_SLB_E(r7)
1206 std r3,VCPU_SLB_V(r7)
1207 addi r7,r7,VCPU_SLB_SIZE
1208 addi r5,r5,1
12092: addi r6,r6,1
1210 bdnz 1b
1211 stw r5,VCPU_SLB_MAX(r9)
1212
1213
1214
1215
1216BEGIN_FTR_SECTION
1217 mfspr r5,SPRN_PURR
1218 mfspr r6,SPRN_SPURR
1219 ld r7,VCPU_PURR(r9)
1220 ld r8,VCPU_SPURR(r9)
1221 std r5,VCPU_PURR(r9)
1222 std r6,VCPU_SPURR(r9)
1223 subf r5,r7,r5
1224 subf r6,r8,r6
1225
1226
1227
1228
1229
1230 ld r3,HSTATE_PURR(r13)
1231 ld r4,HSTATE_SPURR(r13)
1232 add r3,r3,r5
1233 add r4,r4,r6
1234 mtspr SPRN_PURR,r3
1235 mtspr SPRN_SPURR,r4
1236END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_201)
1237
1238
1239 mfspr r5,SPRN_DEC
1240 mftb r6
1241 extsw r5,r5
1242 add r5,r5,r6
1243
1244 ld r3,HSTATE_KVM_VCORE(r13)
1245 ld r4,VCORE_TB_OFFSET(r3)
1246 subf r5,r4,r5
1247 std r5,VCPU_DEC_EXPIRES(r9)
1248
1249BEGIN_FTR_SECTION
1250 b 8f
1251END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
1252
1253 mfspr r5, SPRN_IAMR
1254 mfspr r6, SPRN_PSPB
1255 mfspr r7, SPRN_FSCR
1256 std r5, VCPU_IAMR(r9)
1257 stw r6, VCPU_PSPB(r9)
1258 std r7, VCPU_FSCR(r9)
1259 mfspr r5, SPRN_IC
1260 mfspr r6, SPRN_VTB
1261 mfspr r7, SPRN_TAR
1262 std r5, VCPU_IC(r9)
1263 std r6, VCPU_VTB(r9)
1264 std r7, VCPU_TAR(r9)
1265 mfspr r8, SPRN_EBBHR
1266 std r8, VCPU_EBBHR(r9)
1267 mfspr r5, SPRN_EBBRR
1268 mfspr r6, SPRN_BESCR
1269 mfspr r7, SPRN_CSIGR
1270 mfspr r8, SPRN_TACR
1271 std r5, VCPU_EBBRR(r9)
1272 std r6, VCPU_BESCR(r9)
1273 std r7, VCPU_CSIGR(r9)
1274 std r8, VCPU_TACR(r9)
1275 mfspr r5, SPRN_TCSCR
1276 mfspr r6, SPRN_ACOP
1277 mfspr r7, SPRN_PID
1278 mfspr r8, SPRN_WORT
1279 std r5, VCPU_TCSCR(r9)
1280 std r6, VCPU_ACOP(r9)
1281 stw r7, VCPU_GUEST_PID(r9)
1282 std r8, VCPU_WORT(r9)
12838:
1284
1285
1286BEGIN_FTR_SECTION
1287 mfspr r5,SPRN_AMR
1288 mfspr r6,SPRN_UAMOR
1289 std r5,VCPU_AMR(r9)
1290 std r6,VCPU_UAMOR(r9)
1291 li r6,0
1292 mtspr SPRN_AMR,r6
1293END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206)
1294
1295
1296BEGIN_FTR_SECTION
1297 mfspr r8, SPRN_DSCR
1298 ld r7, HSTATE_DSCR(r13)
1299 std r8, VCPU_DSCR(r9)
1300 mtspr SPRN_DSCR, r7
1301END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206)
1302
1303
1304 std r14, VCPU_GPR(R14)(r9)
1305 std r15, VCPU_GPR(R15)(r9)
1306 std r16, VCPU_GPR(R16)(r9)
1307 std r17, VCPU_GPR(R17)(r9)
1308 std r18, VCPU_GPR(R18)(r9)
1309 std r19, VCPU_GPR(R19)(r9)
1310 std r20, VCPU_GPR(R20)(r9)
1311 std r21, VCPU_GPR(R21)(r9)
1312 std r22, VCPU_GPR(R22)(r9)
1313 std r23, VCPU_GPR(R23)(r9)
1314 std r24, VCPU_GPR(R24)(r9)
1315 std r25, VCPU_GPR(R25)(r9)
1316 std r26, VCPU_GPR(R26)(r9)
1317 std r27, VCPU_GPR(R27)(r9)
1318 std r28, VCPU_GPR(R28)(r9)
1319 std r29, VCPU_GPR(R29)(r9)
1320 std r30, VCPU_GPR(R30)(r9)
1321 std r31, VCPU_GPR(R31)(r9)
1322
1323
1324 mfspr r3, SPRN_SPRG0
1325 mfspr r4, SPRN_SPRG1
1326 mfspr r5, SPRN_SPRG2
1327 mfspr r6, SPRN_SPRG3
1328 std r3, VCPU_SPRG0(r9)
1329 std r4, VCPU_SPRG1(r9)
1330 std r5, VCPU_SPRG2(r9)
1331 std r6, VCPU_SPRG3(r9)
1332
1333
1334 mr r3, r9
1335 bl kvmppc_save_fp
1336
1337#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1338BEGIN_FTR_SECTION
1339 b 2f
1340END_FTR_SECTION_IFCLR(CPU_FTR_TM)
1341
1342 mfmsr r8
1343 li r0, 1
1344 rldimi r8, r0, MSR_TM_LG, 63-MSR_TM_LG
1345 mtmsrd r8
1346
1347 ld r5, VCPU_MSR(r9)
1348 rldicl. r5, r5, 64 - MSR_TS_S_LG, 62
1349 beq 1f
1350
1351 li r3, TM_CAUSE_KVM_RESCHED
1352
1353
1354 li r5, 0
1355 mtmsrd r5, 1
1356
1357
1358 TRECLAIM(R3)
1359
1360
1361 SET_SCRATCH0(r13)
1362 GET_PACA(r13)
1363 std r9, PACATMSCRATCH(r13)
1364 ld r9, HSTATE_KVM_VCPU(r13)
1365
1366
1367 std r29, VCPU_GPRS_TM(29)(r9)
1368 std r30, VCPU_GPRS_TM(30)(r9)
1369 std r31, VCPU_GPRS_TM(31)(r9)
1370
1371
1372 mfspr r31, SPRN_PPR
1373 HMT_MEDIUM
1374 mfspr r30, SPRN_DSCR
1375 ld r29, HSTATE_DSCR(r13)
1376 mtspr SPRN_DSCR, r29
1377
1378
1379 reg = 0
1380 .rept 29
1381 .if (reg != 9) && (reg != 13)
1382 std reg, VCPU_GPRS_TM(reg)(r9)
1383 .endif
1384 reg = reg + 1
1385 .endr
1386
1387 GET_SCRATCH0(r4)
1388 std r4, VCPU_GPRS_TM(13)(r9)
1389
1390 ld r4, PACATMSCRATCH(r13)
1391 std r4, VCPU_GPRS_TM(9)(r9)
1392
1393
1394 ld r1, HSTATE_HOST_R1(r13)
1395 ld r2, PACATOC(r13)
1396
1397
1398 li r5, MSR_RI
1399 mtmsrd r5, 1
1400
1401
1402 std r31, VCPU_PPR_TM(r9)
1403 std r30, VCPU_DSCR_TM(r9)
1404 mflr r5
1405 mfcr r6
1406 mfctr r7
1407 mfspr r8, SPRN_AMR
1408 mfspr r10, SPRN_TAR
1409 std r5, VCPU_LR_TM(r9)
1410 stw r6, VCPU_CR_TM(r9)
1411 std r7, VCPU_CTR_TM(r9)
1412 std r8, VCPU_AMR_TM(r9)
1413 std r10, VCPU_TAR_TM(r9)
1414
1415
1416 lwz r12, VCPU_TRAP(r9)
1417
1418
1419 addi r3, r9, VCPU_FPRS_TM
1420 bl .store_fp_state
1421 addi r3, r9, VCPU_VRS_TM
1422 bl .store_vr_state
1423 mfspr r6, SPRN_VRSAVE
1424 stw r6, VCPU_VRSAVE_TM(r9)
14251:
1426
1427
1428
1429
1430
1431
1432 mfspr r5, SPRN_TFHAR
1433 mfspr r6, SPRN_TFIAR
1434 mfspr r7, SPRN_TEXASR
1435 std r5, VCPU_TFHAR(r9)
1436 std r6, VCPU_TFIAR(r9)
1437 std r7, VCPU_TEXASR(r9)
14382:
1439#endif
1440
1441
1442 ld r8, VCPU_VPA(r9)
1443 cmpdi r8, 0
1444 beq 25f
1445 lwz r3, LPPACA_YIELDCOUNT(r8)
1446 addi r3, r3, 1
1447 stw r3, LPPACA_YIELDCOUNT(r8)
1448 li r3, 1
1449 stb r3, VCPU_VPA_DIRTY(r9)
145025:
1451
1452
1453BEGIN_FTR_SECTION
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471 li r3, -1
1472 clrrdi r3, r3, 10
1473 mfspr r10, SPRN_MMCR2
1474 mtspr SPRN_MMCR2, r3
1475 isync
1476END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
1477 li r3, 1
1478 sldi r3, r3, 31
1479 mfspr r4, SPRN_MMCR0
1480 mtspr SPRN_MMCR0, r3
1481 mfspr r6, SPRN_MMCRA
1482BEGIN_FTR_SECTION
1483
1484 li r7, 0
1485 mtspr SPRN_MMCRA, r7
1486END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206)
1487 isync
1488 beq 21f
1489 lbz r7, LPPACA_PMCINUSE(r8)
1490 cmpwi r7, 0
1491 bne 21f
1492 std r3, VCPU_MMCR(r9)
1493 b 22f
149421: mfspr r5, SPRN_MMCR1
1495 mfspr r7, SPRN_SIAR
1496 mfspr r8, SPRN_SDAR
1497 std r4, VCPU_MMCR(r9)
1498 std r5, VCPU_MMCR + 8(r9)
1499 std r6, VCPU_MMCR + 16(r9)
1500BEGIN_FTR_SECTION
1501 std r10, VCPU_MMCR + 24(r9)
1502END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
1503 std r7, VCPU_SIAR(r9)
1504 std r8, VCPU_SDAR(r9)
1505 mfspr r3, SPRN_PMC1
1506 mfspr r4, SPRN_PMC2
1507 mfspr r5, SPRN_PMC3
1508 mfspr r6, SPRN_PMC4
1509 mfspr r7, SPRN_PMC5
1510 mfspr r8, SPRN_PMC6
1511BEGIN_FTR_SECTION
1512 mfspr r10, SPRN_PMC7
1513 mfspr r11, SPRN_PMC8
1514END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201)
1515 stw r3, VCPU_PMC(r9)
1516 stw r4, VCPU_PMC + 4(r9)
1517 stw r5, VCPU_PMC + 8(r9)
1518 stw r6, VCPU_PMC + 12(r9)
1519 stw r7, VCPU_PMC + 16(r9)
1520 stw r8, VCPU_PMC + 20(r9)
1521BEGIN_FTR_SECTION
1522 stw r10, VCPU_PMC + 24(r9)
1523 stw r11, VCPU_PMC + 28(r9)
1524END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201)
1525BEGIN_FTR_SECTION
1526 mfspr r5, SPRN_SIER
1527 mfspr r6, SPRN_SPMC1
1528 mfspr r7, SPRN_SPMC2
1529 mfspr r8, SPRN_MMCRS
1530 std r5, VCPU_SIER(r9)
1531 stw r6, VCPU_PMC + 24(r9)
1532 stw r7, VCPU_PMC + 28(r9)
1533 std r8, VCPU_MMCR + 32(r9)
1534 lis r4, 0x8000
1535 mtspr SPRN_MMCRS, r4
1536END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
153722:
1538
1539 li r5,0
1540 slbmte r5,r5
1541 slbia
1542 ptesync
1543
1544hdec_soon:
1545BEGIN_FTR_SECTION
1546 b 32f
1547END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201)
1548
1549
1550
1551
1552
1553
1554
1555 ld r5,HSTATE_KVM_VCORE(r13)
1556 addi r6,r5,VCORE_ENTRY_EXIT
155741: lwarx r3,0,r6
1558 addi r0,r3,0x100
1559 stwcx. r0,0,r6
1560 bne 41b
1561 isync
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575 cmpwi r3,0x100
1576 bge 43f
1577 cmpwi r12,BOOK3S_INTERRUPT_HV_DECREMENTER
1578 beq 40f
1579 li r0,0
1580 mtspr SPRN_HDEC,r0
158140:
1582
1583
1584
1585
1586 lwz r3,VCORE_NAPPING_THREADS(r5)
1587 lbz r4,HSTATE_PTID(r13)
1588 li r0,1
1589 sld r0,r0,r4
1590 andc. r3,r3,r0
1591 beq 43f
1592
1593 sync
1594 mulli r4,r4,PACA_SIZE
1595 subf r6,r4,r13
159642: andi. r0,r3,1
1597 beq 44f
1598 ld r8,HSTATE_XICS_PHYS(r6)
1599 li r0,IPI_PRIORITY
1600 li r7,XICS_MFRR
1601 stbcix r0,r7,r8
160244: srdi. r3,r3,1
1603 addi r6,r6,PACA_SIZE
1604 bne 42b
1605
1606secondary_too_late:
1607
160843: ld r5,HSTATE_KVM_VCORE(r13)
1609 ld r4,VCORE_KVM(r5)
1610 lbz r3,HSTATE_PTID(r13)
1611 cmpwi r3,0
1612 beq 15f
1613 HMT_LOW
161413: lbz r3,VCORE_IN_GUEST(r5)
1615 cmpwi r3,0
1616 bne 13b
1617 HMT_MEDIUM
1618 b 16f
1619
1620
162115: lwz r3,VCORE_ENTRY_EXIT(r5)
1622 srwi r0,r3,8
1623 clrldi r3,r3,56
1624 cmpw r3,r0
1625 bne 15b
1626 isync
1627
1628
1629 ld r6,KVM_HOST_SDR1(r4)
1630 lwz r7,KVM_HOST_LPID(r4)
1631 li r8,LPID_RSVD
1632 mtspr SPRN_LPID,r8
1633 ptesync
1634 mtspr SPRN_SDR1,r6
1635 mtspr SPRN_LPID,r7
1636 isync
1637
1638BEGIN_FTR_SECTION
1639
1640 mfspr r7, SPRN_DPDES
1641 std r7, VCORE_DPDES(r5)
1642
1643 li r8, 0
1644 mtspr SPRN_DPDES, r8
1645END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
1646
1647
1648 ld r8,VCORE_TB_OFFSET(r5)
1649 cmpdi r8,0
1650 beq 17f
1651 mftb r6
1652 subf r8,r8,r6
1653 mtspr SPRN_TBU40,r8
1654 mftb r7
1655 clrldi r6,r6,40
1656 clrldi r7,r7,40
1657 cmpld r7,r6
1658 bge 17f
1659 addis r8,r8,0x100
1660 mtspr SPRN_TBU40,r8
1661
1662
166317: ld r0, VCORE_PCR(r5)
1664 cmpdi r0, 0
1665 beq 18f
1666 li r0, 0
1667 mtspr SPRN_PCR, r0
166818:
1669
1670 stb r0,VCORE_IN_GUEST(r5)
1671 lis r8,0x7fff
1672 mtspr SPRN_HDEC,r8
1673
167416: ld r8,KVM_HOST_LPCR(r4)
1675 mtspr SPRN_LPCR,r8
1676 isync
1677 b 33f
1678
1679
1680
1681
1682
1683
168432: ld r5,HSTATE_KVM_VCORE(r13)
1685 ld r4,VCORE_KVM(r5)
1686
1687
1688#ifdef __BIG_ENDIAN__
1689 lwz r8,PACA_LOCK_TOKEN(r13)
1690#else
1691 lwz r8,PACAPACAINDEX(r13)
1692#endif
1693 addi r3,r4,KVM_TLBIE_LOCK
169424: lwarx r0,0,r3
1695 cmpwi r0,0
1696 bne 24b
1697 stwcx. r8,0,r3
1698 bne 24b
1699 isync
1700
1701 ld r7,KVM_HOST_LPCR(r4)
1702 li r0,0x18f
1703 rotldi r0,r0,HID4_LPID5_SH
1704 or r0,r7,r0
1705 ptesync
1706 sync
1707 mtspr SPRN_HID4,r0
1708 isync
1709 li r0,0
1710 stw r0,0(r3)
1711
1712
1713 li r0,256
1714 mtctr r0
1715 li r6,0
171625: tlbiel r6
1717 addi r6,r6,0x1000
1718 bdnz 25b
1719 ptesync
1720
1721
1722 ld r3,toc_tlbie_lock@toc(2)
172324: lwarx r0,0,r3
1724 cmpwi r0,0
1725 bne 24b
1726 stwcx. r8,0,r3
1727 bne 24b
1728 isync
1729
1730 ld r6,KVM_HOST_SDR1(r4)
1731 mtspr SPRN_SDR1,r6
1732
1733
1734 sync
1735 mtspr SPRN_HID4,r7
1736 isync
1737 li r0,0
1738 stw r0,0(r3)
1739
1740 lis r8,0x7fff
1741 mtspr SPRN_HDEC,r8
1742
1743
1744 mfspr r0,SPRN_HID0
1745 li r3,0
1746 rldimi r0,r3, HID0_HDICE_SH, 64-HID0_HDICE_SH-1
1747 sync
1748 mtspr SPRN_HID0,r0
1749 mfspr r0,SPRN_HID0
1750 mfspr r0,SPRN_HID0
1751 mfspr r0,SPRN_HID0
1752 mfspr r0,SPRN_HID0
1753 mfspr r0,SPRN_HID0
1754 mfspr r0,SPRN_HID0
1755
1756
175733: ld r8,PACA_SLBSHADOWPTR(r13)
1758
1759 .rept SLB_NUM_BOLTED
1760 ld r5,SLBSHADOW_SAVEAREA(r8)
1761 ld r6,SLBSHADOW_SAVEAREA+8(r8)
1762 andis. r7,r5,SLB_ESID_V@h
1763 beq 1f
1764 slbmte r6,r5
17651: addi r8,r8,16
1766 .endr
1767
1768
1769 li r0, KVM_GUEST_MODE_NONE
1770 stb r0, HSTATE_IN_GUEST(r13)
1771
1772 ld r0, 112+PPC_LR_STKOFF(r1)
1773 addi r1, r1, 112
1774 mtlr r0
1775 blr
1776
1777
1778
1779
1780
1781
1782
1783
1784kvmppc_hdsi:
1785 mfspr r4, SPRN_HDAR
1786 mfspr r6, SPRN_HDSISR
1787
1788 andis. r0, r6, (DSISR_NOHPTE | DSISR_PROTFAULT)@h
1789 beq 1f
1790 andi. r0, r11, MSR_DR
1791 beq 3f
1792 clrrdi r0, r4, 28
1793 PPC_SLBFEE_DOT(R5, R0)
1794 bne 1f
17954: std r4, VCPU_FAULT_DAR(r9)
1796 stw r6, VCPU_FAULT_DSISR(r9)
1797
1798
1799 mr r3, r9
1800 li r7, 1
1801 bl kvmppc_hpte_hv_fault
1802 ld r9, HSTATE_KVM_VCPU(r13)
1803 ld r10, VCPU_PC(r9)
1804 ld r11, VCPU_MSR(r9)
1805 li r12, BOOK3S_INTERRUPT_H_DATA_STORAGE
1806 cmpdi r3, 0
1807 beq 6f
1808 cmpdi r3, -1
1809 beq guest_exit_cont
1810 cmpdi r3, -2
1811 beq 2f
1812
1813
1814 ld r4, VCPU_FAULT_DAR(r9)
1815 mr r6, r3
18161: mtspr SPRN_DAR, r4
1817 mtspr SPRN_DSISR, r6
1818 mtspr SPRN_SRR0, r10
1819 mtspr SPRN_SRR1, r11
1820 li r10, BOOK3S_INTERRUPT_DATA_STORAGE
1821 bl kvmppc_msr_interrupt
1822fast_interrupt_c_return:
18236: ld r7, VCPU_CTR(r9)
1824 lwz r8, VCPU_XER(r9)
1825 mtctr r7
1826 mtxer r8
1827 mr r4, r9
1828 b fast_guest_return
1829
18303: ld r5, VCPU_KVM(r9)
1831 ld r5, KVM_VRMA_SLB_V(r5)
1832 b 4b
1833
1834
18352: li r8, KVM_INST_FETCH_FAILED
1836
1837
1838
1839 li r0, KVM_GUEST_MODE_SKIP
1840 stb r0, HSTATE_IN_GUEST(r13)
1841
1842
1843 mfmsr r3
1844 ori r4, r3, MSR_DR
1845 mtmsrd r4
1846 lwz r8, 0(r10)
1847 mtmsrd r3
1848
1849
1850 stw r8, VCPU_LAST_INST(r9)
1851
1852
1853 li r0, KVM_GUEST_MODE_HOST_HV
1854 stb r0, HSTATE_IN_GUEST(r13)
1855 b guest_exit_cont
1856
1857
1858
1859
1860
1861kvmppc_hisi:
1862 andis. r0, r11, SRR1_ISI_NOPT@h
1863 beq 1f
1864 andi. r0, r11, MSR_IR
1865 beq 3f
1866 clrrdi r0, r10, 28
1867 PPC_SLBFEE_DOT(R5, R0)
1868 bne 1f
18694:
1870
1871 mr r3, r9
1872 mr r4, r10
1873 mr r6, r11
1874 li r7, 0
1875 bl kvmppc_hpte_hv_fault
1876 ld r9, HSTATE_KVM_VCPU(r13)
1877 ld r10, VCPU_PC(r9)
1878 ld r11, VCPU_MSR(r9)
1879 li r12, BOOK3S_INTERRUPT_H_INST_STORAGE
1880 cmpdi r3, 0
1881 beq fast_interrupt_c_return
1882 cmpdi r3, -1
1883 beq guest_exit_cont
1884
1885
1886 mr r11, r3
18871: mtspr SPRN_SRR0, r10
1888 mtspr SPRN_SRR1, r11
1889 li r10, BOOK3S_INTERRUPT_INST_STORAGE
1890 bl kvmppc_msr_interrupt
1891 b fast_interrupt_c_return
1892
18933: ld r6, VCPU_KVM(r9)
1894 ld r5, KVM_VRMA_SLB_V(r6)
1895 b 4b
1896
1897
1898
1899
1900
1901
1902
1903 .globl hcall_try_real_mode
1904hcall_try_real_mode:
1905 ld r3,VCPU_GPR(R3)(r9)
1906 andi. r0,r11,MSR_PR
1907
1908 bne sc_1_fast_return
1909 clrrdi r3,r3,2
1910 cmpldi r3,hcall_real_table_end - hcall_real_table
1911 bge guest_exit_cont
1912 LOAD_REG_ADDR(r4, hcall_real_table)
1913 lwax r3,r3,r4
1914 cmpwi r3,0
1915 beq guest_exit_cont
1916 add r3,r3,r4
1917 mtctr r3
1918 mr r3,r9
1919 ld r4,VCPU_GPR(R4)(r9)
1920 bctrl
1921 cmpdi r3,H_TOO_HARD
1922 beq hcall_real_fallback
1923 ld r4,HSTATE_KVM_VCPU(r13)
1924 std r3,VCPU_GPR(R3)(r4)
1925 ld r10,VCPU_PC(r4)
1926 ld r11,VCPU_MSR(r4)
1927 b fast_guest_return
1928
1929sc_1_fast_return:
1930 mtspr SPRN_SRR0,r10
1931 mtspr SPRN_SRR1,r11
1932 li r10, BOOK3S_INTERRUPT_SYSCALL
1933 bl kvmppc_msr_interrupt
1934 mr r4,r9
1935 b fast_guest_return
1936
1937
1938
1939
1940hcall_real_fallback:
1941 li r12,BOOK3S_INTERRUPT_SYSCALL
1942 ld r9, HSTATE_KVM_VCPU(r13)
1943
1944 b guest_exit_cont
1945
1946 .globl hcall_real_table
1947hcall_real_table:
1948 .long 0
1949 .long DOTSYM(kvmppc_h_remove) - hcall_real_table
1950 .long DOTSYM(kvmppc_h_enter) - hcall_real_table
1951 .long DOTSYM(kvmppc_h_read) - hcall_real_table
1952 .long 0
1953 .long 0
1954 .long DOTSYM(kvmppc_h_protect) - hcall_real_table
1955 .long DOTSYM(kvmppc_h_get_tce) - hcall_real_table
1956 .long DOTSYM(kvmppc_h_put_tce) - hcall_real_table
1957 .long 0
1958 .long DOTSYM(kvmppc_h_set_dabr) - hcall_real_table
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#ifdef CONFIG_KVM_XICS
1974 .long DOTSYM(kvmppc_rm_h_eoi) - hcall_real_table
1975 .long DOTSYM(kvmppc_rm_h_cppr) - hcall_real_table
1976 .long DOTSYM(kvmppc_rm_h_ipi) - hcall_real_table
1977 .long 0
1978 .long DOTSYM(kvmppc_rm_h_xirr) - hcall_real_table
1979#else
1980 .long 0
1981 .long 0
1982 .long 0
1983 .long 0
1984 .long 0
1985#endif
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 .long 0
2000 .long 0
2001 .long 0
2002 .long 0
2003 .long 0
2004 .long 0
2005 .long 0
2006 .long 0
2007 .long 0
2008 .long 0
2009 .long 0
2010 .long 0
2011 .long 0
2012 .long DOTSYM(kvmppc_h_cede) - hcall_real_table
2013 .long 0
2014 .long 0
2015 .long 0
2016 .long 0
2017 .long 0
2018 .long 0
2019 .long 0
2020 .long 0
2021 .long 0
2022 .long 0
2023 .long 0
2024 .long 0
2025 .long 0
2026 .long 0
2027 .long 0
2028 .long 0
2029 .long DOTSYM(kvmppc_h_bulk_remove) - hcall_real_table
2030 .long 0
2031 .long 0
2032 .long 0
2033 .long DOTSYM(kvmppc_h_set_xdabr) - hcall_real_table
2034hcall_real_table_end:
2035
2036ignore_hdec:
2037 mr r4,r9
2038 b fast_guest_return
2039
2040_GLOBAL(kvmppc_h_set_xdabr)
2041 andi. r0, r5, DABRX_USER | DABRX_KERNEL
2042 beq 6f
2043 li r0, DABRX_USER | DABRX_KERNEL | DABRX_BTI
2044 andc. r0, r5, r0
2045 beq 3f
20466: li r3, H_PARAMETER
2047 blr
2048
2049_GLOBAL(kvmppc_h_set_dabr)
2050 li r5, DABRX_USER | DABRX_KERNEL
20513:
2052BEGIN_FTR_SECTION
2053 b 2f
2054END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
2055 std r4,VCPU_DABR(r3)
2056 stw r5, VCPU_DABRX(r3)
2057 mtspr SPRN_DABRX, r5
2058
20591: mtspr SPRN_DABR,r4
2060 mfspr r5, SPRN_DABR
2061 cmpd r4, r5
2062 bne 1b
2063 isync
2064 li r3,0
2065 blr
2066
2067
20682: rlwimi r5, r4, 5, DAWRX_DR | DAWRX_DW
2069 rlwimi r5, r4, 1, DAWRX_WT
2070 clrrdi r4, r4, 3
2071 std r4, VCPU_DAWR(r3)
2072 std r5, VCPU_DAWRX(r3)
2073 mtspr SPRN_DAWR, r4
2074 mtspr SPRN_DAWRX, r5
2075 li r3, 0
2076 blr
2077
2078_GLOBAL(kvmppc_h_cede)
2079 ori r11,r11,MSR_EE
2080 std r11,VCPU_MSR(r3)
2081 li r0,1
2082 stb r0,VCPU_CEDED(r3)
2083 sync
2084 lbz r5,VCPU_PRODDED(r3)
2085 cmpwi r5,0
2086 bne kvm_cede_prodded
2087 li r0,0
2088 stw r0,VCPU_TRAP(r3)
2089 li r0,H_SUCCESS
2090 std r0,VCPU_GPR(R3)(r3)
2091BEGIN_FTR_SECTION
2092 b kvm_cede_exit
2093END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_206)
2094
2095
2096
2097
2098
2099
2100 ld r5,HSTATE_KVM_VCORE(r13)
2101 lbz r6,HSTATE_PTID(r13)
2102 lwz r8,VCORE_ENTRY_EXIT(r5)
2103 clrldi r8,r8,56
2104 li r0,1
2105 sld r0,r0,r6
2106 addi r6,r5,VCORE_NAPPING_THREADS
210731: lwarx r4,0,r6
2108 or r4,r4,r0
2109 PPC_POPCNTW(R7,R4)
2110 cmpw r7,r8
2111 bge kvm_cede_exit
2112 stwcx. r4,0,r6
2113 bne 31b
2114
2115 isync
2116 li r0,NAPPING_CEDE
2117 stb r0,HSTATE_NAPPING(r13)
2118 lwz r7,VCORE_ENTRY_EXIT(r5)
2119 cmpwi r7,0x100
2120 bge 33f
2121
2122
2123
2124
2125
2126
2127
2128
2129 std r14, VCPU_GPR(R14)(r3)
2130 std r15, VCPU_GPR(R15)(r3)
2131 std r16, VCPU_GPR(R16)(r3)
2132 std r17, VCPU_GPR(R17)(r3)
2133 std r18, VCPU_GPR(R18)(r3)
2134 std r19, VCPU_GPR(R19)(r3)
2135 std r20, VCPU_GPR(R20)(r3)
2136 std r21, VCPU_GPR(R21)(r3)
2137 std r22, VCPU_GPR(R22)(r3)
2138 std r23, VCPU_GPR(R23)(r3)
2139 std r24, VCPU_GPR(R24)(r3)
2140 std r25, VCPU_GPR(R25)(r3)
2141 std r26, VCPU_GPR(R26)(r3)
2142 std r27, VCPU_GPR(R27)(r3)
2143 std r28, VCPU_GPR(R28)(r3)
2144 std r29, VCPU_GPR(R29)(r3)
2145 std r30, VCPU_GPR(R30)(r3)
2146 std r31, VCPU_GPR(R31)(r3)
2147
2148
2149 bl kvmppc_save_fp
2150
2151
2152
2153
2154
2155
2156 mfspr r2, SPRN_CTRLF
2157 clrrdi r2, r2, 1
2158 mtspr SPRN_CTRLT, r2
2159
2160 li r0,1
2161 stb r0,HSTATE_HWTHREAD_REQ(r13)
2162 mfspr r5,SPRN_LPCR
2163 ori r5,r5,LPCR_PECE0 | LPCR_PECE1
2164BEGIN_FTR_SECTION
2165 oris r5,r5,LPCR_PECEDP@h
2166END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
2167 mtspr SPRN_LPCR,r5
2168 isync
2169 li r0, 0
2170 std r0, HSTATE_SCRATCH0(r13)
2171 ptesync
2172 ld r0, HSTATE_SCRATCH0(r13)
21731: cmpd r0, r0
2174 bne 1b
2175 nap
2176 b .
2177
217833: mr r4, r3
2179 li r3, 0
2180 li r12, 0
2181 b 34f
2182
2183kvm_end_cede:
2184
2185 ld r4, HSTATE_KVM_VCPU(r13)
2186
2187
2188 ld r1, HSTATE_HOST_R1(r13)
2189
2190
2191 bl kvmppc_load_fp
2192
2193
2194 ld r14, VCPU_GPR(R14)(r4)
2195 ld r15, VCPU_GPR(R15)(r4)
2196 ld r16, VCPU_GPR(R16)(r4)
2197 ld r17, VCPU_GPR(R17)(r4)
2198 ld r18, VCPU_GPR(R18)(r4)
2199 ld r19, VCPU_GPR(R19)(r4)
2200 ld r20, VCPU_GPR(R20)(r4)
2201 ld r21, VCPU_GPR(R21)(r4)
2202 ld r22, VCPU_GPR(R22)(r4)
2203 ld r23, VCPU_GPR(R23)(r4)
2204 ld r24, VCPU_GPR(R24)(r4)
2205 ld r25, VCPU_GPR(R25)(r4)
2206 ld r26, VCPU_GPR(R26)(r4)
2207 ld r27, VCPU_GPR(R27)(r4)
2208 ld r28, VCPU_GPR(R28)(r4)
2209 ld r29, VCPU_GPR(R29)(r4)
2210 ld r30, VCPU_GPR(R30)(r4)
2211 ld r31, VCPU_GPR(R31)(r4)
2212
2213
2214 bl kvmppc_check_wake_reason
2215
2216
221734: ld r5,HSTATE_KVM_VCORE(r13)
2218 lbz r7,HSTATE_PTID(r13)
2219 li r0,1
2220 sld r0,r0,r7
2221 addi r6,r5,VCORE_NAPPING_THREADS
222232: lwarx r7,0,r6
2223 andc r7,r7,r0
2224 stwcx. r7,0,r6
2225 bne 32b
2226 li r0,0
2227 stb r0,HSTATE_NAPPING(r13)
2228
2229
2230 stw r12, VCPU_TRAP(r4)
2231 mr r9, r4
2232 cmpdi r3, 0
2233 bgt guest_exit_cont
2234
2235
2236 lwz r0,VCORE_ENTRY_EXIT(r5)
2237 cmpwi r0,0x100
2238 bge guest_exit_cont
2239
2240 b kvmppc_cede_reentry
2241
2242
2243kvm_cede_prodded:
2244 li r0,0
2245 stb r0,VCPU_PRODDED(r3)
2246 sync
2247 stb r0,VCPU_CEDED(r3)
2248 li r3,H_SUCCESS
2249 blr
2250
2251
2252kvm_cede_exit:
2253 b hcall_real_fallback
2254
2255
2256machine_check_realmode:
2257 mr r3, r9
2258 bl kvmppc_realmode_machine_check
2259 nop
2260 cmpdi r3, 0
2261 ld r9, HSTATE_KVM_VCPU(r13)
2262 li r12, BOOK3S_INTERRUPT_MACHINE_CHECK
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274 ld r10, VCPU_PC(r9)
2275 ld r11, VCPU_MSR(r9)
2276 bne 2f
2277
2278 li r10, BOOK3S_INTERRUPT_MACHINE_CHECK
2279 ld r11, VCPU_MSR(r9)
2280 bl kvmppc_msr_interrupt
22812: b fast_interrupt_c_return
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293kvmppc_check_wake_reason:
2294 mfspr r6, SPRN_SRR1
2295BEGIN_FTR_SECTION
2296 rlwinm r6, r6, 45-31, 0xf
2297FTR_SECTION_ELSE
2298 rlwinm r6, r6, 45-31, 0xe
2299ALT_FTR_SECTION_END_IFSET(CPU_FTR_ARCH_207S)
2300 cmpwi r6, 8
2301 li r12, BOOK3S_INTERRUPT_EXTERNAL
2302 beq kvmppc_read_intr
2303 li r3, 0
2304 li r12, 0
2305 cmpwi r6, 6
2306 beq 0f
2307BEGIN_FTR_SECTION
2308 cmpwi r6, 5
2309 beq 0f
2310 cmpwi r6, 3
2311 beq 3f
2312END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
2313 li r3, 1
23140: blr
2315
2316
23173: li r12, BOOK3S_INTERRUPT_H_DOORBELL
2318 li r3, 1
2319 blr
2320
2321
2322
2323
2324
2325
2326
2327
2328kvmppc_read_intr:
2329
2330 li r3, 1
2331 lbz r0, HSTATE_HOST_IPI(r13)
2332 cmpwi r0, 0
2333 bne 1f
2334
2335
2336 ld r6, HSTATE_XICS_PHYS(r13)
2337 li r7, XICS_XIRR
2338 cmpdi r6, 0
2339 beq- 1f
2340 lwzcix r0, r6, r7
2341 rlwinm. r3, r0, 0, 0xffffff
2342 sync
2343 beq 1f
2344
2345
2346
2347
2348
2349
2350
2351 cmpwi r3, XICS_IPI
2352 bne 42f
2353
2354
2355 li r3, 0xff
2356 li r8, XICS_MFRR
2357 stbcix r3, r6, r8
2358 stwcix r0, r6, r7
2359 sync
2360
2361
2362
2363
2364
2365 lbz r0, HSTATE_HOST_IPI(r13)
2366 cmpwi r0, 0
2367 bne- 43f
2368
2369
2370 li r3, -1
23711: blr
2372
237342:
2374
2375
2376 stw r0, HSTATE_SAVED_XIRR(r13)
2377 li r3, 1
2378 b 1b
2379
238043:
2381 li r0, IPI_PRIORITY
2382 stbcix r0, r6, r8
2383 sync
2384 li r3, 1
2385 b 1b
2386
2387
2388
2389
2390
2391
2392
2393kvmppc_save_fp:
2394 mflr r30
2395 mr r31,r3
2396 mfmsr r5
2397 ori r8,r5,MSR_FP
2398#ifdef CONFIG_ALTIVEC
2399BEGIN_FTR_SECTION
2400 oris r8,r8,MSR_VEC@h
2401END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
2402#endif
2403#ifdef CONFIG_VSX
2404BEGIN_FTR_SECTION
2405 oris r8,r8,MSR_VSX@h
2406END_FTR_SECTION_IFSET(CPU_FTR_VSX)
2407#endif
2408 mtmsrd r8
2409 isync
2410 addi r3,r3,VCPU_FPRS
2411 bl .store_fp_state
2412#ifdef CONFIG_ALTIVEC
2413BEGIN_FTR_SECTION
2414 addi r3,r31,VCPU_VRS
2415 bl .store_vr_state
2416END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
2417#endif
2418 mfspr r6,SPRN_VRSAVE
2419 stw r6,VCPU_VRSAVE(r31)
2420 mtlr r30
2421 blr
2422
2423
2424
2425
2426
2427
2428
2429kvmppc_load_fp:
2430 mflr r30
2431 mr r31,r4
2432 mfmsr r9
2433 ori r8,r9,MSR_FP
2434#ifdef CONFIG_ALTIVEC
2435BEGIN_FTR_SECTION
2436 oris r8,r8,MSR_VEC@h
2437END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
2438#endif
2439#ifdef CONFIG_VSX
2440BEGIN_FTR_SECTION
2441 oris r8,r8,MSR_VSX@h
2442END_FTR_SECTION_IFSET(CPU_FTR_VSX)
2443#endif
2444 mtmsrd r8
2445 isync
2446 addi r3,r4,VCPU_FPRS
2447 bl .load_fp_state
2448#ifdef CONFIG_ALTIVEC
2449BEGIN_FTR_SECTION
2450 addi r3,r31,VCPU_VRS
2451 bl .load_vr_state
2452END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
2453#endif
2454 lwz r7,VCPU_VRSAVE(r31)
2455 mtspr SPRN_VRSAVE,r7
2456 mtlr r30
2457 mr r4,r31
2458 blr
2459
2460
2461
2462
2463
2464
2465kvmppc_bad_host_intr:
2466 b .
2467
2468
2469
2470
2471
2472
2473
2474
2475kvmppc_msr_interrupt:
2476 rldicl r0, r11, 64 - MSR_TS_S_LG, 62
2477 cmpwi r0, 2
2478 ld r11, VCPU_INTR_MSR(r9)
2479 bne 1f
2480
2481 li r0, 1
24821: rldimi r11, r0, MSR_TS_S_LG, 63 - MSR_TS_T_LG
2483 blr
2484
2485
2486
2487
2488
2489
2490
2491kvmppc_fix_pmao:
2492 li r3, 0
2493 mtspr SPRN_MMCR2, r3
2494 lis r3, (MMCR0_PMXE | MMCR0_FCECE)@h
2495 ori r3, r3, MMCR0_PMCjCE | MMCR0_C56RUN
2496 mtspr SPRN_MMCR0, r3
2497 lis r3, 0x7fff
2498 ori r3, r3, 0xffff
2499 mtspr SPRN_PMC6, r3
2500 isync
2501 blr
2502