Skip to content

Commit 8314191

Browse files
stffrdhrngregkh
authored andcommitted
openrisc: entry: Fix delay slot exception detection
[ Upstream commit ae15a41 ] Originally in patch e6d20c5 ("openrisc: entry: Fix delay slot detection") I fixed delay slot detection, but only for QEMU. We missed that hardware delay slot detection using delay slot exception flag (DSX) was still broken. This was because QEMU set the DSX flag in both pre-exception supervision register (ESR) and supervision register (SR) register, but on real hardware the DSX flag is only set on the SR register during exceptions. Fix this by carrying the DSX flag into the SR register during exception. We also update the DSX flag read locations to read the value from the SR register not the pt_regs SR register which represents ESR. The ESR should never have the DSX flag set. In the process I updated/removed a few comments to match the current state. Including removing a comment saying that the DSX detection logic was inefficient and needed to be rewritten. I have tested this on QEMU with a patch ensuring it matches the hardware specification. Link: https://lists.gnu.org/archive/html/qemu-devel/2018-07/msg00000.html Fixes: e6d20c5 ("openrisc: entry: Fix delay slot detection") Signed-off-by: Stafford Horne <[email protected]> Signed-off-by: Sasha Levin <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent c845344 commit 8314191

File tree

3 files changed

+8
-11
lines changed

3 files changed

+8
-11
lines changed

arch/openrisc/kernel/entry.S

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -221,12 +221,6 @@ EXCEPTION_ENTRY(_data_page_fault_handler)
221221
l.addi r3,r1,0 // pt_regs
222222
/* r4 set be EXCEPTION_HANDLE */ // effective address of fault
223223

224-
/*
225-
* __PHX__: TODO
226-
*
227-
* all this can be written much simpler. look at
228-
* DTLB miss handler in the CONFIG_GUARD_PROTECTED_CORE part
229-
*/
230224
#ifdef CONFIG_OPENRISC_NO_SPR_SR_DSX
231225
l.lwz r6,PT_PC(r3) // address of an offending insn
232226
l.lwz r6,0(r6) // instruction that caused pf
@@ -258,7 +252,7 @@ EXCEPTION_ENTRY(_data_page_fault_handler)
258252

259253
#else
260254

261-
l.lwz r6,PT_SR(r3) // SR
255+
l.mfspr r6,r0,SPR_SR // SR
262256
l.andi r6,r6,SPR_SR_DSX // check for delay slot exception
263257
l.sfne r6,r0 // exception happened in delay slot
264258
l.bnf 7f

arch/openrisc/kernel/head.S

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,7 @@
141141
* r4 - EEAR exception EA
142142
* r10 - current pointing to current_thread_info struct
143143
* r12 - syscall 0, since we didn't come from syscall
144-
* r13 - temp it actually contains new SR, not needed anymore
145-
* r31 - handler address of the handler we'll jump to
144+
* r30 - handler address of the handler we'll jump to
146145
*
147146
* handler has to save remaining registers to the exception
148147
* ksp frame *before* tainting them!
@@ -178,6 +177,7 @@
178177
/* r1 is KSP, r30 is __pa(KSP) */ ;\
179178
tophys (r30,r1) ;\
180179
l.sw PT_GPR12(r30),r12 ;\
180+
/* r4 use for tmp before EA */ ;\
181181
l.mfspr r12,r0,SPR_EPCR_BASE ;\
182182
l.sw PT_PC(r30),r12 ;\
183183
l.mfspr r12,r0,SPR_ESR_BASE ;\
@@ -197,7 +197,10 @@
197197
/* r12 == 1 if we come from syscall */ ;\
198198
CLEAR_GPR(r12) ;\
199199
/* ----- turn on MMU ----- */ ;\
200-
l.ori r30,r0,(EXCEPTION_SR) ;\
200+
/* Carry DSX into exception SR */ ;\
201+
l.mfspr r30,r0,SPR_SR ;\
202+
l.andi r30,r30,SPR_SR_DSX ;\
203+
l.ori r30,r30,(EXCEPTION_SR) ;\
201204
l.mtspr r0,r30,SPR_ESR_BASE ;\
202205
/* r30: EA address of handler */ ;\
203206
LOAD_SYMBOL_2_GPR(r30,handler) ;\

arch/openrisc/kernel/traps.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ static inline int in_delay_slot(struct pt_regs *regs)
358358
return 0;
359359
}
360360
#else
361-
return regs->sr & SPR_SR_DSX;
361+
return mfspr(SPR_SR) & SPR_SR_DSX;
362362
#endif
363363
}
364364

0 commit comments

Comments
 (0)