xtensa: add fixup for double exception raised in window overflow
authorMax Filippov <jcmvbkbc@gmail.com>
Sat, 24 May 2014 17:48:28 +0000 (21:48 +0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 7 Aug 2014 21:52:39 +0000 (14:52 -0700)
commite4cbf9a98c9ed2d1578399928bb101dca7b95c5e
tree409994baea12b6c87116adf4804a63d7e9df7cce
parentc1bf0e867cb6364eb4e17c757120ae01d4623a0e
xtensa: add fixup for double exception raised in window overflow

commit 17290231df16eeee5dfc198dbf5ee4b419996dcd upstream.

There are two FIXMEs in the double exception handler 'for the extremely
unlikely case'. This case gets hit by gcc during kernel build once in
a few hours, resulting in an unrecoverable exception condition.

Provide missing fixup routine to handle this case. Double exception
literals now need 8 more bytes, add them to the linker script.

Also replace bbsi instructions with bbsi.l as we're branching depending
on 8th and 7th LSB-based bits of exception address.

This may be tested by adding the explicit DTLB invalidation to window
overflow handlers, like the following:

#    --- a/arch/xtensa/kernel/vectors.S
#    +++ b/arch/xtensa/kernel/vectors.S
#    @@ -592,6 +592,14 @@ ENDPROC(_WindowUnderflow4)
#     ENTRY_ALIGN64(_WindowOverflow8)
#
#     s32e a0, a9, -16
#    + bbsi.l a9, 31, 1f
#    + rsr a0, ccount
#    + bbsi.l a0, 4, 1f
#    + pdtlb a0, a9
#    + idtlb a0
#    + movi a0, 9
#    + idtlb a0
#    +1:
#     l32e    a0, a1, -12
#     s32e    a2, a9,  -8
#     s32e    a1, a9, -12

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/xtensa/kernel/vectors.S
arch/xtensa/kernel/vmlinux.lds.S