powerpc: Remove use of a second scratch SPRG in STAB code
The STAB code used on Power3 and RS/64 uses a second scratch SPRG to save a GPR in order to decide whether to go to do_stab_bolted_* or to handle a normal data access exception. This prevents our scheme of freeing SPRG3 which is user visible for user uses since we cannot use SPRG0 which, on RS/64, seems to be read-only for supervisor mode (like POWER4). This reworks the STAB exception entry to use the PACA as temporary storage instead. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
@@ -50,18 +50,28 @@ data_access_pSeries:
|
||||
HMT_MEDIUM
|
||||
mtspr SPRN_SPRG_SCRATCH0,r13
|
||||
BEGIN_FTR_SECTION
|
||||
mtspr SPRN_SPRG_SCRATCH1,r12
|
||||
mfspr r13,SPRN_DAR
|
||||
mfspr r12,SPRN_DSISR
|
||||
srdi r13,r13,60
|
||||
rlwimi r13,r12,16,0x20
|
||||
mfcr r12
|
||||
cmpwi r13,0x2c
|
||||
mfspr r13,SPRN_SPRG_PACA
|
||||
std r9,PACA_EXSLB+EX_R9(r13)
|
||||
std r10,PACA_EXSLB+EX_R10(r13)
|
||||
mfspr r10,SPRN_DAR
|
||||
mfspr r9,SPRN_DSISR
|
||||
srdi r10,r10,60
|
||||
rlwimi r10,r9,16,0x20
|
||||
mfcr r9
|
||||
cmpwi r10,0x2c
|
||||
beq do_stab_bolted_pSeries
|
||||
mtcrf 0x80,r12
|
||||
mfspr r12,SPRN_SPRG_SCRATCH1
|
||||
END_FTR_SECTION_IFCLR(CPU_FTR_SLB)
|
||||
ld r10,PACA_EXSLB+EX_R10(r13)
|
||||
std r11,PACA_EXGEN+EX_R11(r13)
|
||||
ld r11,PACA_EXSLB+EX_R9(r13)
|
||||
std r12,PACA_EXGEN+EX_R12(r13)
|
||||
mfspr r12,SPRN_SPRG_SCRATCH0
|
||||
std r10,PACA_EXGEN+EX_R10(r13)
|
||||
std r11,PACA_EXGEN+EX_R9(r13)
|
||||
std r12,PACA_EXGEN+EX_R13(r13)
|
||||
EXCEPTION_PROLOG_PSERIES_1(data_access_common)
|
||||
FTR_SECTION_ELSE
|
||||
EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, data_access_common)
|
||||
ALT_FTR_SECTION_END_IFCLR(CPU_FTR_SLB)
|
||||
|
||||
. = 0x380
|
||||
.globl data_access_slb_pSeries
|
||||
@@ -224,9 +234,11 @@ masked_interrupt:
|
||||
|
||||
.align 7
|
||||
do_stab_bolted_pSeries:
|
||||
mtcrf 0x80,r12
|
||||
mfspr r12,SPRN_SPRG_SCRATCH1
|
||||
EXCEPTION_PROLOG_PSERIES(PACA_EXSLB, .do_stab_bolted)
|
||||
std r11,PACA_EXSLB+EX_R11(r13)
|
||||
std r12,PACA_EXSLB+EX_R12(r13)
|
||||
mfspr r10,SPRN_SPRG_SCRATCH0
|
||||
std r10,PACA_EXSLB+EX_R13(r13)
|
||||
EXCEPTION_PROLOG_PSERIES_1(.do_stab_bolted)
|
||||
|
||||
#ifdef CONFIG_PPC_PSERIES
|
||||
/*
|
||||
|
Reference in New Issue
Block a user