Skip to content

Commit 2a55550

Browse files
committed
m68k: cmpxchg: Dereference matching size
Similar to the recent arm64 fix[1], avoid overly wide casts in the m68k cmpxchg implementation. Avoids this warning under -Warray-bounds with GCC 11: net/sched/cls_tcindex.c: In function 'tcindex_set_parms': ./arch/m68k/include/asm/cmpxchg.h:64:17: warning: array subscript 'volatile struct __xchg_dummy[0]' is partly outside array bounds of 'struct tcf_result[1]' [-Warray-bounds] 64 | __asm__ __volatile__ | ^~~~~~~ net/sched/cls_tcindex.c:338:27: note: while referencing 'cr' 338 | struct tcf_result cr = {}; | ^~ No binary output difference are seen from this change. [1] commit 3364c6c ("arm64: atomics: lse: Dereference matching size") Cc: "Peter Zijlstra (Intel)" <peterz@infradead.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Greg Ungerer <gerg@linux-m68k.org> Cc: linux-m68k@lists.linux-m68k.org Acked-by: Geert Uytterhoeven <geert@linux-m68k.org> Link: https://lore.kernel.org/lkml/CAMuHMdVRrD+2zKoHxAaQdDuiK5JFDanbv0SJ91OdWfx+eyekPQ@mail.gmail.com Signed-off-by: Kees Cook <keescook@chromium.org>
1 parent 9ed0a59 commit 2a55550

1 file changed

Lines changed: 4 additions & 5 deletions

File tree

arch/m68k/include/asm/cmpxchg.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44

55
#include <linux/irqflags.h>
66

7-
struct __xchg_dummy { unsigned long a[100]; };
8-
#define __xg(x) ((volatile struct __xchg_dummy *)(x))
7+
#define __xg(type, x) ((volatile type *)(x))
98

109
extern unsigned long __invalid_xchg_size(unsigned long, volatile void *, int);
1110

@@ -50,23 +49,23 @@ static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int siz
5049
"1:\n\t"
5150
"casb %0,%1,%2\n\t"
5251
"jne 1b"
53-
: "=&d" (x) : "d" (x), "m" (*__xg(ptr)) : "memory");
52+
: "=&d" (x) : "d" (x), "m" (*__xg(u8, ptr)) : "memory");
5453
break;
5554
case 2:
5655
__asm__ __volatile__
5756
("movew %2,%0\n\t"
5857
"1:\n\t"
5958
"casw %0,%1,%2\n\t"
6059
"jne 1b"
61-
: "=&d" (x) : "d" (x), "m" (*__xg(ptr)) : "memory");
60+
: "=&d" (x) : "d" (x), "m" (*__xg(u16, ptr)) : "memory");
6261
break;
6362
case 4:
6463
__asm__ __volatile__
6564
("movel %2,%0\n\t"
6665
"1:\n\t"
6766
"casl %0,%1,%2\n\t"
6867
"jne 1b"
69-
: "=&d" (x) : "d" (x), "m" (*__xg(ptr)) : "memory");
68+
: "=&d" (x) : "d" (x), "m" (*__xg(u32, ptr)) : "memory");
7069
break;
7170
default:
7271
x = __invalid_xchg_size(x, ptr, size);

0 commit comments

Comments
 (0)