Commit 5473eb1c authored by Mihai Caraman's avatar Mihai Caraman Committed by Benjamin Herrenschmidt

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: default avatarMihai Caraman <mihai.caraman@freescale.com>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent a1310757
...@@ -37,6 +37,7 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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: ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment