booke: Added crit/mc exception handler for e500v2
Watchdog is taken at critical exception level. So this patch is tested with host watchdog exception happening when guest is running. Signed-off-by: Bharat Bhushan <bharat.bhushan@freescale.com> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
6328e593c3
commit
75c44bbb20
1 changed files with 27 additions and 28 deletions
|
@ -53,16 +53,21 @@
|
||||||
(1<<BOOKE_INTERRUPT_PROGRAM) | \
|
(1<<BOOKE_INTERRUPT_PROGRAM) | \
|
||||||
(1<<BOOKE_INTERRUPT_DTLB_MISS))
|
(1<<BOOKE_INTERRUPT_DTLB_MISS))
|
||||||
|
|
||||||
.macro KVM_HANDLER ivor_nr
|
.macro KVM_HANDLER ivor_nr scratch srr0
|
||||||
_GLOBAL(kvmppc_handler_\ivor_nr)
|
_GLOBAL(kvmppc_handler_\ivor_nr)
|
||||||
/* Get pointer to vcpu and record exit number. */
|
/* Get pointer to vcpu and record exit number. */
|
||||||
mtspr SPRN_SPRG_WSCRATCH0, r4
|
mtspr \scratch , r4
|
||||||
mfspr r4, SPRN_SPRG_RVCPU
|
mfspr r4, SPRN_SPRG_RVCPU
|
||||||
|
stw r3, VCPU_GPR(r3)(r4)
|
||||||
stw r5, VCPU_GPR(r5)(r4)
|
stw r5, VCPU_GPR(r5)(r4)
|
||||||
stw r6, VCPU_GPR(r6)(r4)
|
stw r6, VCPU_GPR(r6)(r4)
|
||||||
|
mfspr r3, \scratch
|
||||||
mfctr r5
|
mfctr r5
|
||||||
lis r6, kvmppc_resume_host@h
|
stw r3, VCPU_GPR(r4)(r4)
|
||||||
stw r5, VCPU_CTR(r4)
|
stw r5, VCPU_CTR(r4)
|
||||||
|
mfspr r3, \srr0
|
||||||
|
lis r6, kvmppc_resume_host@h
|
||||||
|
stw r3, VCPU_PC(r4)
|
||||||
li r5, \ivor_nr
|
li r5, \ivor_nr
|
||||||
ori r6, r6, kvmppc_resume_host@l
|
ori r6, r6, kvmppc_resume_host@l
|
||||||
mtctr r6
|
mtctr r6
|
||||||
|
@ -70,37 +75,35 @@ _GLOBAL(kvmppc_handler_\ivor_nr)
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
_GLOBAL(kvmppc_handlers_start)
|
_GLOBAL(kvmppc_handlers_start)
|
||||||
KVM_HANDLER BOOKE_INTERRUPT_CRITICAL
|
KVM_HANDLER BOOKE_INTERRUPT_CRITICAL SPRN_SPRG_RSCRATCH_CRIT SPRN_CSRR0
|
||||||
KVM_HANDLER BOOKE_INTERRUPT_MACHINE_CHECK
|
KVM_HANDLER BOOKE_INTERRUPT_MACHINE_CHECK SPRN_SPRG_RSCRATCH_MC SPRN_MCSRR0
|
||||||
KVM_HANDLER BOOKE_INTERRUPT_DATA_STORAGE
|
KVM_HANDLER BOOKE_INTERRUPT_DATA_STORAGE SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
||||||
KVM_HANDLER BOOKE_INTERRUPT_INST_STORAGE
|
KVM_HANDLER BOOKE_INTERRUPT_INST_STORAGE SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
||||||
KVM_HANDLER BOOKE_INTERRUPT_EXTERNAL
|
KVM_HANDLER BOOKE_INTERRUPT_EXTERNAL SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
||||||
KVM_HANDLER BOOKE_INTERRUPT_ALIGNMENT
|
KVM_HANDLER BOOKE_INTERRUPT_ALIGNMENT SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
||||||
KVM_HANDLER BOOKE_INTERRUPT_PROGRAM
|
KVM_HANDLER BOOKE_INTERRUPT_PROGRAM SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
||||||
KVM_HANDLER BOOKE_INTERRUPT_FP_UNAVAIL
|
KVM_HANDLER BOOKE_INTERRUPT_FP_UNAVAIL SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
||||||
KVM_HANDLER BOOKE_INTERRUPT_SYSCALL
|
KVM_HANDLER BOOKE_INTERRUPT_SYSCALL SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
||||||
KVM_HANDLER BOOKE_INTERRUPT_AP_UNAVAIL
|
KVM_HANDLER BOOKE_INTERRUPT_AP_UNAVAIL SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
||||||
KVM_HANDLER BOOKE_INTERRUPT_DECREMENTER
|
KVM_HANDLER BOOKE_INTERRUPT_DECREMENTER SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
||||||
KVM_HANDLER BOOKE_INTERRUPT_FIT
|
KVM_HANDLER BOOKE_INTERRUPT_FIT SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
||||||
KVM_HANDLER BOOKE_INTERRUPT_WATCHDOG
|
KVM_HANDLER BOOKE_INTERRUPT_WATCHDOG SPRN_SPRG_RSCRATCH_CRIT SPRN_CSRR0
|
||||||
KVM_HANDLER BOOKE_INTERRUPT_DTLB_MISS
|
KVM_HANDLER BOOKE_INTERRUPT_DTLB_MISS SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
||||||
KVM_HANDLER BOOKE_INTERRUPT_ITLB_MISS
|
KVM_HANDLER BOOKE_INTERRUPT_ITLB_MISS SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
||||||
KVM_HANDLER BOOKE_INTERRUPT_DEBUG
|
KVM_HANDLER BOOKE_INTERRUPT_DEBUG SPRN_SPRG_RSCRATCH_CRIT SPRN_CSRR0
|
||||||
KVM_HANDLER BOOKE_INTERRUPT_SPE_UNAVAIL
|
KVM_HANDLER BOOKE_INTERRUPT_SPE_UNAVAIL SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
||||||
KVM_HANDLER BOOKE_INTERRUPT_SPE_FP_DATA
|
KVM_HANDLER BOOKE_INTERRUPT_SPE_FP_DATA SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
||||||
KVM_HANDLER BOOKE_INTERRUPT_SPE_FP_ROUND
|
KVM_HANDLER BOOKE_INTERRUPT_SPE_FP_ROUND SPRN_SPRG_RSCRATCH0 SPRN_SRR0
|
||||||
|
|
||||||
_GLOBAL(kvmppc_handler_len)
|
_GLOBAL(kvmppc_handler_len)
|
||||||
.long kvmppc_handler_1 - kvmppc_handler_0
|
.long kvmppc_handler_1 - kvmppc_handler_0
|
||||||
|
|
||||||
|
|
||||||
/* Registers:
|
/* Registers:
|
||||||
* SPRG_SCRATCH0: guest r4
|
* SPRG_SCRATCH0: guest r4
|
||||||
* r4: vcpu pointer
|
* r4: vcpu pointer
|
||||||
* r5: KVM exit number
|
* r5: KVM exit number
|
||||||
*/
|
*/
|
||||||
_GLOBAL(kvmppc_resume_host)
|
_GLOBAL(kvmppc_resume_host)
|
||||||
stw r3, VCPU_GPR(r3)(r4)
|
|
||||||
mfcr r3
|
mfcr r3
|
||||||
stw r3, VCPU_CR(r4)
|
stw r3, VCPU_CR(r4)
|
||||||
stw r7, VCPU_GPR(r7)(r4)
|
stw r7, VCPU_GPR(r7)(r4)
|
||||||
|
@ -181,10 +184,6 @@ _GLOBAL(kvmppc_resume_host)
|
||||||
stw r3, VCPU_LR(r4)
|
stw r3, VCPU_LR(r4)
|
||||||
mfxer r3
|
mfxer r3
|
||||||
stw r3, VCPU_XER(r4)
|
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
|
/* Restore host stack pointer and PID before IVPR, since the host
|
||||||
* exception handlers use them. */
|
* exception handlers use them. */
|
||||||
|
|
Loading…
Add table
Reference in a new issue