mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-14 13:39:10 +00:00
powerpc/booke64: Use GSRR registers in Guest Doorbell interrupts
Guest Doorbell interrupts use guest save and restore registers. Add a new Guest Doorbell exception type to accommodate GSRR0/1 SPRs usage in exception prolog and fix the exception handler. Signed-off-by: Mihai Caraman <mihai.caraman@freescale.com> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
parent
a131075721
commit
5473eb1c07
@ -37,6 +37,7 @@
|
|||||||
* critical data
|
* critical data
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define PACA_EXGDBELL PACA_EXGEN
|
||||||
|
|
||||||
/* We are out of SPRGs so we save some things in the PACA. The normal
|
/* We are out of SPRGs so we save some things in the PACA. The normal
|
||||||
* exception frame is smaller than the CRIT or MC one though
|
* exception frame is smaller than the CRIT or MC one though
|
||||||
|
@ -863,6 +863,7 @@
|
|||||||
#define SPRN_SPRG_TLB_EXFRAME SPRN_SPRG2
|
#define SPRN_SPRG_TLB_EXFRAME SPRN_SPRG2
|
||||||
#define SPRN_SPRG_TLB_SCRATCH SPRN_SPRG6
|
#define SPRN_SPRG_TLB_SCRATCH SPRN_SPRG6
|
||||||
#define SPRN_SPRG_GEN_SCRATCH SPRN_SPRG0
|
#define SPRN_SPRG_GEN_SCRATCH SPRN_SPRG0
|
||||||
|
#define SPRN_SPRG_GDBELL_SCRATCH SPRN_SPRG_GEN_SCRATCH
|
||||||
|
|
||||||
#define SET_PACA(rX) mtspr SPRN_SPRG_PACA,rX
|
#define SET_PACA(rX) mtspr SPRN_SPRG_PACA,rX
|
||||||
#define GET_PACA(rX) mfspr rX,SPRN_SPRG_PACA
|
#define GET_PACA(rX) mfspr rX,SPRN_SPRG_PACA
|
||||||
|
@ -59,6 +59,10 @@
|
|||||||
#define SPRN_GEN_SRR0 SPRN_SRR0
|
#define SPRN_GEN_SRR0 SPRN_SRR0
|
||||||
#define SPRN_GEN_SRR1 SPRN_SRR1
|
#define SPRN_GEN_SRR1 SPRN_SRR1
|
||||||
|
|
||||||
|
#define GDBELL_SET_KSTACK GEN_SET_KSTACK
|
||||||
|
#define SPRN_GDBELL_SRR0 SPRN_GSRR0
|
||||||
|
#define SPRN_GDBELL_SRR1 SPRN_GSRR1
|
||||||
|
|
||||||
#define CRIT_SET_KSTACK \
|
#define CRIT_SET_KSTACK \
|
||||||
ld r1,PACA_CRIT_STACK(r13); \
|
ld r1,PACA_CRIT_STACK(r13); \
|
||||||
subi r1,r1,SPECIAL_EXC_FRAME_SIZE;
|
subi r1,r1,SPECIAL_EXC_FRAME_SIZE;
|
||||||
@ -89,10 +93,13 @@
|
|||||||
#define MC_EXCEPTION_PROLOG(n, addition) \
|
#define MC_EXCEPTION_PROLOG(n, addition) \
|
||||||
EXCEPTION_PROLOG(n, MC, addition##_MC(n))
|
EXCEPTION_PROLOG(n, MC, addition##_MC(n))
|
||||||
|
|
||||||
|
#define GDBELL_EXCEPTION_PROLOG(n, addition) \
|
||||||
|
EXCEPTION_PROLOG(n, GDBELL, addition##_GDBELL(n))
|
||||||
|
|
||||||
/* Variants of the "addition" argument for the prolog
|
/* Variants of the "addition" argument for the prolog
|
||||||
*/
|
*/
|
||||||
#define PROLOG_ADDITION_NONE_GEN(n)
|
#define PROLOG_ADDITION_NONE_GEN(n)
|
||||||
|
#define PROLOG_ADDITION_NONE_GDBELL(n)
|
||||||
#define PROLOG_ADDITION_NONE_CRIT(n)
|
#define PROLOG_ADDITION_NONE_CRIT(n)
|
||||||
#define PROLOG_ADDITION_NONE_DBG(n)
|
#define PROLOG_ADDITION_NONE_DBG(n)
|
||||||
#define PROLOG_ADDITION_NONE_MC(n)
|
#define PROLOG_ADDITION_NONE_MC(n)
|
||||||
@ -543,8 +550,18 @@ kernel_dbg_exc:
|
|||||||
// b ret_from_crit_except
|
// b ret_from_crit_except
|
||||||
b .
|
b .
|
||||||
|
|
||||||
/* Guest Doorbell */
|
/*
|
||||||
MASKABLE_EXCEPTION(0x2c0, guest_doorbell, .unknown_exception, ACK_NONE)
|
* Guest doorbell interrupt
|
||||||
|
* This general exception use GSRRx save/restore registers
|
||||||
|
*/
|
||||||
|
START_EXCEPTION(guest_doorbell);
|
||||||
|
GDBELL_EXCEPTION_PROLOG(0x2c0, PROLOG_ADDITION_NONE)
|
||||||
|
EXCEPTION_COMMON(0x2c0, PACA_EXGEN, INTS_KEEP)
|
||||||
|
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||||
|
bl .save_nvgprs
|
||||||
|
INTS_RESTORE_HARD
|
||||||
|
bl .unknown_exception
|
||||||
|
b .ret_from_except
|
||||||
|
|
||||||
/* Guest Doorbell critical Interrupt */
|
/* Guest Doorbell critical Interrupt */
|
||||||
START_EXCEPTION(guest_doorbell_crit);
|
START_EXCEPTION(guest_doorbell_crit);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user