| From 94ee12b507db8b5876e31c9d6c9d84f556a4b49f Mon Sep 17 00:00:00 2001 |
| From: Michael Clark <michaeljclark@mac.com> |
| Date: Mon, 11 Feb 2019 17:38:29 +1300 |
| Subject: MIPS: fix truncation in __cmpxchg_small for short values |
| |
| From: Michael Clark <michaeljclark@mac.com> |
| |
| commit 94ee12b507db8b5876e31c9d6c9d84f556a4b49f upstream. |
| |
| __cmpxchg_small erroneously uses u8 for load comparison which can |
| be either char or short. This patch changes the local variable to |
| u32 which is sufficiently sized, as the loaded value is already |
| masked and shifted appropriately. Using an integer size avoids |
| any unnecessary canonicalization from use of non native widths. |
| |
| This patch is part of a series that adapts the MIPS small word |
| atomics code for xchg and cmpxchg on short and char to RISC-V. |
| |
| Cc: RISC-V Patches <patches@groups.riscv.org> |
| Cc: Linux RISC-V <linux-riscv@lists.infradead.org> |
| Cc: Linux MIPS <linux-mips@linux-mips.org> |
| Signed-off-by: Michael Clark <michaeljclark@mac.com> |
| [paul.burton@mips.com: |
| - Fix varialble typo per Jonas Gorski. |
| - Consolidate load variable with other declarations.] |
| Signed-off-by: Paul Burton <paul.burton@mips.com> |
| Fixes: 3ba7f44d2b19 ("MIPS: cmpxchg: Implement 1 byte & 2 byte cmpxchg()") |
| Cc: stable@vger.kernel.org # v4.13+ |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/mips/kernel/cmpxchg.c | 3 +-- |
| 1 file changed, 1 insertion(+), 2 deletions(-) |
| |
| --- a/arch/mips/kernel/cmpxchg.c |
| +++ b/arch/mips/kernel/cmpxchg.c |
| @@ -54,10 +54,9 @@ unsigned long __xchg_small(volatile void |
| unsigned long __cmpxchg_small(volatile void *ptr, unsigned long old, |
| unsigned long new, unsigned int size) |
| { |
| - u32 mask, old32, new32, load32; |
| + u32 mask, old32, new32, load32, load; |
| volatile u32 *ptr32; |
| unsigned int shift; |
| - u8 load; |
| |
| /* Check that ptr is naturally aligned */ |
| WARN_ON((unsigned long)ptr & (size - 1)); |