mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 19:08:57 +09:00
powerpc/64s: Mask SRR0 before checking against the masked NIP
[ Upstream commitaee101d7b9] Commit314f6c23dd("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:314f6c23dd("powerpc/64s: Mask NIP before checking against SRR0") Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20220117134403.2995059-1-npiggin@gmail.com Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
3dc90add0c
commit
498e6604a3
@@ -30,6 +30,7 @@ COMPAT_SYS_CALL_TABLE:
|
||||
.ifc \srr,srr
|
||||
mfspr r11,SPRN_SRR0
|
||||
ld r12,_NIP(r1)
|
||||
clrrdi r11,r11,2
|
||||
clrrdi r12,r12,2
|
||||
100: tdne r11,r12
|
||||
EMIT_WARN_ENTRY 100b,__FILE__,__LINE__,(BUGFLAG_WARNING | BUGFLAG_ONCE)
|
||||
@@ -40,6 +41,7 @@ COMPAT_SYS_CALL_TABLE:
|
||||
.else
|
||||
mfspr r11,SPRN_HSRR0
|
||||
ld r12,_NIP(r1)
|
||||
clrrdi r11,r11,2
|
||||
clrrdi r12,r12,2
|
||||
100: tdne r11,r12
|
||||
EMIT_WARN_ENTRY 100b,__FILE__,__LINE__,(BUGFLAG_WARNING | BUGFLAG_ONCE)
|
||||
|
||||
Reference in New Issue
Block a user