diff options
Diffstat (limited to 'arch/powerpc/kvm/booke_interrupts.S')
| -rw-r--r-- | arch/powerpc/kvm/booke_interrupts.S | 49 | 
1 files changed, 40 insertions, 9 deletions
diff --git a/arch/powerpc/kvm/booke_interrupts.S b/arch/powerpc/kvm/booke_interrupts.S index bb46b32f981..f4bb55c9651 100644 --- a/arch/powerpc/kvm/booke_interrupts.S +++ b/arch/powerpc/kvm/booke_interrupts.S @@ -45,18 +45,21 @@                          (1<<BOOKE_INTERRUPT_DEBUG))  #define NEED_DEAR_MASK ((1<<BOOKE_INTERRUPT_DATA_STORAGE) | \ -                        (1<<BOOKE_INTERRUPT_DTLB_MISS)) +                        (1<<BOOKE_INTERRUPT_DTLB_MISS) | \ +                        (1<<BOOKE_INTERRUPT_ALIGNMENT))  #define NEED_ESR_MASK ((1<<BOOKE_INTERRUPT_DATA_STORAGE) | \                         (1<<BOOKE_INTERRUPT_INST_STORAGE) | \                         (1<<BOOKE_INTERRUPT_PROGRAM) | \ -                       (1<<BOOKE_INTERRUPT_DTLB_MISS)) +                       (1<<BOOKE_INTERRUPT_DTLB_MISS) | \ +                       (1<<BOOKE_INTERRUPT_ALIGNMENT))  .macro KVM_HANDLER ivor_nr scratch srr0  _GLOBAL(kvmppc_handler_\ivor_nr)  	/* Get pointer to vcpu and record exit number. */  	mtspr	\scratch , r4 -	mfspr	r4, SPRN_SPRG_RVCPU +	mfspr   r4, SPRN_SPRG_THREAD +	lwz     r4, THREAD_KVM_VCPU(r4)  	stw	r3, VCPU_GPR(R3)(r4)  	stw	r5, VCPU_GPR(R5)(r4)  	stw	r6, VCPU_GPR(R6)(r4) @@ -73,6 +76,14 @@ _GLOBAL(kvmppc_handler_\ivor_nr)  	bctr  .endm +.macro KVM_HANDLER_ADDR ivor_nr +	.long	kvmppc_handler_\ivor_nr +.endm + +.macro KVM_HANDLER_END +	.long	kvmppc_handlers_end +.endm +  _GLOBAL(kvmppc_handlers_start)  KVM_HANDLER BOOKE_INTERRUPT_CRITICAL SPRN_SPRG_RSCRATCH_CRIT SPRN_CSRR0  KVM_HANDLER BOOKE_INTERRUPT_MACHINE_CHECK  SPRN_SPRG_RSCRATCH_MC SPRN_MCSRR0 @@ -93,9 +104,7 @@ 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 +_GLOBAL(kvmppc_handlers_end)  /* Registers:   *  SPRG_SCRATCH0: guest r4 @@ -402,9 +411,6 @@ lightweight_exit:  	lwz	r8, kvmppc_booke_handlers@l(r8)  	mtspr	SPRN_IVPR, r8 -	/* Save vcpu pointer for the exception handlers. */ -	mtspr	SPRN_SPRG_WVCPU, r4 -  	lwz	r5, VCPU_SHARED(r4)  	/* Can't switch the stack pointer until after IVPR is switched, @@ -463,6 +469,31 @@ lightweight_exit:  	lwz	r4, VCPU_GPR(R4)(r4)  	rfi +	.data +	.align	4 +	.globl	kvmppc_booke_handler_addr +kvmppc_booke_handler_addr: +KVM_HANDLER_ADDR BOOKE_INTERRUPT_CRITICAL +KVM_HANDLER_ADDR BOOKE_INTERRUPT_MACHINE_CHECK +KVM_HANDLER_ADDR BOOKE_INTERRUPT_DATA_STORAGE +KVM_HANDLER_ADDR BOOKE_INTERRUPT_INST_STORAGE +KVM_HANDLER_ADDR BOOKE_INTERRUPT_EXTERNAL +KVM_HANDLER_ADDR BOOKE_INTERRUPT_ALIGNMENT +KVM_HANDLER_ADDR BOOKE_INTERRUPT_PROGRAM +KVM_HANDLER_ADDR BOOKE_INTERRUPT_FP_UNAVAIL +KVM_HANDLER_ADDR BOOKE_INTERRUPT_SYSCALL +KVM_HANDLER_ADDR BOOKE_INTERRUPT_AP_UNAVAIL +KVM_HANDLER_ADDR BOOKE_INTERRUPT_DECREMENTER +KVM_HANDLER_ADDR BOOKE_INTERRUPT_FIT +KVM_HANDLER_ADDR BOOKE_INTERRUPT_WATCHDOG +KVM_HANDLER_ADDR BOOKE_INTERRUPT_DTLB_MISS +KVM_HANDLER_ADDR BOOKE_INTERRUPT_ITLB_MISS +KVM_HANDLER_ADDR BOOKE_INTERRUPT_DEBUG +KVM_HANDLER_ADDR BOOKE_INTERRUPT_SPE_UNAVAIL +KVM_HANDLER_ADDR BOOKE_INTERRUPT_SPE_FP_DATA +KVM_HANDLER_ADDR BOOKE_INTERRUPT_SPE_FP_ROUND +KVM_HANDLER_END /*Always keep this in end*/ +  #ifdef CONFIG_SPE  _GLOBAL(kvmppc_save_guest_spe)  	cmpi	0,r3,0  |