diff options
author | Max Filippov <jcmvbkbc@gmail.com> | 2020-07-31 12:38:05 -0700 |
---|---|---|
committer | Max Filippov <jcmvbkbc@gmail.com> | 2020-07-31 14:15:57 -0700 |
commit | a0fc1436f1f4f84e93144480bf30e0c958d135b6 (patch) | |
tree | 3b2aef37c8000b3ae4a6f205f35c6e0c4dbf53f0 /arch/xtensa/include | |
parent | 6d65d3769d1910379e1cfa61ebf387efc6bfb22c (diff) |
xtensa: add missing exclusive access state management
The result of the s32ex opcode is recorded in the ATOMCTL special
register and must be retrieved with the getex opcode. Context switch
between s32ex and getex may trash the ATOMCTL register and result in
duplicate update or missing update of the atomic variable.
Add atomctl8 field to the struct thread_info and use getex to swap
ATOMCTL bit 8 as a part of context switch.
Clear exclusive access monitor on kernel entry.
Cc: stable@vger.kernel.org
Fixes: f7c34874f04a ("xtensa: add exclusive atomics support")
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
Diffstat (limited to 'arch/xtensa/include')
-rw-r--r-- | arch/xtensa/include/asm/thread_info.h | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/arch/xtensa/include/asm/thread_info.h b/arch/xtensa/include/asm/thread_info.h index 8918f0f20c53..6acbbe0d87d3 100644 --- a/arch/xtensa/include/asm/thread_info.h +++ b/arch/xtensa/include/asm/thread_info.h @@ -55,6 +55,10 @@ struct thread_info { mm_segment_t addr_limit; /* thread address space */ unsigned long cpenable; +#if XCHAL_HAVE_EXCLUSIVE + /* result of the most recent exclusive store */ + unsigned long atomctl8; +#endif /* Allocate storage for extra user states and coprocessor states. */ #if XTENSA_HAVE_COPROCESSORS |