Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Bharat Bhushan and committed by
Alexander Graf
75c44bbb 6328e593

+27 -28
+27 -28
arch/powerpc/kvm/booke_interrupts.S
··· 53 53 (1<<BOOKE_INTERRUPT_PROGRAM) | \ 54 54 (1<<BOOKE_INTERRUPT_DTLB_MISS)) 55 55 56 - .macro KVM_HANDLER ivor_nr 56 + .macro KVM_HANDLER ivor_nr scratch srr0 57 57 _GLOBAL(kvmppc_handler_\ivor_nr) 58 58 /* Get pointer to vcpu and record exit number. */ 59 - mtspr SPRN_SPRG_WSCRATCH0, r4 59 + mtspr \scratch , r4 60 60 mfspr r4, SPRN_SPRG_RVCPU 61 + stw r3, VCPU_GPR(r3)(r4) 61 62 stw r5, VCPU_GPR(r5)(r4) 62 63 stw r6, VCPU_GPR(r6)(r4) 64 + mfspr r3, \scratch 63 65 mfctr r5 64 - lis r6, kvmppc_resume_host@h 66 + stw r3, VCPU_GPR(r4)(r4) 65 67 stw r5, VCPU_CTR(r4) 68 + mfspr r3, \srr0 69 + lis r6, kvmppc_resume_host@h 70 + stw r3, VCPU_PC(r4) 66 71 li r5, \ivor_nr 67 72 ori r6, r6, kvmppc_resume_host@l 68 73 mtctr r6 ··· 75 70 .endm 76 71 77 72 _GLOBAL(kvmppc_handlers_start) 78 - KVM_HANDLER BOOKE_INTERRUPT_CRITICAL 79 - KVM_HANDLER BOOKE_INTERRUPT_MACHINE_CHECK 80 - KVM_HANDLER BOOKE_INTERRUPT_DATA_STORAGE 81 - KVM_HANDLER BOOKE_INTERRUPT_INST_STORAGE 82 - KVM_HANDLER BOOKE_INTERRUPT_EXTERNAL 83 - KVM_HANDLER BOOKE_INTERRUPT_ALIGNMENT 84 - KVM_HANDLER BOOKE_INTERRUPT_PROGRAM 85 - KVM_HANDLER BOOKE_INTERRUPT_FP_UNAVAIL 86 - KVM_HANDLER BOOKE_INTERRUPT_SYSCALL 87 - KVM_HANDLER BOOKE_INTERRUPT_AP_UNAVAIL 88 - KVM_HANDLER BOOKE_INTERRUPT_DECREMENTER 89 - KVM_HANDLER BOOKE_INTERRUPT_FIT 90 - KVM_HANDLER BOOKE_INTERRUPT_WATCHDOG 91 - KVM_HANDLER BOOKE_INTERRUPT_DTLB_MISS 92 - KVM_HANDLER BOOKE_INTERRUPT_ITLB_MISS 93 - KVM_HANDLER BOOKE_INTERRUPT_DEBUG 94 - KVM_HANDLER BOOKE_INTERRUPT_SPE_UNAVAIL 95 - KVM_HANDLER BOOKE_INTERRUPT_SPE_FP_DATA 96 - KVM_HANDLER BOOKE_INTERRUPT_SPE_FP_ROUND 73 + KVM_HANDLER BOOKE_INTERRUPT_CRITICAL SPRN_SPRG_RSCRATCH_CRIT SPRN_CSRR0 74 + KVM_HANDLER BOOKE_INTERRUPT_MACHINE_CHECK SPRN_SPRG_RSCRATCH_MC SPRN_MCSRR0 75 + KVM_HANDLER BOOKE_INTERRUPT_DATA_STORAGE SPRN_SPRG_RSCRATCH0 SPRN_SRR0 76 + KVM_HANDLER BOOKE_INTERRUPT_INST_STORAGE SPRN_SPRG_RSCRATCH0 SPRN_SRR0 77 + KVM_HANDLER BOOKE_INTERRUPT_EXTERNAL SPRN_SPRG_RSCRATCH0 SPRN_SRR0 78 + KVM_HANDLER BOOKE_INTERRUPT_ALIGNMENT SPRN_SPRG_RSCRATCH0 SPRN_SRR0 79 + KVM_HANDLER BOOKE_INTERRUPT_PROGRAM SPRN_SPRG_RSCRATCH0 SPRN_SRR0 80 + KVM_HANDLER BOOKE_INTERRUPT_FP_UNAVAIL SPRN_SPRG_RSCRATCH0 SPRN_SRR0 81 + KVM_HANDLER BOOKE_INTERRUPT_SYSCALL SPRN_SPRG_RSCRATCH0 SPRN_SRR0 82 + KVM_HANDLER BOOKE_INTERRUPT_AP_UNAVAIL SPRN_SPRG_RSCRATCH0 SPRN_SRR0 83 + KVM_HANDLER BOOKE_INTERRUPT_DECREMENTER SPRN_SPRG_RSCRATCH0 SPRN_SRR0 84 + KVM_HANDLER BOOKE_INTERRUPT_FIT SPRN_SPRG_RSCRATCH0 SPRN_SRR0 85 + KVM_HANDLER BOOKE_INTERRUPT_WATCHDOG SPRN_SPRG_RSCRATCH_CRIT SPRN_CSRR0 86 + KVM_HANDLER BOOKE_INTERRUPT_DTLB_MISS SPRN_SPRG_RSCRATCH0 SPRN_SRR0 87 + KVM_HANDLER BOOKE_INTERRUPT_ITLB_MISS SPRN_SPRG_RSCRATCH0 SPRN_SRR0 88 + KVM_HANDLER BOOKE_INTERRUPT_DEBUG SPRN_SPRG_RSCRATCH_CRIT SPRN_CSRR0 89 + KVM_HANDLER BOOKE_INTERRUPT_SPE_UNAVAIL SPRN_SPRG_RSCRATCH0 SPRN_SRR0 90 + KVM_HANDLER BOOKE_INTERRUPT_SPE_FP_DATA SPRN_SPRG_RSCRATCH0 SPRN_SRR0 91 + KVM_HANDLER BOOKE_INTERRUPT_SPE_FP_ROUND SPRN_SPRG_RSCRATCH0 SPRN_SRR0 97 92 98 93 _GLOBAL(kvmppc_handler_len) 99 94 .long kvmppc_handler_1 - kvmppc_handler_0 100 - 101 95 102 96 /* Registers: 103 97 * SPRG_SCRATCH0: guest r4 ··· 104 100 * r5: KVM exit number 105 101 */ 106 102 _GLOBAL(kvmppc_resume_host) 107 - stw r3, VCPU_GPR(r3)(r4) 108 103 mfcr r3 109 104 stw r3, VCPU_CR(r4) 110 105 stw r7, VCPU_GPR(r7)(r4) ··· 184 181 stw r3, VCPU_LR(r4) 185 182 mfxer r3 186 183 stw r3, VCPU_XER(r4) 187 - mfspr r3, SPRN_SPRG_RSCRATCH0 188 - stw r3, VCPU_GPR(r4)(r4) 189 - mfspr r3, SPRN_SRR0 190 - stw r3, VCPU_PC(r4) 191 184 192 185 /* Restore host stack pointer and PID before IVPR, since the host 193 186 * exception handlers use them. */