powerpc/64s: Consolidate Hypervisor Maintenance 0xe60 interrupt
Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
031b4026a8
commit
62f9b03b06
|
@ -945,6 +945,62 @@ EXC_COMMON(emulation_assist_common, 0xe40, emulation_assist_interrupt)
|
||||||
|
|
||||||
|
|
||||||
__EXC_REAL_OOL_HV_DIRECT(hmi_exception, 0xe60, 0xe80, hmi_exception_early)
|
__EXC_REAL_OOL_HV_DIRECT(hmi_exception, 0xe60, 0xe80, hmi_exception_early)
|
||||||
|
__TRAMP_REAL_REAL_OOL_MASKABLE_HV(hmi_exception, 0xe60)
|
||||||
|
EXC_VIRT_BEGIN(unused, 0x4e60, 0x4e80)
|
||||||
|
b . /* Can't happen, see v2.07 Book III-S section 6.5 */
|
||||||
|
EXC_VIRT_END(unused, 0x4e60, 0x4e80)
|
||||||
|
TRAMP_KVM_HV(PACA_EXGEN, 0xe60)
|
||||||
|
TRAMP_REAL_BEGIN(hmi_exception_early)
|
||||||
|
EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST_HV, 0xe60)
|
||||||
|
mr r10,r1 /* Save r1 */
|
||||||
|
ld r1,PACAEMERGSP(r13) /* Use emergency stack */
|
||||||
|
subi r1,r1,INT_FRAME_SIZE /* alloc stack frame */
|
||||||
|
std r9,_CCR(r1) /* save CR in stackframe */
|
||||||
|
mfspr r11,SPRN_HSRR0 /* Save HSRR0 */
|
||||||
|
std r11,_NIP(r1) /* save HSRR0 in stackframe */
|
||||||
|
mfspr r12,SPRN_HSRR1 /* Save SRR1 */
|
||||||
|
std r12,_MSR(r1) /* save SRR1 in stackframe */
|
||||||
|
std r10,0(r1) /* make stack chain pointer */
|
||||||
|
std r0,GPR0(r1) /* save r0 in stackframe */
|
||||||
|
std r10,GPR1(r1) /* save r1 in stackframe */
|
||||||
|
EXCEPTION_PROLOG_COMMON_2(PACA_EXGEN)
|
||||||
|
EXCEPTION_PROLOG_COMMON_3(0xe60)
|
||||||
|
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||||
|
bl hmi_exception_realmode
|
||||||
|
/* Windup the stack. */
|
||||||
|
/* Move original HSRR0 and HSRR1 into the respective regs */
|
||||||
|
ld r9,_MSR(r1)
|
||||||
|
mtspr SPRN_HSRR1,r9
|
||||||
|
ld r3,_NIP(r1)
|
||||||
|
mtspr SPRN_HSRR0,r3
|
||||||
|
ld r9,_CTR(r1)
|
||||||
|
mtctr r9
|
||||||
|
ld r9,_XER(r1)
|
||||||
|
mtxer r9
|
||||||
|
ld r9,_LINK(r1)
|
||||||
|
mtlr r9
|
||||||
|
REST_GPR(0, r1)
|
||||||
|
REST_8GPRS(2, r1)
|
||||||
|
REST_GPR(10, r1)
|
||||||
|
ld r11,_CCR(r1)
|
||||||
|
mtcr r11
|
||||||
|
REST_GPR(11, r1)
|
||||||
|
REST_2GPRS(12, r1)
|
||||||
|
/* restore original r1. */
|
||||||
|
ld r1,GPR1(r1)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Go to virtual mode and pull the HMI event information from
|
||||||
|
* firmware.
|
||||||
|
*/
|
||||||
|
.globl hmi_exception_after_realmode
|
||||||
|
hmi_exception_after_realmode:
|
||||||
|
SET_SCRATCH0(r13)
|
||||||
|
EXCEPTION_PROLOG_0(PACA_EXGEN)
|
||||||
|
b tramp_real_hmi_exception
|
||||||
|
|
||||||
|
EXC_COMMON_ASYNC(hmi_exception_common, 0xe60, handle_hmi_exception)
|
||||||
|
|
||||||
|
|
||||||
__EXC_REAL_OOL_MASKABLE_HV(h_doorbell, 0xe80, 0xea0)
|
__EXC_REAL_OOL_MASKABLE_HV(h_doorbell, 0xe80, 0xea0)
|
||||||
|
|
||||||
|
@ -1088,9 +1144,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* moved from 0xe00 */
|
/* moved from 0xe00 */
|
||||||
__TRAMP_REAL_REAL_OOL_MASKABLE_HV(hmi_exception, 0xe60)
|
|
||||||
TRAMP_KVM_HV(PACA_EXGEN, 0xe60)
|
|
||||||
|
|
||||||
__TRAMP_REAL_REAL_OOL_MASKABLE_HV(h_doorbell, 0xe80)
|
__TRAMP_REAL_REAL_OOL_MASKABLE_HV(h_doorbell, 0xe80)
|
||||||
TRAMP_KVM_HV(PACA_EXGEN, 0xe80)
|
TRAMP_KVM_HV(PACA_EXGEN, 0xe80)
|
||||||
|
|
||||||
|
@ -1233,7 +1286,6 @@ TRAMP_REAL_BEGIN(kvmppc_skip_Hinterrupt)
|
||||||
/*** Common interrupt handlers ***/
|
/*** Common interrupt handlers ***/
|
||||||
|
|
||||||
|
|
||||||
EXC_COMMON_ASYNC(hmi_exception_common, 0xe60, handle_hmi_exception)
|
|
||||||
#ifdef CONFIG_PPC_DOORBELL
|
#ifdef CONFIG_PPC_DOORBELL
|
||||||
EXC_COMMON_ASYNC(h_doorbell_common, 0xe80, doorbell_exception)
|
EXC_COMMON_ASYNC(h_doorbell_common, 0xe80, doorbell_exception)
|
||||||
#else
|
#else
|
||||||
|
@ -1265,10 +1317,6 @@ EXC_COMMON(altivec_assist_common, 0x1700, unknown_exception)
|
||||||
* come here.
|
* come here.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
EXC_VIRT_BEGIN(unused, 0x4e60, 0x4e80)
|
|
||||||
b . /* Can't happen, see v2.07 Book III-S section 6.5 */
|
|
||||||
EXC_VIRT_END(unused, 0x4e60, 0x4e80)
|
|
||||||
|
|
||||||
__EXC_VIRT_OOL_MASKABLE_HV(h_doorbell, 0x4e80, 0x4ea0)
|
__EXC_VIRT_OOL_MASKABLE_HV(h_doorbell, 0x4e80, 0x4ea0)
|
||||||
|
|
||||||
__EXC_VIRT_OOL_MASKABLE_HV(h_virt_irq, 0x4ea0, 0x4ec0)
|
__EXC_VIRT_OOL_MASKABLE_HV(h_virt_irq, 0x4ea0, 0x4ec0)
|
||||||
|
@ -1405,55 +1453,6 @@ EXC_COMMON(cbe_thermal_common, 0x1800, cbe_thermal_exception)
|
||||||
#endif /* CONFIG_CBE_RAS */
|
#endif /* CONFIG_CBE_RAS */
|
||||||
|
|
||||||
|
|
||||||
TRAMP_REAL_BEGIN(hmi_exception_early)
|
|
||||||
EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST_HV, 0xe60)
|
|
||||||
mr r10,r1 /* Save r1 */
|
|
||||||
ld r1,PACAEMERGSP(r13) /* Use emergency stack */
|
|
||||||
subi r1,r1,INT_FRAME_SIZE /* alloc stack frame */
|
|
||||||
std r9,_CCR(r1) /* save CR in stackframe */
|
|
||||||
mfspr r11,SPRN_HSRR0 /* Save HSRR0 */
|
|
||||||
std r11,_NIP(r1) /* save HSRR0 in stackframe */
|
|
||||||
mfspr r12,SPRN_HSRR1 /* Save SRR1 */
|
|
||||||
std r12,_MSR(r1) /* save SRR1 in stackframe */
|
|
||||||
std r10,0(r1) /* make stack chain pointer */
|
|
||||||
std r0,GPR0(r1) /* save r0 in stackframe */
|
|
||||||
std r10,GPR1(r1) /* save r1 in stackframe */
|
|
||||||
EXCEPTION_PROLOG_COMMON_2(PACA_EXGEN)
|
|
||||||
EXCEPTION_PROLOG_COMMON_3(0xe60)
|
|
||||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
|
||||||
bl hmi_exception_realmode
|
|
||||||
/* Windup the stack. */
|
|
||||||
/* Move original HSRR0 and HSRR1 into the respective regs */
|
|
||||||
ld r9,_MSR(r1)
|
|
||||||
mtspr SPRN_HSRR1,r9
|
|
||||||
ld r3,_NIP(r1)
|
|
||||||
mtspr SPRN_HSRR0,r3
|
|
||||||
ld r9,_CTR(r1)
|
|
||||||
mtctr r9
|
|
||||||
ld r9,_XER(r1)
|
|
||||||
mtxer r9
|
|
||||||
ld r9,_LINK(r1)
|
|
||||||
mtlr r9
|
|
||||||
REST_GPR(0, r1)
|
|
||||||
REST_8GPRS(2, r1)
|
|
||||||
REST_GPR(10, r1)
|
|
||||||
ld r11,_CCR(r1)
|
|
||||||
mtcr r11
|
|
||||||
REST_GPR(11, r1)
|
|
||||||
REST_2GPRS(12, r1)
|
|
||||||
/* restore original r1. */
|
|
||||||
ld r1,GPR1(r1)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Go to virtual mode and pull the HMI event information from
|
|
||||||
* firmware.
|
|
||||||
*/
|
|
||||||
.globl hmi_exception_after_realmode
|
|
||||||
hmi_exception_after_realmode:
|
|
||||||
SET_SCRATCH0(r13)
|
|
||||||
EXCEPTION_PROLOG_0(PACA_EXGEN)
|
|
||||||
b tramp_real_hmi_exception
|
|
||||||
|
|
||||||
#ifdef CONFIG_PPC_970_NAP
|
#ifdef CONFIG_PPC_970_NAP
|
||||||
TRAMP_REAL_BEGIN(power4_fixup_nap)
|
TRAMP_REAL_BEGIN(power4_fixup_nap)
|
||||||
andc r9,r9,r10
|
andc r9,r9,r10
|
||||||
|
|
Loading…
Reference in New Issue