Skip to content

Commit 16db543

Browse files
chleroympe
authored andcommitted
powerpc/32: Save remaining registers in exception prolog
Save non volatile registers, XER, CTR, MSR and NIP in exception prolog. Also assign proper value to r2 and r3 there. For now, recalculate thread pointer in prepare_transfer_to_handler. It will disappear once KUAP is ported to C. And remove the comment which is now completely wrong. Signed-off-by: Christophe Leroy <[email protected]> Signed-off-by: Michael Ellerman <[email protected]> Link: https://lore.kernel.org/r/56f0cde9dd0362edf2ddba4d887552013eee7329.1615552867.git.christophe.leroy@csgroup.eu
1 parent a305597 commit 16db543

File tree

3 files changed

+28
-23
lines changed

3 files changed

+28
-23
lines changed

arch/powerpc/kernel/entry_32.S

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -48,38 +48,19 @@
4848
*/
4949
.align 12
5050

51-
/*
52-
* This code finishes saving the registers to the exception frame
53-
* and jumps to the appropriate handler for the exception, turning
54-
* on address translation.
55-
* Note that we rely on the caller having set cr0.eq iff the exception
56-
* occurred in kernel mode (i.e. MSR:PR = 0).
57-
*/
5851
.globl prepare_transfer_to_handler
5952
prepare_transfer_to_handler:
60-
SAVE_NVGPRS(r11)
61-
addi r3,r1,STACK_FRAME_OVERHEAD
62-
stw r2,GPR2(r11)
63-
stw r12,_NIP(r11)
64-
stw r9,_MSR(r11)
65-
andi. r2,r9,MSR_PR
66-
mfctr r12
67-
mfspr r2,SPRN_XER
68-
stw r12,_CTR(r11)
69-
stw r2,_XER(r11)
70-
mfspr r12,SPRN_SPRG_THREAD
71-
tovirt(r12, r12)
53+
andi. r12,r9,MSR_PR
54+
addi r12,r2,THREAD
7255
beq 2f
73-
addi r2, r12, -THREAD
7456
#ifdef CONFIG_PPC_BOOK3S_32
7557
kuep_lock r11, r12
7658
#endif
7759
blr
7860

7961
/* if from kernel, check interrupted DOZE/NAP mode */
8062
2:
81-
kuap_save_and_lock r11, r12, r9, r2, r6
82-
addi r2, r12, -THREAD
63+
kuap_save_and_lock r11, r12, r9, r5, r6
8364
#if defined(CONFIG_PPC_BOOK3S_32) || defined(CONFIG_E500)
8465
lwz r12,TI_LOCAL_FLAGS(r2)
8566
mtcrf 0x01,r12
@@ -293,7 +274,7 @@ fast_exception_return:
293274

294275
2: REST_4GPRS(3, r11)
295276
lwz r10,_CCR(r11)
296-
REST_GPR(1, r11)
277+
REST_2GPRS(1, r11)
297278
mtcr r10
298279
lwz r10,_LINK(r11)
299280
mtlr r10

arch/powerpc/kernel/head_32.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,18 @@ _ASM_NOKPROBE_SYMBOL(\name\()_virt)
117117
stw r10,_TRAP(r1)
118118
SAVE_4GPRS(3, r1)
119119
SAVE_2GPRS(7, r1)
120+
SAVE_NVGPRS(r1)
121+
stw r2,GPR2(r1)
122+
stw r12,_NIP(r1)
123+
stw r9,_MSR(r1)
124+
mfctr r10
125+
mfspr r2,SPRN_SPRG_THREAD
126+
stw r10,_CTR(r1)
127+
tovirt(r2, r2)
128+
mfspr r10,SPRN_XER
129+
addi r2, r2, -THREAD
130+
stw r10,_XER(r1)
131+
addi r3,r1,STACK_FRAME_OVERHEAD
120132
.endm
121133

122134
.macro prepare_transfer_to_handler

arch/powerpc/kernel/head_booke.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,18 @@ END_BTB_FLUSH_SECTION
8989
stw r10,_TRAP(r1)
9090
SAVE_4GPRS(3, r1)
9191
SAVE_2GPRS(7, r1)
92+
SAVE_NVGPRS(r1)
93+
stw r2,GPR2(r1)
94+
stw r12,_NIP(r1)
95+
stw r9,_MSR(r1)
96+
mfctr r10
97+
mfspr r2,SPRN_SPRG_THREAD
98+
stw r10,_CTR(r1)
99+
tovirt(r2, r2)
100+
mfspr r10,SPRN_XER
101+
addi r2, r2, -THREAD
102+
stw r10,_XER(r1)
103+
addi r3,r1,STACK_FRAME_OVERHEAD
92104
.endm
93105

94106
.macro prepare_transfer_to_handler

0 commit comments

Comments
 (0)