package/glibc: enable for m68k with MMU

For qemu-system-m68k with emulates Q800 machine we need to add patches
for glibc to let it compile and run on m68k cpu m68040.
See here for discussions about the issue:
https://sourceware.org/bugzilla/show_bug.cgi?id=30740

Signed-off-by: Waldemar Brodkorb <wbx@openadk.org>
Signed-off-by: Romain Naour <romain.naour@smile.fr>
This commit is contained in:
Waldemar Brodkorb 2023-10-01 11:10:33 +02:00 committed by Romain Naour
parent 14c4bd7bf8
commit 96aab3f078
4 changed files with 198 additions and 0 deletions

View File

@ -0,0 +1,57 @@
From b85880633f69b737050c22eede858f8c13bb2248 Mon Sep 17 00:00:00 2001
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Date: Fri, 18 Aug 2023 14:59:51 -0300
Subject: [PATCH] m68k: Fix build with -mcpu=68040 or higher (BZ 30740)
GCC currently does not define __mc68020__ for -mcpu=68040 or higher,
which memcpy/memmove assumptions. Since this memory copy optimization
seems only intended for m68020, disable for other m680X0 variants.
Checked on a build for m68k-linux-gnu target mc68020 and mc68040.
Signed-off-by: Waldemar Brodkorb <wbx@openadk.org>
Upstream: https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b85880633f69b737050c22eede858f8c13bb2248
---
sysdeps/m68k/m680x0/m68020/wordcopy.S | 1 -
sysdeps/m68k/wordcopy.c | 21 +++++++++++++++++++++
2 files changed, 21 insertions(+), 1 deletion(-)
delete mode 100644 sysdeps/m68k/m680x0/m68020/wordcopy.S
create mode 100644 sysdeps/m68k/wordcopy.c
diff --git a/sysdeps/m68k/m680x0/m68020/wordcopy.S b/sysdeps/m68k/m680x0/m68020/wordcopy.S
deleted file mode 100644
index 4fb1a4518f..0000000000
--- a/sysdeps/m68k/m680x0/m68020/wordcopy.S
+++ /dev/null
@@ -1 +0,0 @@
-/* Empty, not needed. */
diff --git a/sysdeps/m68k/wordcopy.c b/sysdeps/m68k/wordcopy.c
new file mode 100644
index 0000000000..f12d5b7803
--- /dev/null
+++ b/sysdeps/m68k/wordcopy.c
@@ -0,0 +1,21 @@
+/* Definitions for memory copy functions. Motorola 680X0 version
+ Copyright (C) 2023 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library. If not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef __mc68020__
+# include <string/wordcopy.c>
+#endif
--
2.39.2

View File

@ -0,0 +1,47 @@
From 464fd8249e8b791248cab7b0e0cd91757435fa9e Mon Sep 17 00:00:00 2001
From: Andreas Schwab <schwab@linux-m68k.org>
Date: Thu, 17 Aug 2023 17:15:34 +0200
Subject: [PATCH] m68k: fix __mpn_lshift and __mpn_rshift for non-68020
From revision 03f3d275d0d6 in the gmp repository.
Signed-off-by: Waldemar Brodkorb <wbx@openadk.org>
Upstream: https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=464fd8249e8b791248cab7b0e0cd91757435fa9e
---
sysdeps/m68k/m680x0/lshift.S | 4 ++--
sysdeps/m68k/m680x0/rshift.S | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/sysdeps/m68k/m680x0/lshift.S b/sysdeps/m68k/m680x0/lshift.S
index 2aee10348e..4240738959 100644
--- a/sysdeps/m68k/m680x0/lshift.S
+++ b/sysdeps/m68k/m680x0/lshift.S
@@ -77,8 +77,8 @@ L(Lnormal:)
#else /* not mc68000 */
movel R(s_size),R(d0)
asll #2,R(d0)
- addl R(s_size),R(s_ptr)
- addl R(s_size),R(res_ptr)
+ addl R(d0),R(s_ptr)
+ addl R(d0),R(res_ptr)
#endif
movel MEM_PREDEC(s_ptr),R(d2)
movel R(d2),R(d0)
diff --git a/sysdeps/m68k/m680x0/rshift.S b/sysdeps/m68k/m680x0/rshift.S
index d16bca9307..d56a2b4a44 100644
--- a/sysdeps/m68k/m680x0/rshift.S
+++ b/sysdeps/m68k/m680x0/rshift.S
@@ -127,8 +127,8 @@ L(Lspecial:)
#else /* not mc68000 */
movel R(s_size),R(d0)
asll #2,R(d0)
- addl R(s_size),R(s_ptr)
- addl R(s_size),R(res_ptr)
+ addl R(d0),R(s_ptr)
+ addl R(d0),R(res_ptr)
#endif
clrl R(d0) /* initialize carry */
--
2.39.2

View File

@ -0,0 +1,93 @@
From 87ced255bdf2681f5bf6c89d7121e59f6f342161 Mon Sep 17 00:00:00 2001
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Date: Fri, 18 Aug 2023 14:49:31 -0300
Subject: [PATCH] m68k: Use M68K_SCALE_AVAILABLE on __mpn_lshift and
__mpn_rshift
This patch adds a new macro, M68K_SCALE_AVAILABLE, similar to gmp
scale_available_p (mpn/m68k/m68k-defs.m4) that expand to 1 if a
scale factor can be used in addressing modes. This is used
instead of __mc68020__ for some optimization decisions.
Checked on a build for m68k-linux-gnu target mc68020 and mc68040.
Signed-off-by: Waldemar Brodkorb <wbx@openadk.org>
Upstream: https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=87ced255bdf2681f5bf6c89d7121e59f6f342161
---
sysdeps/m68k/m680x0/lshift.S | 6 +++---
sysdeps/m68k/m680x0/rshift.S | 8 ++++----
sysdeps/m68k/m680x0/sysdep.h | 7 +++++++
3 files changed, 14 insertions(+), 7 deletions(-)
diff --git a/sysdeps/m68k/m680x0/lshift.S b/sysdeps/m68k/m680x0/lshift.S
index 4240738959..74de90380b 100644
--- a/sysdeps/m68k/m680x0/lshift.S
+++ b/sysdeps/m68k/m680x0/lshift.S
@@ -57,9 +57,9 @@ ENTRY(__mpn_lshift)
bne L(Lnormal)
cmpl R(s_ptr),R(res_ptr)
bls L(Lspecial) /* jump if s_ptr >= res_ptr */
-#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
+#if M68K_SCALE_AVAILABLE
lea MEM_INDX1(s_ptr,s_size,l,4),R(a2)
-#else /* not mc68020 */
+#else
movel R(s_size),R(d0)
asll #2,R(d0)
lea MEM_INDX(s_ptr,d0,l),R(a2)
@@ -71,7 +71,7 @@ L(Lnormal:)
moveql #32,R(d5)
subl R(cnt),R(d5)
-#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
+#if M68K_SCALE_AVAILABLE
lea MEM_INDX1(s_ptr,s_size,l,4),R(s_ptr)
lea MEM_INDX1(res_ptr,s_size,l,4),R(res_ptr)
#else /* not mc68000 */
diff --git a/sysdeps/m68k/m680x0/rshift.S b/sysdeps/m68k/m680x0/rshift.S
index d56a2b4a44..d398d0287e 100644
--- a/sysdeps/m68k/m680x0/rshift.S
+++ b/sysdeps/m68k/m680x0/rshift.S
@@ -56,9 +56,9 @@ ENTRY(__mpn_rshift)
bne L(Lnormal)
cmpl R(res_ptr),R(s_ptr)
bls L(Lspecial) /* jump if res_ptr >= s_ptr */
-#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
+#if M68K_SCALE_AVAILABLE
lea MEM_INDX1(res_ptr,s_size,l,4),R(a2)
-#else /* not mc68020 */
+#else
movel R(s_size),R(d0)
asll #2,R(d0)
lea MEM_INDX(res_ptr,d0,l),R(a2)
@@ -121,10 +121,10 @@ L(Lend:)
cfi_restore_state
L(Lspecial:)
-#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
+#if M68K_SCALE_AVAILABLE
lea MEM_INDX1(s_ptr,s_size,l,4),R(s_ptr)
lea MEM_INDX1(res_ptr,s_size,l,4),R(res_ptr)
-#else /* not mc68000 */
+#else
movel R(s_size),R(d0)
asll #2,R(d0)
addl R(d0),R(s_ptr)
diff --git a/sysdeps/m68k/m680x0/sysdep.h b/sysdeps/m68k/m680x0/sysdep.h
index b31e101273..bee5b3391c 100644
--- a/sysdeps/m68k/m680x0/sysdep.h
+++ b/sysdeps/m68k/m680x0/sysdep.h
@@ -37,3 +37,10 @@
OP " " SRC "(" PC "), " DST
#endif /* __ASSEMBLER__ */
+
+# if defined __mc68020__ || defined __mc68030__ || defined __mc68040__ \
+ || defined __mc68060__
+# define M68K_SCALE_AVAILABLE 1
+# else
+# define M68K_SCALE_AVAILABLE 0
+# endif
--
2.39.2

View File

@ -5,6 +5,7 @@ config BR2_PACKAGE_GLIBC_ARCH_SUPPORTS
default y if BR2_aarch64
default y if BR2_aarch64_be
default y if BR2_i386
default y if BR2_m68k_m68k
default y if BR2_mips
default y if BR2_mipsel
default y if BR2_mips64