* [Buildroot] [PATCH] package/uclibc: fix m68000 toolchain builds
@ 2026-08-25 7:00 Waldemar Brodkorb
2026-08-25 20:14 ` Julien Olivain via buildroot
2026-09-04 12:18 ` Thomas Perale via buildroot
0 siblings, 2 replies; 3+ messages in thread
From: Waldemar Brodkorb @ 2026-08-25 7:00 UTC (permalink / raw)
To: buildroot
Add a patch from Upstream to fix building of a m68000
toolchain.
Fixes:
- https://autobuild.buildroot.net/results/4cc/4cc0de3d33339bd50792ca224f10dfd18a636b00/
Signed-off-by: Waldemar Brodkorb <wbx@openadk.org>
---
...nel-helper-on-every-core-without-CAS.patch | 116 ++++++++++++++++++
1 file changed, 116 insertions(+)
create mode 100644 package/uclibc/0004-m68k-use-the-kernel-helper-on-every-core-without-CAS.patch
diff --git a/package/uclibc/0004-m68k-use-the-kernel-helper-on-every-core-without-CAS.patch b/package/uclibc/0004-m68k-use-the-kernel-helper-on-every-core-without-CAS.patch
new file mode 100644
index 0000000000..3ac756f4c7
--- /dev/null
+++ b/package/uclibc/0004-m68k-use-the-kernel-helper-on-every-core-without-CAS.patch
@@ -0,0 +1,116 @@
+From 5222fefffa0270c2f2d50961a4b75ef7f5605c29 Mon Sep 17 00:00:00 2001
+From: ramin <lordrasmus@gmail.com>
+Date: Mon, 24 Aug 2026 13:06:02 +0200
+Subject: [PATCH] m68k: use the kernel helper on every core without CAS, not
+ just ColdFire
+
+The atomic header split the world into ColdFire and "the rest", assuming the
+rest was 68020 and up. That holds for the MMU port, but not for the 68000 and
+68010, which have no atomic read-modify-write instruction either. Building for
+one of them stops at the first cas:
+
+ Error: invalid instruction for this architecture; needs 68020 or higher
+ (68020 [68k, 68ec020], 68030 [68ec030], 68040 [68ec040],
+ 68060 [68ec060]) -- statement `cas.l %d0,%d1,(%a1)' ignored
+
+Reported by Waldemar Brodkorb from a Buildroot autobuilder failure; Buildroot
+supports m68000 and has at least one user on it.
+
+Decide by the presence of CAS instead. The instruction came with the 68020, so
+the test is the list of the 68020-and-up cores: gcc defines a separate macro
+per core and does not imply __mc68020__ on the later ones, and __mc68000__ is
+no help because it is defined on every m68k, the 68040 and ColdFire included.
+
+Nothing else changes: the kernel's atomic_cmpxchg_32 is syscall 335 "common"
+in arch/m68k/kernel/syscalls/syscall.tbl and has an implementation for the MMU
+as well as the noMMU port, so the branch the old cores now take is the one
+ColdFire has been using all along - including its documented limit that the
+8- and 16-bit variants stay non-atomic, since the helper is 32-bit only.
+
+Checked with a cross gcc over -m68000, -m68010, -m68020, -m68030, -m68040,
+-m68060, -mcpu=5206 and -mcpu=5208: the three old cores and both ColdFires
+select the helper, the four others select cas, and each branch assembles for
+the cores that select it.
+
+Upstream: https://gogs.waldemar-brodkorb.de/oss/uclibc-ng/commit/5222fefffa0270c2f2d50961a4b75ef7f5605c29
+Signed-off-by: Ramin Moussavi <ramin.moussavi@yacoub.de>
+Signed-off-by: Waldemar Brodkorb <wbx@openadk.org>
+---
+ libc/sysdeps/linux/m68k/bits/atomic.h | 32 ++++++++++++++++++---------
+ 1 file changed, 22 insertions(+), 10 deletions(-)
+
+diff --git a/libc/sysdeps/linux/m68k/bits/atomic.h b/libc/sysdeps/linux/m68k/bits/atomic.h
+index cf7fd5f65..6acec1ed8 100644
+--- a/libc/sysdeps/linux/m68k/bits/atomic.h
++++ b/libc/sysdeps/linux/m68k/bits/atomic.h
+@@ -3,13 +3,15 @@
+
+ Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+
+- m68k (68020 and up, which is everything the MMU Linux port runs on) has
+- the CAS instruction. We implement the compare-and-exchange primitive
+- with cas.b/cas.w/cas.l; include/atomic.h derives every higher-level
+- operation from it.
++ The CAS instruction arrived with the 68020. Where it exists we implement
++ the compare-and-exchange primitive with cas.b/cas.w/cas.l and let
++ include/atomic.h derive every higher-level operation from it.
+
+- ColdFire has no CAS at all, so there we use the kernel's
+- atomic_cmpxchg_32 helper, which exists for exactly this reason.
++ ColdFire, 68000 and 68010 have no atomic read-modify-write instruction at
++ all. There we use the kernel's atomic_cmpxchg_32 helper, which exists for
++ exactly this reason and is available on every m68k (syscall 335, "common"
++ in arch/m68k/kernel/syscalls/syscall.tbl, with an implementation for both
++ the MMU and the noMMU port).
+
+ Without this file m68k fell back to the generic non-atomic
+ bits/atomic.h, whose "atomic" compare-and-exchange is a plain
+@@ -22,7 +24,17 @@
+ #define _M68K_BITS_ATOMIC_H 1
+
+ #include <stdint.h>
+-#ifdef __mcoldfire__
++
++/* CAS came with the 68020. gcc sets a separate macro per core and does not
++ imply __mc68020__ on the later ones, hence the list; __mc68000__ is no help
++ here, it is defined on every m68k, the 68040 and ColdFire included.
++ Everything without CAS - ColdFire, 68000, 68010 - uses the kernel helper. */
++#if defined __mc68020__ || defined __mc68030__ \
++ || defined __mc68040__ || defined __mc68060__
++# define __M68K_HAVE_CAS 1
++#endif
++
++#ifndef __M68K_HAVE_CAS
+ # include <sys/syscall.h>
+ #endif
+
+@@ -58,7 +70,7 @@ typedef uintmax_t uatomic_max_t;
+ #define atomic_read_barrier() atomic_full_barrier ()
+ #define atomic_write_barrier() atomic_full_barrier ()
+
+-#ifndef __mcoldfire__
++#ifdef __M68K_HAVE_CAS
+
+ /* cas Dc,Du,<ea>: compare <ea> with Dc; if equal store Du, else load <ea>
+ into Dc. Either way Dc ends up holding the original *MEM, which is the
+@@ -87,7 +99,7 @@ typedef uintmax_t uatomic_max_t;
+ : "memory"); \
+ __ret; })
+
+-#else /* __mcoldfire__ */
++#else /* !__M68K_HAVE_CAS */
+
+ /* d0 = syscall number, d1 = newval, d2 = oldval, a0 = mem; the helper
+ returns the previous value. The swap happens inside the syscall, so
+@@ -116,7 +128,7 @@ typedef uintmax_t uatomic_max_t;
+ #define __arch_compare_and_exchange_val_16_acq(mem, newval, oldval) \
+ __arch_compare_and_exchange_val_8_acq (mem, newval, oldval)
+
+-#endif /* __mcoldfire__ */
++#endif /* __M68K_HAVE_CAS */
+
+ /* m68k has no 64-bit CAS; NPTL and include/atomic.h only use int- and
+ pointer-sized objects, so the bysize dispatch never reaches this. */
+--
+2.47.3
+
--
2.47.3
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [Buildroot] [PATCH] package/uclibc: fix m68000 toolchain builds
2026-08-25 7:00 [Buildroot] [PATCH] package/uclibc: fix m68000 toolchain builds Waldemar Brodkorb
@ 2026-08-25 20:14 ` Julien Olivain via buildroot
2026-09-04 12:18 ` Thomas Perale via buildroot
1 sibling, 0 replies; 3+ messages in thread
From: Julien Olivain via buildroot @ 2026-08-25 20:14 UTC (permalink / raw)
To: Waldemar Brodkorb; +Cc: buildroot
On 25/08/2026 09:00, Waldemar Brodkorb wrote:
> Add a patch from Upstream to fix building of a m68000
> toolchain.
>
> Fixes:
> -
> https://autobuild.buildroot.net/results/4cc/4cc0de3d33339bd50792ca224f10dfd18a636b00/
>
> Signed-off-by: Waldemar Brodkorb <wbx@openadk.org>
Applied to master, thanks.
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Buildroot] [PATCH] package/uclibc: fix m68000 toolchain builds
2026-08-25 7:00 [Buildroot] [PATCH] package/uclibc: fix m68000 toolchain builds Waldemar Brodkorb
2026-08-25 20:14 ` Julien Olivain via buildroot
@ 2026-09-04 12:18 ` Thomas Perale via buildroot
1 sibling, 0 replies; 3+ messages in thread
From: Thomas Perale via buildroot @ 2026-09-04 12:18 UTC (permalink / raw)
To: Waldemar Brodkorb; +Cc: Thomas Perale, buildroot
In reply of:
> Add a patch from Upstream to fix building of a m68000
> toolchain.
>
> Fixes:
> - https://autobuild.buildroot.net/results/4cc/4cc0de3d33339bd50792ca224f10dfd18a636b00/
>
> Signed-off-by: Waldemar Brodkorb <wbx@openadk.org>
Applied to 2025.02.x & 2026.05.x. Thanks
> ---
> ...nel-helper-on-every-core-without-CAS.patch | 116 ++++++++++++++++++
> 1 file changed, 116 insertions(+)
> create mode 100644 package/uclibc/0004-m68k-use-the-kernel-helper-on-every-core-without-CAS.patch
>
> diff --git a/package/uclibc/0004-m68k-use-the-kernel-helper-on-every-core-without-CAS.patch b/package/uclibc/0004-m68k-use-the-kernel-helper-on-every-core-without-CAS.patch
> new file mode 100644
> index 0000000000..3ac756f4c7
> --- /dev/null
> +++ b/package/uclibc/0004-m68k-use-the-kernel-helper-on-every-core-without-CAS.patch
> @@ -0,0 +1,116 @@
> +From 5222fefffa0270c2f2d50961a4b75ef7f5605c29 Mon Sep 17 00:00:00 2001
> +From: ramin <lordrasmus@gmail.com>
> +Date: Mon, 24 Aug 2026 13:06:02 +0200
> +Subject: [PATCH] m68k: use the kernel helper on every core without CAS, not
> + just ColdFire
> +
> +The atomic header split the world into ColdFire and "the rest", assuming the
> +rest was 68020 and up. That holds for the MMU port, but not for the 68000 and
> +68010, which have no atomic read-modify-write instruction either. Building for
> +one of them stops at the first cas:
> +
> + Error: invalid instruction for this architecture; needs 68020 or higher
> + (68020 [68k, 68ec020], 68030 [68ec030], 68040 [68ec040],
> + 68060 [68ec060]) -- statement `cas.l %d0,%d1,(%a1)' ignored
> +
> +Reported by Waldemar Brodkorb from a Buildroot autobuilder failure; Buildroot
> +supports m68000 and has at least one user on it.
> +
> +Decide by the presence of CAS instead. The instruction came with the 68020, so
> +the test is the list of the 68020-and-up cores: gcc defines a separate macro
> +per core and does not imply __mc68020__ on the later ones, and __mc68000__ is
> +no help because it is defined on every m68k, the 68040 and ColdFire included.
> +
> +Nothing else changes: the kernel's atomic_cmpxchg_32 is syscall 335 "common"
> +in arch/m68k/kernel/syscalls/syscall.tbl and has an implementation for the MMU
> +as well as the noMMU port, so the branch the old cores now take is the one
> +ColdFire has been using all along - including its documented limit that the
> +8- and 16-bit variants stay non-atomic, since the helper is 32-bit only.
> +
> +Checked with a cross gcc over -m68000, -m68010, -m68020, -m68030, -m68040,
> +-m68060, -mcpu=5206 and -mcpu=5208: the three old cores and both ColdFires
> +select the helper, the four others select cas, and each branch assembles for
> +the cores that select it.
> +
> +Upstream: https://gogs.waldemar-brodkorb.de/oss/uclibc-ng/commit/5222fefffa0270c2f2d50961a4b75ef7f5605c29
> +Signed-off-by: Ramin Moussavi <ramin.moussavi@yacoub.de>
> +Signed-off-by: Waldemar Brodkorb <wbx@openadk.org>
> +---
> + libc/sysdeps/linux/m68k/bits/atomic.h | 32 ++++++++++++++++++---------
> + 1 file changed, 22 insertions(+), 10 deletions(-)
> +
> +diff --git a/libc/sysdeps/linux/m68k/bits/atomic.h b/libc/sysdeps/linux/m68k/bits/atomic.h
> +index cf7fd5f65..6acec1ed8 100644
> +--- a/libc/sysdeps/linux/m68k/bits/atomic.h
> ++++ b/libc/sysdeps/linux/m68k/bits/atomic.h
> +@@ -3,13 +3,15 @@
> +
> + Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
> +
> +- m68k (68020 and up, which is everything the MMU Linux port runs on) has
> +- the CAS instruction. We implement the compare-and-exchange primitive
> +- with cas.b/cas.w/cas.l; include/atomic.h derives every higher-level
> +- operation from it.
> ++ The CAS instruction arrived with the 68020. Where it exists we implement
> ++ the compare-and-exchange primitive with cas.b/cas.w/cas.l and let
> ++ include/atomic.h derive every higher-level operation from it.
> +
> +- ColdFire has no CAS at all, so there we use the kernel's
> +- atomic_cmpxchg_32 helper, which exists for exactly this reason.
> ++ ColdFire, 68000 and 68010 have no atomic read-modify-write instruction at
> ++ all. There we use the kernel's atomic_cmpxchg_32 helper, which exists for
> ++ exactly this reason and is available on every m68k (syscall 335, "common"
> ++ in arch/m68k/kernel/syscalls/syscall.tbl, with an implementation for both
> ++ the MMU and the noMMU port).
> +
> + Without this file m68k fell back to the generic non-atomic
> + bits/atomic.h, whose "atomic" compare-and-exchange is a plain
> +@@ -22,7 +24,17 @@
> + #define _M68K_BITS_ATOMIC_H 1
> +
> + #include <stdint.h>
> +-#ifdef __mcoldfire__
> ++
> ++/* CAS came with the 68020. gcc sets a separate macro per core and does not
> ++ imply __mc68020__ on the later ones, hence the list; __mc68000__ is no help
> ++ here, it is defined on every m68k, the 68040 and ColdFire included.
> ++ Everything without CAS - ColdFire, 68000, 68010 - uses the kernel helper. */
> ++#if defined __mc68020__ || defined __mc68030__ \
> ++ || defined __mc68040__ || defined __mc68060__
> ++# define __M68K_HAVE_CAS 1
> ++#endif
> ++
> ++#ifndef __M68K_HAVE_CAS
> + # include <sys/syscall.h>
> + #endif
> +
> +@@ -58,7 +70,7 @@ typedef uintmax_t uatomic_max_t;
> + #define atomic_read_barrier() atomic_full_barrier ()
> + #define atomic_write_barrier() atomic_full_barrier ()
> +
> +-#ifndef __mcoldfire__
> ++#ifdef __M68K_HAVE_CAS
> +
> + /* cas Dc,Du,<ea>: compare <ea> with Dc; if equal store Du, else load <ea>
> + into Dc. Either way Dc ends up holding the original *MEM, which is the
> +@@ -87,7 +99,7 @@ typedef uintmax_t uatomic_max_t;
> + : "memory"); \
> + __ret; })
> +
> +-#else /* __mcoldfire__ */
> ++#else /* !__M68K_HAVE_CAS */
> +
> + /* d0 = syscall number, d1 = newval, d2 = oldval, a0 = mem; the helper
> + returns the previous value. The swap happens inside the syscall, so
> +@@ -116,7 +128,7 @@ typedef uintmax_t uatomic_max_t;
> + #define __arch_compare_and_exchange_val_16_acq(mem, newval, oldval) \
> + __arch_compare_and_exchange_val_8_acq (mem, newval, oldval)
> +
> +-#endif /* __mcoldfire__ */
> ++#endif /* __M68K_HAVE_CAS */
> +
> + /* m68k has no 64-bit CAS; NPTL and include/atomic.h only use int- and
> + pointer-sized objects, so the bysize dispatch never reaches this. */
> +--
> +2.47.3
> +
> --
> 2.47.3
>
> _______________________________________________
> buildroot mailing list
> buildroot@buildroot.org
> https://lists.buildroot.org/mailman/listinfo/buildroot
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-09-04 12:19 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-25 7:00 [Buildroot] [PATCH] package/uclibc: fix m68000 toolchain builds Waldemar Brodkorb
2026-08-25 20:14 ` Julien Olivain via buildroot
2026-09-04 12:18 ` Thomas Perale via buildroot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox