powerpc/64s: Fix scv implicit soft-mask table for relocated kernels
The implict soft-mask table addresses get relocated if they use a
relative symbol like a label. This is right for code that runs relocated
but not for unrelocated. The scv interrupt vectors run unrelocated, so
absolute addresses are required for their soft-mask table entry.
This fixes crashing with relocated kernels, usually an asynchronous
interrupt hitting in the scv handler, then hitting the trap that checks
whether r1 is in userspace.
Fixes: 325678fd05 ("powerpc/64s: add a table of implicit soft-masked addresses")
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20210820103431.1701240-1-npiggin@gmail.com
This commit is contained in:
committed by
Michael Ellerman
parent
310d2e83cb
commit
787c70f2f9
@@ -812,7 +812,6 @@ __start_interrupts:
|
|||||||
* syscall register convention is in Documentation/powerpc/syscall64-abi.rst
|
* syscall register convention is in Documentation/powerpc/syscall64-abi.rst
|
||||||
*/
|
*/
|
||||||
EXC_VIRT_BEGIN(system_call_vectored, 0x3000, 0x1000)
|
EXC_VIRT_BEGIN(system_call_vectored, 0x3000, 0x1000)
|
||||||
1:
|
|
||||||
/* SCV 0 */
|
/* SCV 0 */
|
||||||
mr r9,r13
|
mr r9,r13
|
||||||
GET_PACA(r13)
|
GET_PACA(r13)
|
||||||
@@ -842,10 +841,12 @@ EXC_VIRT_BEGIN(system_call_vectored, 0x3000, 0x1000)
|
|||||||
b system_call_vectored_sigill
|
b system_call_vectored_sigill
|
||||||
#endif
|
#endif
|
||||||
.endr
|
.endr
|
||||||
2:
|
|
||||||
EXC_VIRT_END(system_call_vectored, 0x3000, 0x1000)
|
EXC_VIRT_END(system_call_vectored, 0x3000, 0x1000)
|
||||||
|
|
||||||
SOFT_MASK_TABLE(1b, 2b) // Treat scv vectors as soft-masked, see comment above.
|
// Treat scv vectors as soft-masked, see comment above.
|
||||||
|
// Use absolute values rather than labels here, so they don't get relocated,
|
||||||
|
// because this code runs unrelocated.
|
||||||
|
SOFT_MASK_TABLE(0xc000000000003000, 0xc000000000004000)
|
||||||
|
|
||||||
#ifdef CONFIG_RELOCATABLE
|
#ifdef CONFIG_RELOCATABLE
|
||||||
TRAMP_VIRT_BEGIN(system_call_vectored_tramp)
|
TRAMP_VIRT_BEGIN(system_call_vectored_tramp)
|
||||||
|
|||||||
Reference in New Issue
Block a user