|
@@ -53,16 +53,21 @@
|
|
|
(1<<BOOKE_INTERRUPT_PROGRAM) | \
|
|
|
(1<<BOOKE_INTERRUPT_DTLB_MISS))
|
|
|
|
|
|
-.macro KVM_HANDLER ivor_nr
|
|
|
+.macro KVM_HANDLER ivor_nr scratch srr0
|
|
|
_GLOBAL(kvmppc_handler_\ivor_nr)
|
|
|
/* Get pointer to vcpu and record exit number. */
|
|
|
- mtspr SPRN_SPRG_WSCRATCH0, r4
|
|
|
+ mtspr \scratch , r4
|
|
|
mfspr r4, SPRN_SPRG_RVCPU
|
|
|
+ stw r3, VCPU_GPR(r3)(r4)
|
|
|
stw r5, VCPU_GPR(r5)(r4)
|
|
|
stw r6, VCPU_GPR(r6)(r4)
|
|
|
+ mfspr r3, \scratch
|
|
|
mfctr r5
|
|
|
- lis r6, kvmppc_resume_host@h
|
|
|
+ stw r3, VCPU_GPR(r4)(r4)
|
|
|
stw r5, VCPU_CTR(r4)
|
|
|
+ mfspr r3, \srr0
|
|
|
+ lis r6, kvmppc_resume_host@h
|
|
|
+ stw r3, VCPU_PC(r4)
|
|
|
li r5, \ivor_nr
|
|
|
ori r6, r6, kvmppc_resume_host@l
|
|
|
mtctr r6
|
|
@@ -70,37 +75,35 @@ _GLOBAL(kvmppc_handler_\ivor_nr)
|
|
|
.endm
|
|
|
|
|
|
_GLOBAL(kvmppc_handlers_start)
|
|
|
-KVM_HANDLER BOOKE_INTERRUPT_CRITICAL
|
|
|
-KVM_HANDLER BOOKE_INTERRUPT_MACHINE_CHECK
|
|
|
-KVM_HANDLER BOOKE_INTERRUPT_DATA_STORAGE
|
|
|
-KVM_HANDLER BOOKE_INTERRUPT_INST_STORAGE
|
|
|
-KVM_HANDLER BOOKE_INTERRUPT_EXTERNAL
|
|
|
-KVM_HANDLER BOOKE_INTERRUPT_ALIGNMENT
|
|
|
-KVM_HANDLER BOOKE_INTERRUPT_PROGRAM
|
|
|
-KVM_HANDLER BOOKE_INTERRUPT_FP_UNAVAIL
|
|
|
-KVM_HANDLER BOOKE_INTERRUPT_SYSCALL
|
|
|
-KVM_HANDLER BOOKE_INTERRUPT_AP_UNAVAIL
|
|
|
-KVM_HANDLER BOOKE_INTERRUPT_DECREMENTER
|
|
|
-KVM_HANDLER BOOKE_INTERRUPT_FIT
|
|
|
-KVM_HANDLER BOOKE_INTERRUPT_WATCHDOG
|
|
|
-KVM_HANDLER BOOKE_INTERRUPT_DTLB_MISS
|
|
|
-KVM_HANDLER BOOKE_INTERRUPT_ITLB_MISS
|
|
|
-KVM_HANDLER BOOKE_INTERRUPT_DEBUG
|
|
|
-KVM_HANDLER BOOKE_INTERRUPT_SPE_UNAVAIL
|
|
|
-KVM_HANDLER BOOKE_INTERRUPT_SPE_FP_DATA
|
|
|
-KVM_HANDLER BOOKE_INTERRUPT_SPE_FP_ROUND
|
|
|
+KVM_HANDLER BOOKE_INTERRUPT_CRITICAL SPRN_SPRG_RSCRATCH_CRIT SPRN_CSRR0
|
|
|
+KVM_HANDLER BOOKE_INTERRUPT_MACHINE_CHECK SPRN_SPRG_RSCRATCH_MC SPRN_MCSRR0
|
|
|
+KVM_HANDLER BOOKE_INTERRUPT_DATA_STORAGE SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
|
|
+KVM_HANDLER BOOKE_INTERRUPT_INST_STORAGE SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
|
|
+KVM_HANDLER BOOKE_INTERRUPT_EXTERNAL SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
|
|
+KVM_HANDLER BOOKE_INTERRUPT_ALIGNMENT SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
|
|
+KVM_HANDLER BOOKE_INTERRUPT_PROGRAM SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
|
|
+KVM_HANDLER BOOKE_INTERRUPT_FP_UNAVAIL SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
|
|
+KVM_HANDLER BOOKE_INTERRUPT_SYSCALL SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
|
|
+KVM_HANDLER BOOKE_INTERRUPT_AP_UNAVAIL SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
|
|
+KVM_HANDLER BOOKE_INTERRUPT_DECREMENTER SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
|
|
+KVM_HANDLER BOOKE_INTERRUPT_FIT SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
|
|
+KVM_HANDLER BOOKE_INTERRUPT_WATCHDOG SPRN_SPRG_RSCRATCH_CRIT SPRN_CSRR0
|
|
|
+KVM_HANDLER BOOKE_INTERRUPT_DTLB_MISS SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
|
|
+KVM_HANDLER BOOKE_INTERRUPT_ITLB_MISS SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
|
|
+KVM_HANDLER BOOKE_INTERRUPT_DEBUG SPRN_SPRG_RSCRATCH_CRIT SPRN_CSRR0
|
|
|
+KVM_HANDLER BOOKE_INTERRUPT_SPE_UNAVAIL SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
|
|
+KVM_HANDLER BOOKE_INTERRUPT_SPE_FP_DATA SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
|
|
+KVM_HANDLER BOOKE_INTERRUPT_SPE_FP_ROUND SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
|
|
|
|
|
_GLOBAL(kvmppc_handler_len)
|
|
|
.long kvmppc_handler_1 - kvmppc_handler_0
|
|
|
|
|
|
-
|
|
|
/* Registers:
|
|
|
* SPRG_SCRATCH0: guest r4
|
|
|
* r4: vcpu pointer
|
|
|
* r5: KVM exit number
|
|
|
*/
|
|
|
_GLOBAL(kvmppc_resume_host)
|
|
|
- stw r3, VCPU_GPR(r3)(r4)
|
|
|
mfcr r3
|
|
|
stw r3, VCPU_CR(r4)
|
|
|
stw r7, VCPU_GPR(r7)(r4)
|
|
@@ -181,10 +184,6 @@ _GLOBAL(kvmppc_resume_host)
|
|
|
stw r3, VCPU_LR(r4)
|
|
|
mfxer r3
|
|
|
stw r3, VCPU_XER(r4)
|
|
|
- mfspr r3, SPRN_SPRG_RSCRATCH0
|
|
|
- stw r3, VCPU_GPR(r4)(r4)
|
|
|
- mfspr r3, SPRN_SRR0
|
|
|
- stw r3, VCPU_PC(r4)
|
|
|
|
|
|
/* Restore host stack pointer and PID before IVPR, since the host
|
|
|
* exception handlers use them. */
|