Skip to content

Commit aee101d

Browse files
npigginmpe
authored andcommitted
powerpc/64s: Mask SRR0 before checking against the masked NIP
Commit 314f6c2 ("powerpc/64s: Mask NIP before checking against SRR0") masked off the low 2 bits of the NIP value in the interrupt stack frame in case they are non-zero and mis-compare against a SRR0 register value of a CPU which always reads back 0 from the 2 low bits which are reserved. This now causes the opposite problem that an implementation which does implement those bits in SRR0 will mis-compare against the masked NIP value in which they have been cleared. QEMU is one such implementation, and this is allowed by the architecture. This can be triggered by sigfuz by setting low bits of PT_NIP in the signal context. Fix this for now by masking the SRR0 bits as well. Cleaner is probably to sanitise these values before putting them in registers or stack, but this is the quick and backportable fix. Fixes: 314f6c2 ("powerpc/64s: Mask NIP before checking against SRR0") Signed-off-by: Nicholas Piggin <[email protected]> Signed-off-by: Michael Ellerman <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 429a64f commit aee101d

File tree

1 file changed

+2
-0
lines changed

1 file changed

+2
-0
lines changed

arch/powerpc/kernel/interrupt_64.S

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ COMPAT_SYS_CALL_TABLE:
3030
.ifc \srr,srr
3131
mfspr r11,SPRN_SRR0
3232
ld r12,_NIP(r1)
33+
clrrdi r11,r11,2
3334
clrrdi r12,r12,2
3435
100: tdne r11,r12
3536
EMIT_WARN_ENTRY 100b,__FILE__,__LINE__,(BUGFLAG_WARNING | BUGFLAG_ONCE)
@@ -40,6 +41,7 @@ COMPAT_SYS_CALL_TABLE:
4041
.else
4142
mfspr r11,SPRN_HSRR0
4243
ld r12,_NIP(r1)
44+
clrrdi r11,r11,2
4345
clrrdi r12,r12,2
4446
100: tdne r11,r12
4547
EMIT_WARN_ENTRY 100b,__FILE__,__LINE__,(BUGFLAG_WARNING | BUGFLAG_ONCE)

0 commit comments

Comments
 (0)