summary refs log tree commit diff
diff options
context:
space:
mode:
authorJan (janneke) Nieuwenhuizen <janneke@gnu.org>2021-12-28 15:53:19 +0100
committerJan (janneke) Nieuwenhuizen <janneke@gnu.org>2022-10-19 07:35:29 +0200
commitcc625c9b1edb3878cacb421d2645fb95d001dd10 (patch)
treec671a20c852edb39d4883280acd1e7ff1c98ec6e
parent7d21e9a8c4d370ba309fe407ee6de36947288523 (diff)
downloadguix-cc625c9b1edb3878cacb421d2645fb95d001dd10.tar.gz
DRAFT gnu: commencement: glibc-mesboot0: Support ARM.
 * __restrict_arr is probably symptom of preprocessor arithmetic problems
   + lsh, /
 * It looks like glibc-2.2.5 and mesboot-haeders mismatch.
   + Many __NR_* syscalls are missing
   + Some headers are missing.
 * gcc-mesboot0: illegal instruction in glibc-2.2.5:

   0x000276b4 <+28>:	ldr	r8, [r10]
   0x000276b8 <+32>:	svc	0x00000014
=> 0x000276bc <+36>:	mov	r4, r0

* gnu/packages/patches/glibc-bootstrap-arm-2.2.5.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/commencement.scm (glibc-mesboot0)[native-inputs]: Add it.
[arguments]: Apply it in apply-patches.  Cater for armhf-linux, aarch64-linux.
* gnu/packages/commencement.scm (glibc-mesboot0)
[supported-systems]: Add armhf-linux, aarch64-linux.
-rw-r--r--gnu/local.mk3
-rw-r--r--gnu/packages/commencement.scm191
-rw-r--r--gnu/packages/patches/glibc-bootstrap-arm-2.2.5.patch1287
3 files changed, 1391 insertions, 90 deletions
diff --git a/gnu/local.mk b/gnu/local.mk
index 9cb9413ca3..378e3bbcd5 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -11,7 +11,7 @@
 # Copyright © 2016 Ben Woodcroft <donttrustben@gmail.com>
 # Copyright © 2016, 2017, 2018, 2019 Alex Vong <alexvong1995@gmail.com>
 # Copyright © 2016, 2017, 2018, 2019, 2020, 2021 Efraim Flashner <efraim@flashner.co.il>
-# Copyright © 2016, 2017, 2018, 2019, 2020, 2021 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+# Copyright © 2016, 2017, 2018, 2019, 2020, 2021, 2022 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 # Copyright © 2017, 2018, 2019, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
 # Copyright © 2017, 2018 Clément Lassieur <clement@lassieur.org>
 # Copyright © 2017, 2020 Mathieu Othacehe <m.othacehe@gmail.com>
@@ -1158,6 +1158,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/glibc-allow-kernel-2.6.32.patch		\
   %D%/packages/patches/glibc-boot-2.16.0.patch			\
   %D%/packages/patches/glibc-boot-2.2.5.patch			\
+  %D%/packages/patches/glibc-bootstrap-arm-2.2.5.patch	 	\
   %D%/packages/patches/glibc-bootstrap-system-2.2.5.patch 	\
   %D%/packages/patches/glibc-bootstrap-system-2.16.0.patch 	\
   %D%/packages/patches/glibc-bootstrap-system.patch		\
diff --git a/gnu/packages/commencement.scm b/gnu/packages/commencement.scm
index 4884f4f276..e551eb30f9 100644
--- a/gnu/packages/commencement.scm
+++ b/gnu/packages/commencement.scm
@@ -1130,95 +1130,108 @@ ac_cv_c_float_format='IEEE (little-endian)'
   ;; GNU C Library 2.2.5 is the most recent glibc that we managed to build
   ;; using gcc-2.95.3.  Newer versions (2.3.x, 2.6, 2.1x) seem to need a newer
   ;; gcc.
-  (package
-    (inherit glibc)
-    (name "glibc-mesboot0")
-    (version "2.2.5")
-    (source (origin
-              (method url-fetch)
-              (uri (string-append "mirror://gnu/glibc/glibc-"
-                                  version
-                                  ".tar.gz"))
-              ;; Patch needs XZ
-              ;; (patches (search-patches "glibc-boot-2.2.5.patch"))
-              (sha256
-               (base32
-                "1vl48i16gx6h68whjyhgnn1s57vqq32f9ygfa2fls7pdkbsqvp2q"))))
-    (supported-systems '("i686-linux" "x86_64-linux"))
-    (inputs '())
-    (propagated-inputs '())
-    (native-inputs `(("headers" ,mesboot-headers)
-                     ,@(%boot-mesboot-core-inputs)))
-    (outputs '("out"))
-    (arguments
-     (list #:implicit-inputs? #f
-           #:guile %bootstrap-guile
-           #:tests? #f
-           #:strip-binaries? #f
-           #:validate-runpath? #f   ; no dynamic executables
-           #:parallel-build? #f     ; gcc-2.95.3 ICEs on massively parallel builds
-           #:make-flags #~(list (string-append
-                                 "SHELL="
-                                 (assoc-ref %build-inputs "bash")
-                                 "/bin/sh"))
-           #:configure-flags
-           #~(let ((out (assoc-ref %outputs "out"))
-                   (headers (assoc-ref %build-inputs "headers")))
-               `("--disable-shared"
-                 "--enable-static"
-                 "--disable-sanity-checks"
-                 "--build=i686-unknown-linux-gnu"
-                 "--host=i686-unknown-linux-gnu"
-                 ,(string-append "--with-headers=" headers "/include")
-                 "--enable-static-nss"
-                 "--without-__thread"
-                 "--without-cvs"
-                 "--without-gd"
-                 "--without-tls"
-                 ,(string-append "--prefix=" out)))
-           #:phases
-           #~(modify-phases %standard-phases
-               (add-after 'unpack 'apply-boot-patch
-                 (lambda* (#:key inputs #:allow-other-keys)
-                   (invoke "patch" "--force" "-p1" "-i"
-                           #$(local-file
-                              (search-patch "glibc-boot-2.2.5.patch")))
-                   (invoke "patch" "--force" "-p1" "-i"
-                           #$(local-file
-                              (search-patch "glibc-bootstrap-system-2.2.5.patch")))))
-               (add-before 'configure 'setenv
-                 (lambda* (#:key outputs #:allow-other-keys)
-                   (let* ((out (assoc-ref outputs "out"))
-                          (bash (assoc-ref %build-inputs "bash"))
-                          (shell (string-append bash "/bin/bash"))
-                          (gcc (assoc-ref %build-inputs "gcc"))
-                          (headers (assoc-ref %build-inputs "headers"))
-                          (cppflags (string-append
-                                     ;;" -D __STDC__=1"
-                                     " -D MES_BOOTSTRAP=1"
-                                     " -D BOOTSTRAP_GLIBC=1"))
-                          (cflags (string-append " -L " (getcwd))))
-                     (setenv "CONFIG_SHELL" shell)
-                     (setenv "SHELL" shell)
-                     (setenv "CPP" (string-append gcc "/bin/gcc -E " cppflags))
-                     (setenv "CC" (string-append gcc "/bin/gcc " cppflags cflags)))))
-               (replace 'configure           ; needs classic invocation of configure
-                 (lambda* (#:key configure-flags #:allow-other-keys)
-                   (format (current-error-port)
-                           "running ./configure ~a\n" (string-join configure-flags))
-                   (apply invoke "./configure" configure-flags)))
-               (add-after 'configure 'fixup-configure
-                 (lambda _
-                   (let* ((out (assoc-ref %outputs "out"))
-                          (bash (assoc-ref %build-inputs "bash"))
-                          (shell (string-append bash "/bin/bash")))
-                     (substitute* "config.make"
-                       (("INSTALL = scripts/") "INSTALL = $(..)./scripts/"))
-                     (substitute* "config.make"
-                       (("INSTALL = scripts/") "INSTALL = $(..)./scripts/")
-                       (("BASH = ") (string-append
-                                     "SHELL = " shell "
-         BASH = ")))))))))))
+  (let ((triplet (match (%current-system)
+                   ((or "armhf-linux" "aarch64-linux")
+                    "arm-unknown-linux-gnu")
+                   ((or "i686-linux" "x86_64-linux")
+                    "i686-unknown-linux-gnu"))))
+    (package
+      (inherit glibc)
+      (name "glibc-mesboot0")
+      (version "2.2.5")
+      (source (origin
+                (method url-fetch)
+                (uri (string-append "mirror://gnu/glibc/glibc-"
+                                    version
+                                    ".tar.gz"))
+                ;; Patch needs XZ
+                ;; (patches (search-patches "glibc-boot-2.2.5.patch"))
+                (sha256
+                 (base32
+                  "1vl48i16gx6h68whjyhgnn1s57vqq32f9ygfa2fls7pdkbsqvp2q"))))
+      (supported-systems '("armhf-linux" "aarch64-linux"
+                           "i686-linux" "x86_64-linux"))
+      (inputs '())
+      (propagated-inputs '())
+      (native-inputs `(("headers" ,mesboot-headers)
+                       ,@(%boot-mesboot-core-inputs)))
+      (outputs '("out"))
+      (arguments
+       (list #:implicit-inputs? #f
+             #:guile %bootstrap-guile
+             #:tests? #f
+             #:strip-binaries? #f
+             #:validate-runpath? #f     ; no dynamic executables
+             #:parallel-build? #f ; gcc-2.95.3 ICEs on massively parallel builds
+             #:make-flags #~(list (string-append
+                                   "SHELL="
+                                   (assoc-ref %build-inputs "bash")
+                                   "/bin/sh"))
+             #:configure-flags
+             #~(let ((out (assoc-ref %outputs "out"))
+                     (headers (assoc-ref %build-inputs "headers")))
+                 (list
+                  "--disable-shared"
+                  "--enable-static"
+                  "--disable-sanity-checks"
+                  (string-append "--build=" #$triplet)
+                  (string-append "--host=" #$triplet)
+                  (string-append "--with-headers=" headers "/include")
+                  "--enable-static-nss"
+                  "--without-__thread"
+                  "--without-cvs"
+                  "--without-gd"
+                  "--without-tls"
+                  (string-append "--prefix=" out)))
+             #:phases
+             #~(modify-phases %standard-phases
+                 (add-after 'unpack 'apply-boot-patch
+                   (lambda* (#:key inputs #:allow-other-keys)
+                     (invoke "patch" "--force" "-p1" "-i"
+                             #$(local-file
+                                (search-patch "glibc-boot-2.2.5.patch")))
+                     (invoke "patch" "--force" "-p1" "-i"
+                             #$(local-file
+                                (search-patch "glibc-bootstrap-system-2.2.5.patch")))
+                     (invoke "patch" "--force" "-p1" "-i"
+                             #$(local-file
+                                (search-patch "glibc-bootstrap-arm-2.2.5.patch")))))
+                 (add-before 'configure 'setenv
+                   (lambda* (#:key outputs #:allow-other-keys)
+                     (let* ((out (assoc-ref outputs "out"))
+                            (bash (assoc-ref %build-inputs "bash"))
+                            (shell (string-append bash "/bin/bash"))
+                            (gcc (assoc-ref %build-inputs "gcc"))
+                            (headers (assoc-ref %build-inputs "headers"))
+                            (cppflags (string-append
+                                       ;;" -D __STDC__=1"
+                                       " -D MES_BOOTSTRAP=1"
+                                       " -D BOOTSTRAP_GLIBC=1"
+                                       (if (equal? #$triplet "arm-unknown-linux-gnu")
+                                           " -D __ARM_EABI__=1"
+                                           "")))
+                            (cflags (string-append " -L " (getcwd))))
+                       (setenv "CONFIG_SHELL" shell)
+                       (setenv "SHELL" shell)
+                       (setenv "CPP" (string-append gcc "/bin/gcc -E " cppflags))
+                       (setenv "CC" (string-append gcc "/bin/gcc " cppflags cflags)))))
+                 (replace 'configure ; needs classic invocation of configure
+                   (lambda* (#:key configure-flags #:allow-other-keys)
+                     (format (current-error-port)
+                             "running ./configure ~a\n" (string-join configure-flags))
+                     (apply invoke "./configure" configure-flags)))
+                 (add-after 'configure 'fixup-configure
+                   (lambda _
+                     (let* ((out (assoc-ref %outputs "out"))
+                            (bash (assoc-ref %build-inputs "bash"))
+                            (shell (string-append bash "/bin/bash")))
+                       (substitute* "config.make"
+                         (("INSTALL = scripts/") "INSTALL = $(..)./scripts/"))
+                       (substitute* "config.make"
+                         (("INSTALL = scripts/") "INSTALL = $(..)./scripts/")
+                         (("BASH = ") (string-append
+                                       "SHELL = " shell "
+         BASH = "))))))))))))
 
 (define gcc-mesboot0
   (package
diff --git a/gnu/packages/patches/glibc-bootstrap-arm-2.2.5.patch b/gnu/packages/patches/glibc-bootstrap-arm-2.2.5.patch
new file mode 100644
index 0000000000..e8b34a6166
--- /dev/null
+++ b/gnu/packages/patches/glibc-bootstrap-arm-2.2.5.patch
@@ -0,0 +1,1287 @@
+Not presented upstream.
+
+From 84d31256c0b37f7f73ff2145a7f6c9a6a9faaf35 Mon Sep 17 00:00:00 2001
+From: "Jan (janneke) Nieuwenhuizen" <janneke@gnu.org>
+Date: Mon, 10 Jan 2022 15:01:05 +0100
+Subject: [PATCH 01/10] bootstrappable: arm: Guard __NR_sigaction,
+ __NR_sigpending, __NR_sigprocmask, __NR_sigreturn, __NR_sigsuspend.
+Content-Transfer-Encoding: 8bit
+Content-Type: text/plain; charset=UTF-8
+
+This fixes building on armhf-linux.
+
+* sysdeps/unix/sysv/linux/arm/sigaction.c (__libc_sigaction): Avoid
+using undefined __NR_sigaction.
+* sysdeps/unix/sysv/linux/arm/sigrestorer.S: Avoid using undefined
+__NR_sigreturn.
+* sysdeps/unix/sysv/linux/sigpending.c (sigpending): Avoid using
+undefined __NR_sigpending.
+* sysdeps/unix/sysv/linux/sigprocmask.c (__sigprocmask): Avoid using
+undefined __NR_sigprocmask.
+* sysdeps/unix/sysv/linux/sigsuspend.c (__sigsuspend): Avoid using
+undefined __NR_sigsuspend.
+---
+ sysdeps/unix/sysv/linux/arm/sigaction.c   | 2 ++
+ sysdeps/unix/sysv/linux/arm/sigrestorer.S | 2 ++
+ sysdeps/unix/sysv/linux/sigpending.c      | 2 ++
+ sysdeps/unix/sysv/linux/sigprocmask.c     | 2 ++
+ sysdeps/unix/sysv/linux/sigsuspend.c      | 2 ++
+ 5 files changed, 10 insertions(+)
+
+diff --git a/sysdeps/unix/sysv/linux/arm/sigaction.c b/sysdeps/unix/sysv/linux/arm/sigaction.c
+index f39665f..acc19ce 100644
+--- a/sysdeps/unix/sysv/linux/arm/sigaction.c
++++ b/sysdeps/unix/sysv/linux/arm/sigaction.c
+@@ -134,9 +134,11 @@ __libc_sigaction (sig, act, oact)
+ 	}
+ #endif
+     }
++# ifdef __NR_sigaction
+   result = INLINE_SYSCALL (sigaction, 3, sig,
+ 			   act ? __ptrvalue (&k_sigact) : NULL,
+ 			   oact ? __ptrvalue (&k_osigact) : NULL);
++# endif
+   if (oact && result >= 0)
+     {
+       oact->sa_handler = k_osigact.k_sa_handler;
+diff --git a/sysdeps/unix/sysv/linux/arm/sigrestorer.S b/sysdeps/unix/sysv/linux/arm/sigrestorer.S
+index 98e33cb..a4769ca 100644
+--- a/sysdeps/unix/sysv/linux/arm/sigrestorer.S
++++ b/sysdeps/unix/sysv/linux/arm/sigrestorer.S
+@@ -22,8 +22,10 @@
+    one of these.  This avoids the need for the kernel to synthesise a return
+    instruction on the stack, which would involve expensive cache flushes. */
+ 
++#ifdef __NR_sigreturn
+ ENTRY(__default_sa_restorer)
+ 	swi	SYS_ify(sigreturn)
++#endif
+ 
+ #ifdef __NR_rt_sigreturn
+ 
+diff --git a/sysdeps/unix/sysv/linux/sigpending.c b/sysdeps/unix/sysv/linux/sigpending.c
+index a5404e5..5ff5918 100644
+--- a/sysdeps/unix/sysv/linux/sigpending.c
++++ b/sysdeps/unix/sysv/linux/sigpending.c
+@@ -61,6 +61,8 @@ sigpending (set)
+     }
+ # endif
+ 
++# ifdef __NR_sigpending
+   return INLINE_SYSCALL (sigpending, 1, CHECK_SIGSET (set));
++# endif
+ #endif
+ }
+diff --git a/sysdeps/unix/sysv/linux/sigprocmask.c b/sysdeps/unix/sysv/linux/sigprocmask.c
+index 7a73d9c..fbcc5a1 100644
+--- a/sysdeps/unix/sysv/linux/sigprocmask.c
++++ b/sysdeps/unix/sysv/linux/sigprocmask.c
+@@ -67,8 +67,10 @@ __sigprocmask (how, set, oset)
+     }
+ # endif
+ 
++# ifdef __NR_sigprocmask
+   return INLINE_SYSCALL (sigprocmask, 3, how, CHECK_SIGSET_NULL_OK (set),
+ 			 CHECK_SIGSET_NULL_OK (oset));
++# endif
+ #endif
+ }
+ weak_alias (__sigprocmask, sigprocmask)
+diff --git a/sysdeps/unix/sysv/linux/sigsuspend.c b/sysdeps/unix/sysv/linux/sigsuspend.c
+index bd66a51..952cf52 100644
+--- a/sysdeps/unix/sysv/linux/sigsuspend.c
++++ b/sysdeps/unix/sysv/linux/sigsuspend.c
+@@ -61,7 +61,9 @@ __sigsuspend (set)
+     }
+ # endif
+ 
++# ifdef __NR_sigsuspend
+   return INLINE_SYSCALL (sigsuspend, 3, 0, 0, set->__val[0]);
++# endif
+ #endif
+ }
+ weak_alias (__sigsuspend, sigsuspend)
+-- 
+Jan Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond http://lilypond.org
+Freelance IT http://JoyofSource.com | Avatar® http://AvatarAcademy.com
+
+From 911c8692ba908f545429610a90d13ce3de0576b3 Mon Sep 17 00:00:00 2001
+From: "Jan (janneke) Nieuwenhuizen" <janneke@gnu.org>
+Date: Wed, 12 Jan 2022 12:43:50 +0100
+Subject: [PATCH 02/10] bootstrappable: arm: Fixup for __restrict_arr.
+Content-Transfer-Encoding: 8bit
+Content-Type: text/plain; charset=UTF-8
+
+* misc/sys/cdefs.h (__restrict_arr)[__arm__]: Define to empty.
+* posix/spawn.h (__restrict_arr)[__arm__]: Likewise.
+* resolv/netdb.h (__restrict_arr)[__arm__]: Likewise.
+---
+ misc/sys/cdefs.h | 5 +++++
+ posix/spawn.h    | 4 ++++
+ resolv/netdb.h   | 4 ++++
+ 3 files changed, 13 insertions(+)
+
+diff --git a/misc/sys/cdefs.h b/misc/sys/cdefs.h
+index 45d2ac3..a2bca2c 100644
+--- a/misc/sys/cdefs.h
++++ b/misc/sys/cdefs.h
+@@ -223,4 +223,9 @@
+ # endif
+ #endif
+ 
++#if __arm__
++#undef __restrict_arr
++#define __restrict_arr
++#endif
++
+ #endif	 /* sys/cdefs.h */
+diff --git a/posix/spawn.h b/posix/spawn.h
+index 92ee940..0601e42 100644
+--- a/posix/spawn.h
++++ b/posix/spawn.h
+@@ -63,6 +63,10 @@ __BEGIN_DECLS
+ 
+ /* Spawn a new process executing PATH with the attributes describes in *ATTRP.
+    Before running the process perform the actions described in FILE-ACTIONS. */
++#if __arm__
++#undef __restrict_arr
++#define __restrict_arr
++#endif
+ extern int posix_spawn (pid_t *__restrict __pid,
+ 			__const char *__restrict __path,
+ 			__const posix_spawn_file_actions_t *__restrict
+diff --git a/resolv/netdb.h b/resolv/netdb.h
+index c3e0772..8a12fcc 100644
+--- a/resolv/netdb.h
++++ b/resolv/netdb.h
+@@ -494,6 +494,10 @@ extern int getnameinfo (__const struct sockaddr *__restrict __sa,
+ /* Enqueue ENT requests from the LIST.  If MODE is GAI_WAIT wait until all
+    requests are handled.  If WAIT is GAI_NOWAIT return immediately after
+    queueing the requests and signal completion according to SIG.  */
++#if __arm__
++#undef __restrict_arr
++#define __restrict_arr
++#endif
+ extern int getaddrinfo_a (int __mode, struct gaicb *__list[__restrict_arr],
+ 			  int __ent, struct sigevent *__restrict __sig)
+      __THROW;
+-- 
+Jan Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond http://lilypond.org
+Freelance IT http://JoyofSource.com | Avatar® http://AvatarAcademy.com
+
+From 335bf269cae7ccbae8209b875cc451cbd6ef2b73 Mon Sep 17 00:00:00 2001
+From: "Jan (janneke) Nieuwenhuizen" <janneke@gnu.org>
+Date: Wed, 12 Jan 2022 12:44:46 +0100
+Subject: [PATCH 03/10] bootstrappable: arm: Portability or cpp arithmetic
+ ?error.
+Content-Transfer-Encoding: 8bit
+Content-Type: text/plain; charset=UTF-8
+
+* sysdeps/posix/euidaccess.c (euidaccess): Use #warning instead of ?error.
+---
+ sysdeps/posix/euidaccess.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sysdeps/posix/euidaccess.c b/sysdeps/posix/euidaccess.c
+index 8a2d826..3d29dcc 100644
+--- a/sysdeps/posix/euidaccess.c
++++ b/sysdeps/posix/euidaccess.c
+@@ -149,7 +149,7 @@ euidaccess (path, mode)
+ 
+   mode &= (X_OK | W_OK | R_OK);	/* Clear any bogus bits. */
+ #if R_OK != S_IROTH || W_OK != S_IWOTH || X_OK != S_IXOTH
+-  ?error Oops, portability assumptions incorrect.
++  #warning Oops, portability assumptions incorrect.
+ #endif
+ 
+   if (mode == F_OK)
+-- 
+Jan Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond http://lilypond.org
+Freelance IT http://JoyofSource.com | Avatar® http://AvatarAcademy.com
+
+From 2cf31225fef8a11fe201f9dae1f1f17779508d4f Mon Sep 17 00:00:00 2001
+From: "Jan (janneke) Nieuwenhuizen" <janneke@gnu.org>
+Date: Wed, 12 Jan 2022 12:45:40 +0100
+Subject: [PATCH 04/10] bootstrappable: arm: Guard __NR_ipc, __NR_sigreturn,
+ __NR_rt_sigreturn.
+Content-Transfer-Encoding: 8bit
+Content-Type: text/plain; charset=UTF-8
+
+* sysdeps/unix/sysv/linux/arm/sigaction.c[!__NR_sigreturn]: Do not
+export __default_sa_restorer.
+[!__NR_rt_sigreturn]: Do not export __default_rt_sa_restorer.
+* sysdeps/unix/sysv/linux/arm/sigaction.c (choose_restorer)
+[!__NR_sigreturn]: Do not use __default_sa_restorer.
+[!__NR_rt_sigreturn]: Do not use __default_rt_sa_restorer.
+* sysdeps/unix/sysv/linux/arm/socket.S[__NR_socketcall]: Do not use
+socketcall system call.
+* sysdeps/unix/sysv/linux/i386/msgctl.c (__old_msgctl)
+[!__NR_ipc]: Do not use ipc system call.
+* sysdeps/unix/sysv/linux/i386/msgctl.c (__new_msgctl): Likewise.
+* sysdeps/unix/sysv/linux/i386/semctl.c (__new_semctl): Likewise.
+* sysdeps/unix/sysv/linux/i386/shmctl.c (__old_shmctl): Likewise.
+(__new_shmctl): Likewise.
+* sysdeps/unix/sysv/linux/msgget.c (msgget): Likewise.
+* sysdeps/unix/sysv/linux/msgrcv.c (msgrcv): Likewise.
+* sysdeps/unix/sysv/linux/msgsnd.c (msgsnd): Likewise.
+* sysdeps/unix/sysv/linux/semget.c (semget): Likewise.
+* sysdeps/unix/sysv/linux/semop.c (semop): Likewise.
+* sysdeps/unix/sysv/linux/shmat.c (shmat): Likewise.
+* sysdeps/unix/sysv/linux/shmdt.c (shmdt): Likewise.
+* sysdeps/unix/sysv/linux/shmget.c (shmget): Likewise.
+* sysdeps/unix/sysv/linux/llseek.c (__llseek)[!__NR_llseek]: Do not
+use llseek system call.
+* sysdeps/unix/sysv/linux/umount.S[!__NR_umount]: Do not use umount
+system call.
+---
+ sysdeps/unix/syscall.S                       |  4 ++++
+ sysdeps/unix/sysv/linux/arm/ioperm.c         |  4 ++++
+ sysdeps/unix/sysv/linux/arm/profil-counter.h |  2 ++
+ sysdeps/unix/sysv/linux/arm/sigaction.c      | 11 +++++++++--
+ sysdeps/unix/sysv/linux/arm/socket.S         |  2 ++
+ sysdeps/unix/sysv/linux/i386/msgctl.c        | 10 ++++++++++
+ sysdeps/unix/sysv/linux/i386/semctl.c        | 10 ++++++++++
+ sysdeps/unix/sysv/linux/i386/shmctl.c        | 10 ++++++++++
+ sysdeps/unix/sysv/linux/llseek.c             |  2 ++
+ sysdeps/unix/sysv/linux/msgget.c             |  2 ++
+ sysdeps/unix/sysv/linux/msgrcv.c             |  2 ++
+ sysdeps/unix/sysv/linux/msgsnd.c             |  2 ++
+ sysdeps/unix/sysv/linux/semget.c             |  2 ++
+ sysdeps/unix/sysv/linux/semop.c              |  2 ++
+ sysdeps/unix/sysv/linux/shmat.c              |  2 ++
+ sysdeps/unix/sysv/linux/shmdt.c              |  2 ++
+ sysdeps/unix/sysv/linux/shmget.c             |  2 ++
+ sysdeps/unix/sysv/linux/umount.S             |  2 +-
+ 18 files changed, 70 insertions(+), 3 deletions(-)
+
+diff --git a/sysdeps/unix/syscall.S b/sysdeps/unix/syscall.S
+index 8b685cf..cb66921 100644
+--- a/sysdeps/unix/syscall.S
++++ b/sysdeps/unix/syscall.S
+@@ -18,6 +18,10 @@
+ 
+ #include <sysdep.h>
+ 
++#ifndef __NR_syscall
++#define __NR_syscall 113
++#endif
++
+ #ifndef SYS_syscall
+ #define SYS_syscall	0
+ #endif
+diff --git a/sysdeps/unix/sysv/linux/arm/ioperm.c b/sysdeps/unix/sysv/linux/arm/ioperm.c
+index 40ac8e6..0d34ac5 100644
+--- a/sysdeps/unix/sysv/linux/arm/ioperm.c
++++ b/sysdeps/unix/sysv/linux/arm/ioperm.c
+@@ -95,6 +95,10 @@ static struct platform {
+  *    values.
+  */
+ 
++#ifndef BUS_ISA
++#define BUS_ISA 0
++#endif
++
+ static int
+ init_iosys (void)
+ {
+diff --git a/sysdeps/unix/sysv/linux/arm/profil-counter.h b/sysdeps/unix/sysv/linux/arm/profil-counter.h
+index 5d8be9d..e67ba74 100644
+--- a/sysdeps/unix/sysv/linux/arm/profil-counter.h
++++ b/sysdeps/unix/sysv/linux/arm/profil-counter.h
+@@ -23,10 +23,12 @@
+ void
+ profil_counter (int signo, int _a2, int _a3, int _a4, union k_sigcontext sc)
+ {
++#if 0
+   void *pc;
+   if (sc.v20.magic == SIGCONTEXT_2_0_MAGIC)
+     pc = (void *) sc.v20.reg.ARM_pc;
+   else
+     pc = (void *) sc.v21.arm_pc;
+   profil_count (pc);
++#endif
+ }
+diff --git a/sysdeps/unix/sysv/linux/arm/sigaction.c b/sysdeps/unix/sysv/linux/arm/sigaction.c
+index acc19ce..7843fa9 100644
+--- a/sysdeps/unix/sysv/linux/arm/sigaction.c
++++ b/sysdeps/unix/sysv/linux/arm/sigaction.c
+@@ -39,17 +39,24 @@ int __libc_missing_rt_sigs;
+ 
+ #define SA_RESTORER	0x04000000
+ 
++#ifdef __NR_sigreturn
+ extern void __default_sa_restorer(void);
++#endif
++#ifdef __NR_rt_sigreturn
+ extern void __default_rt_sa_restorer(void);
++#endif
+ 
+ /* When RT signals are in use we need to use a different return stub.  */
+-#ifdef __NR_rt_sigreturn
++#if defined (__NR_sigreturn) && defined (__NR_rt_sigreturn)
+ #define choose_restorer(flags)					\
+   (flags & SA_SIGINFO) ? __default_rt_sa_restorer		\
+   : __default_sa_restorer
+-#else
++#elif defined (__NR_sigreturn)
+ #define choose_restorer(flags)					\
+   __default_sa_restorer
++#elif defined (__NR_rt_sigreturn)
++#define choose_restorer(flags)					\
++  __default_rt_sa_restorer
+ #endif
+ 
+ /* If ACT is not NULL, change the action for SIG to *ACT.
+diff --git a/sysdeps/unix/sysv/linux/arm/socket.S b/sysdeps/unix/sysv/linux/arm/socket.S
+index a672413..c8143a2 100644
+--- a/sysdeps/unix/sysv/linux/arm/socket.S
++++ b/sysdeps/unix/sysv/linux/arm/socket.S
+@@ -71,7 +71,9 @@ ENTRY (__socket)
+         /* Do the system call trap.  */
+ 	mov a1, $P(SOCKOP_,socket)
+ 	mov a2, sp
++#ifdef __NR_socketcall
+ 	swi SYS_ify(socketcall)
++#endif
+ 
+ 	/* Pop args off the stack */
+ 	P(POPARGS_,NARGS)
+diff --git a/sysdeps/unix/sysv/linux/i386/msgctl.c b/sysdeps/unix/sysv/linux/i386/msgctl.c
+index 3e95d85..0cb5fef 100644
+--- a/sysdeps/unix/sysv/linux/i386/msgctl.c
++++ b/sysdeps/unix/sysv/linux/i386/msgctl.c
+@@ -65,8 +65,10 @@ extern int __libc_missing_32bit_uids;
+ int
+ __old_msgctl (int msqid, int cmd, struct __old_msqid_ds *buf)
+ {
++#ifdef __NR_ipc
+   return INLINE_SYSCALL (ipc, 5, IPCOP_msgctl,
+ 			 msqid, cmd, 0, CHECK_1 (buf));
++#endif
+ }
+ compat_symbol (libc, __old_msgctl, msgctl, GLIBC_2_0);
+ #endif
+@@ -75,8 +77,10 @@ int
+ __new_msgctl (int msqid, int cmd, struct msqid_ds *buf)
+ {
+ #if __ASSUME_32BITUIDS > 0
++#ifdef __NR_ipc
+   return INLINE_SYSCALL (ipc, 5, IPCOP_msgctl,
+ 			 msqid, cmd | __IPC_64, 0, CHECK_1 (buf));
++#endif
+ #else
+   switch (cmd) {
+     case MSG_STAT:
+@@ -84,8 +88,10 @@ __new_msgctl (int msqid, int cmd, struct msqid_ds *buf)
+     case IPC_SET:
+       break;
+     default:
++#ifdef __NR_ipc
+       return INLINE_SYSCALL (ipc, 5, IPCOP_msgctl,
+ 			     msqid, cmd, 0, CHECK_1 (buf));
++#endif
+   }
+ 
+   {
+@@ -109,8 +115,10 @@ __new_msgctl (int msqid, int cmd, struct msqid_ds *buf)
+ 	  }
+ 	if (__libc_missing_32bit_uids <= 0)
+ 	  {
++#ifdef __NR_ipc
+ 	    result = INLINE_SYSCALL (ipc, 5, IPCOP_msgctl,
+ 				     msqid, cmd | __IPC_64, 0, CHECK_1 (buf));
++#endif
+ 	    return result;
+ 	  }
+       }
+@@ -129,8 +137,10 @@ __new_msgctl (int msqid, int cmd, struct msqid_ds *buf)
+ 	    return -1;
+ 	  }
+       }
++#ifdef __NR_ipc
+     result = INLINE_SYSCALL (ipc, 5, IPCOP_msgctl,
+ 			     msqid, cmd, 0, __ptrvalue (&old));
++#endif
+     if (result != -1 && cmd != IPC_SET)
+       {
+ 	memset(buf, 0, sizeof(*buf));
+diff --git a/sysdeps/unix/sysv/linux/i386/semctl.c b/sysdeps/unix/sysv/linux/i386/semctl.c
+index 8d41d7f..821728d 100644
+--- a/sysdeps/unix/sysv/linux/i386/semctl.c
++++ b/sysdeps/unix/sysv/linux/i386/semctl.c
+@@ -82,8 +82,10 @@ __old_semctl (int semid, int semnum, int cmd, ...)
+ 
+   va_end (ap);
+ 
++#ifdef __NR_ipc
+   return INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd,
+ 			 CHECK_SEMCTL (&arg, semid, cmd));
++#endif
+ }
+ compat_symbol (libc, __old_semctl, semctl, GLIBC_2_0);
+ #endif
+@@ -102,8 +104,10 @@ __new_semctl (int semid, int semnum, int cmd, ...)
+   va_end (ap);
+ 
+ #if __ASSUME_32BITUIDS > 0
++#ifdef __NR_ipc
+   return INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd | __IPC_64,
+ 			 CHECK_SEMCTL (&arg, semid, cmd | __IPC_64));
++#endif
+ #else
+   switch (cmd) {
+     case SEM_STAT:
+@@ -111,8 +115,10 @@ __new_semctl (int semid, int semnum, int cmd, ...)
+     case IPC_SET:
+       break;
+     default:
++#ifdef __NR_ipc
+       return INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd,
+ 			     CHECK_SEMCTL (&arg, semid, cmd));
++#endif
+   }
+ 
+   {
+@@ -137,8 +143,10 @@ __new_semctl (int semid, int semnum, int cmd, ...)
+ 	  }
+ 	if (__libc_missing_32bit_uids <= 0)
+ 	  {
++#ifdef __NR_ipc
+ 	    result = INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd | __IPC_64,
+ 				     CHECK_SEMCTL (&arg, semid, cmd | __IPC_64));
++#endif
+ 	    return result;
+ 	  }
+       }
+@@ -158,8 +166,10 @@ __new_semctl (int semid, int semnum, int cmd, ...)
+ 	    return -1;
+ 	  }
+       }
++#ifdef __NR_ipc
+     result = INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd,
+ 			     CHECK_SEMCTL (&arg, semid, cmd));
++#endif
+     if (result != -1 && cmd != IPC_SET)
+       {
+ 	memset(buf, 0, sizeof(*buf));
+diff --git a/sysdeps/unix/sysv/linux/i386/shmctl.c b/sysdeps/unix/sysv/linux/i386/shmctl.c
+index 8fa6ff0..292bbbd 100644
+--- a/sysdeps/unix/sysv/linux/i386/shmctl.c
++++ b/sysdeps/unix/sysv/linux/i386/shmctl.c
+@@ -72,8 +72,10 @@ int __new_shmctl (int, int, struct shmid_ds *);
+ int
+ __old_shmctl (int shmid, int cmd, struct __old_shmid_ds *buf)
+ {
++#ifdef __NR_ipc
+   return INLINE_SYSCALL (ipc, 5, IPCOP_shmctl,
+ 			 shmid, cmd, 0, CHECK_1 (buf));
++#endif
+ }
+ compat_symbol (libc, __old_shmctl, shmctl, GLIBC_2_0);
+ #endif
+@@ -82,8 +84,10 @@ int
+ __new_shmctl (int shmid, int cmd, struct shmid_ds *buf)
+ {
+ #if __ASSUME_32BITUIDS > 0
++#ifdef __NR_ipc
+   return INLINE_SYSCALL (ipc, 5, IPCOP_shmctl,
+ 			 shmid, cmd | __IPC_64, 0, CHECK_1 (buf));
++#endif
+ #else
+   switch (cmd) {
+     case SHM_STAT:
+@@ -94,8 +98,10 @@ __new_shmctl (int shmid, int cmd, struct shmid_ds *buf)
+ # endif
+       break;
+     default:
++#ifdef __NR_ipc
+       return INLINE_SYSCALL (ipc, 5, IPCOP_shmctl,
+ 			     shmid, cmd, 0, CHECK_1 (buf));
++#endif
+   }
+ 
+   {
+@@ -117,9 +123,11 @@ __new_shmctl (int shmid, int cmd, struct shmid_ds *buf)
+ 	      __libc_missing_32bit_uids = 0;
+ 	    __set_errno(save_errno);
+ 	  }
++#ifdef __NR_ipc
+ 	if (__libc_missing_32bit_uids <= 0)
+ 	  return INLINE_SYSCALL (ipc, 5, IPCOP_shmctl,
+ 				 shmid, cmd | __IPC_64, 0, CHECK_1 (buf));
++#endif
+       }
+ # endif
+ 
+@@ -135,8 +143,10 @@ __new_shmctl (int shmid, int cmd, struct shmid_ds *buf)
+ 	    return -1;
+ 	  }
+       }
++#ifdef __NR_ipc
+     result = INLINE_SYSCALL (ipc, 5, IPCOP_shmctl,
+ 			     shmid, cmd, 0, __ptrvalue (&old));
++#endif
+     if (result != -1 && (cmd == SHM_STAT || cmd == IPC_STAT))
+       {
+ 	memset(buf, 0, sizeof(*buf));
+diff --git a/sysdeps/unix/sysv/linux/llseek.c b/sysdeps/unix/sysv/linux/llseek.c
+index fa83f10..ae68fb6 100644
+--- a/sysdeps/unix/sysv/linux/llseek.c
++++ b/sysdeps/unix/sysv/linux/llseek.c
+@@ -34,9 +34,11 @@ __llseek (int fd, loff_t offset, int whence)
+ {
+   loff_t result;
+ 
++#ifdef __NR__llseek
+   return (loff_t) (INLINE_SYSCALL (_llseek, 5, fd, (off_t) (offset >> 32),
+ 				   (off_t) (offset & 0xffffffff),
+ 				   __ptrvalue (&result), whence) ?: result);
++#endif
+ }
+ weak_alias (__llseek, llseek)
+ strong_alias (__llseek, __libc_lseek64)
+diff --git a/sysdeps/unix/sysv/linux/msgget.c b/sysdeps/unix/sysv/linux/msgget.c
+index a4a8290..1076764 100644
+--- a/sysdeps/unix/sysv/linux/msgget.c
++++ b/sysdeps/unix/sysv/linux/msgget.c
+@@ -33,5 +33,7 @@ msgget (key, msgflg)
+      key_t key;
+      int msgflg;
+ {
++#ifdef __NR_ipc
+   return INLINE_SYSCALL (ipc, 5, IPCOP_msgget, key, msgflg, 0, NULL);
++#endif
+ }
+diff --git a/sysdeps/unix/sysv/linux/msgrcv.c b/sysdeps/unix/sysv/linux/msgrcv.c
+index ab43792..83b93d4 100644
+--- a/sysdeps/unix/sysv/linux/msgrcv.c
++++ b/sysdeps/unix/sysv/linux/msgrcv.c
+@@ -50,5 +50,7 @@ msgrcv (msqid, msgp, msgsz, msgtyp, msgflg)
+   tmp.msgp = CHECK_N (msgp, msgsz);
+   tmp.msgtyp = msgtyp;
+ 
++#ifdef __NR_ipc
+   return INLINE_SYSCALL (ipc, 5, IPCOP_msgrcv, msqid, msgsz, msgflg, __ptrvalue (&tmp));
++#endif
+ }
+diff --git a/sysdeps/unix/sysv/linux/msgsnd.c b/sysdeps/unix/sysv/linux/msgsnd.c
+index f4df5da..20ffb69 100644
+--- a/sysdeps/unix/sysv/linux/msgsnd.c
++++ b/sysdeps/unix/sysv/linux/msgsnd.c
+@@ -33,6 +33,8 @@ msgsnd (msqid, msgp, msgsz, msgflg)
+      size_t msgsz;
+      int msgflg;
+ {
++#ifdef __NR_ipc
+   return INLINE_SYSCALL (ipc, 5, IPCOP_msgsnd, msqid, msgsz,
+ 			 msgflg, (void *) CHECK_N (msgp, msgsz));
++#endif
+ }
+diff --git a/sysdeps/unix/sysv/linux/semget.c b/sysdeps/unix/sysv/linux/semget.c
+index 639bb02..d5fd0cb 100644
+--- a/sysdeps/unix/sysv/linux/semget.c
++++ b/sysdeps/unix/sysv/linux/semget.c
+@@ -34,5 +34,7 @@ semget (key, nsems, semflg)
+      int nsems;
+      int semflg;
+ {
++#ifdef __NR_ipc
+   return INLINE_SYSCALL (ipc, 5, IPCOP_semget, key, nsems, semflg, NULL);
++#endif
+ }
+diff --git a/sysdeps/unix/sysv/linux/semop.c b/sysdeps/unix/sysv/linux/semop.c
+index 4bf2976..528f6d7 100644
+--- a/sysdeps/unix/sysv/linux/semop.c
++++ b/sysdeps/unix/sysv/linux/semop.c
+@@ -33,6 +33,8 @@ semop (semid, sops, nsops)
+      struct sembuf *sops;
+      size_t nsops;
+ {
++#ifdef __NR_ipc
+   return INLINE_SYSCALL (ipc, 5, IPCOP_semop,
+ 			 semid, (int) nsops, 0, CHECK_N (sops, nsops));
++#endif
+ }
+diff --git a/sysdeps/unix/sysv/linux/shmat.c b/sysdeps/unix/sysv/linux/shmat.c
+index d6dead1..c698612 100644
+--- a/sysdeps/unix/sysv/linux/shmat.c
++++ b/sysdeps/unix/sysv/linux/shmat.c
+@@ -47,9 +47,11 @@ shmat (shmid, shmaddr, shmflg)
+     length = shmds.shm_segsz;
+ #endif
+ 
++#ifdef __NR_ipc
+   result = (void *__unbounded) INLINE_SYSCALL (ipc, 5, IPCOP_shmat, shmid, shmflg,
+ 					       (long int) __ptrvalue (&raddr),
+ 					       __ptrvalue (shmaddr));
++#endif
+   if ((unsigned long) result <= -(unsigned long) SHMLBA)
+     result = raddr;
+ 
+diff --git a/sysdeps/unix/sysv/linux/shmdt.c b/sysdeps/unix/sysv/linux/shmdt.c
+index 413c852..c298c9b 100644
+--- a/sysdeps/unix/sysv/linux/shmdt.c
++++ b/sysdeps/unix/sysv/linux/shmdt.c
+@@ -31,5 +31,7 @@ int
+ shmdt (shmaddr)
+      const void *shmaddr;
+ {
++#ifdef __NR_ipc
+   return INLINE_SYSCALL (ipc, 5, IPCOP_shmdt, 0, 0, 0, __ptrvalue ((void *) shmaddr));
++#endif
+ }
+diff --git a/sysdeps/unix/sysv/linux/shmget.c b/sysdeps/unix/sysv/linux/shmget.c
+index c8d509f..1c32df7 100644
+--- a/sysdeps/unix/sysv/linux/shmget.c
++++ b/sysdeps/unix/sysv/linux/shmget.c
+@@ -34,5 +34,7 @@ shmget (key, size, shmflg)
+      size_t size;
+      int shmflg;
+ {
++#ifdef __NR_ipc
+   return INLINE_SYSCALL (ipc, 5, IPCOP_shmget, key, size, shmflg, NULL);
++#endif
+ }
+diff --git a/sysdeps/unix/sysv/linux/umount.S b/sysdeps/unix/sysv/linux/umount.S
+index e18463e..2944030 100644
+--- a/sysdeps/unix/sysv/linux/umount.S
++++ b/sysdeps/unix/sysv/linux/umount.S
+@@ -4,7 +4,7 @@
+ #include <sysdep.h>
+ #ifdef __NR_oldumount
+ PSEUDO (__umount, oldumount, 1)
+-#else
++#elif defined (__NR_umount)
+ PSEUDO (__umount, umount, 1)
+ #endif
+ 	ret
+-- 
+Jan Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond http://lilypond.org
+Freelance IT http://JoyofSource.com | Avatar® http://AvatarAcademy.com
+
+From 7415adb7fa53e8c6df0be266b1422cb7a98b26af Mon Sep 17 00:00:00 2001
+From: "Jan (janneke) Nieuwenhuizen" <janneke@gnu.org>
+Date: Mon, 21 Feb 2022 10:22:03 +0100
+Subject: [PATCH 05/10] bootstrappable: arm: Add missing headers.
+Content-Transfer-Encoding: 8bit
+Content-Type: text/plain; charset=UTF-8
+
+* sysdeps/unix/sysv/linux/arm/asm/page.h,
+sysdeps/unix/sysv/linux/arm/linux/const.h: New files.
+---
+ sysdeps/unix/sysv/linux/arm/asm/page.h    | 3 +++
+ sysdeps/unix/sysv/linux/arm/linux/const.h | 3 +++
+ 2 files changed, 6 insertions(+)
+ create mode 100644 sysdeps/unix/sysv/linux/arm/asm/page.h
+ create mode 100644 sysdeps/unix/sysv/linux/arm/linux/const.h
+
+diff --git a/sysdeps/unix/sysv/linux/arm/asm/page.h b/sysdeps/unix/sysv/linux/arm/asm/page.h
+new file mode 100644
+index 0000000..237343a
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/arm/asm/page.h
+@@ -0,0 +1,3 @@
++#ifndef __ASM_ARM_PAGE_H
++#define __ASM_ARM_PAGE_H
++#endif /*  __ASM_ARM_PAGE_H */
+diff --git a/sysdeps/unix/sysv/linux/arm/linux/const.h b/sysdeps/unix/sysv/linux/arm/linux/const.h
+new file mode 100644
+index 0000000..ce002d5
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/arm/linux/const.h
+@@ -0,0 +1,3 @@
++#ifndef __LINUX_CONST_H
++#define __LINUX_CONST_H
++#endif /*  __LINUX_CONST_H */
+-- 
+Jan Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond http://lilypond.org
+Freelance IT http://JoyofSource.com | Avatar® http://AvatarAcademy.com
+
+From 48ae1c92a4a19494d38c32fe7d83c5e09ca4b355 Mon Sep 17 00:00:00 2001
+From: "Jan (janneke) Nieuwenhuizen" <janneke@gnu.org>
+Date: Wed, 12 Jan 2022 13:01:59 +0100
+Subject: [PATCH 06/10] bootstrappable: arm: Avoid fpu_setw.
+Content-Transfer-Encoding: 8bit
+Content-Type: text/plain; charset=UTF-8
+
+* sysdeps/generic/setfpucw.c (__setfpucw)[!__arm__]: Skip.
+---
+ sysdeps/generic/setfpucw.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/sysdeps/generic/setfpucw.c b/sysdeps/generic/setfpucw.c
+index cb50f9f..03a627a 100644
+--- a/sysdeps/generic/setfpucw.c
++++ b/sysdeps/generic/setfpucw.c
+@@ -23,6 +23,7 @@
+ void
+ __setfpucw (fpu_control_t set)
+ {
++#if !__arm__
+   fpu_control_t cw;
+ 
+   /* Fetch the current control word.  */
+@@ -34,4 +35,5 @@ __setfpucw (fpu_control_t set)
+   cw |= set & ~_FPU_RESERVED;
+ 
+   _FPU_SETCW (cw);
++#endif
+ }
+-- 
+Jan Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond http://lilypond.org
+Freelance IT http://JoyofSource.com | Avatar® http://AvatarAcademy.com
+
+From 3597394200bafed1291ff65039db6cf9cec03b59 Mon Sep 17 00:00:00 2001
+From: "Jan (janneke) Nieuwenhuizen" <janneke@gnu.org>
+Date: Mon, 21 Feb 2022 00:14:16 +0100
+Subject: [PATCH 07/10] bootstrappable: arm: Guard __NR_getrlimit.
+Content-Transfer-Encoding: 8bit
+Content-Type: text/plain; charset=UTF-8
+
+This fixes building with armhf-linux-libre-headers-5.4.20.
+
+* sysdeps/unix/sysv/linux/i386/getrlimit.c (__new_getrlimit)[!__NR_getrlimit]:
+Avoid getrlimit syscall.
+---
+ sysdeps/unix/sysv/linux/i386/getrlimit.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/sysdeps/unix/sysv/linux/i386/getrlimit.c b/sysdeps/unix/sysv/linux/i386/getrlimit.c
+index f7af934..72f4c54 100644
+--- a/sysdeps/unix/sysv/linux/i386/getrlimit.c
++++ b/sysdeps/unix/sysv/linux/i386/getrlimit.c
+@@ -66,8 +66,10 @@ __new_getrlimit (enum __rlimit_resource resource, struct rlimit *rlimits)
+     }
+ # endif
+ 
++# ifdef __NR_getrlimit
+   /* Fall back to the old system call.  */
+   result = INLINE_SYSCALL (getrlimit, 2, resource, CHECK_1 (rlimits));
++# endif
+ 
+   if (result == -1)
+     return result;
+-- 
+Jan Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond http://lilypond.org
+Freelance IT http://JoyofSource.com | Avatar® http://AvatarAcademy.com
+
+From e0764cfa9e3ff4b120723b87a66d2e9c7a500aef Mon Sep 17 00:00:00 2001
+From: "Jan (janneke) Nieuwenhuizen" <janneke@gnu.org>
+Date: Sun, 20 Feb 2022 15:32:53 +0100
+Subject: [PATCH 08/10] bootstrappable: arm: Support EABI system calls.
+Content-Transfer-Encoding: 8bit
+Content-Type: text/plain; charset=UTF-8
+
+* sysdeps/unix/sysv/linux/arm/sysdep.h (DO_CALL,INLINE_SYSCALL)
+[__ARM_EABI__]: Use eabi calling convention for syscalls.
+* sysdeps/arm/dl-machine.h (CLEAR_CACHE): Likewise.  Use 0xf0002
+instead of 0x9f0002.
+* sysdeps/unix/sysv/linux/arm/brk.c (__brk): Likewise.
+* sysdeps/unix/sysv/linux/arm/clone.S: Likewise.
+* sysdeps/unix/sysv/linux/arm/mmap.S: Likewise.
+* sysdeps/unix/sysv/linux/arm/mmap64.S: Likewise.
+* sysdeps/unix/sysv/linux/arm/sigrestorer.S: Likewise.
+* sysdeps/unix/sysv/linux/arm/socket.S: Likewise.
+* sysdeps/unix/sysv/linux/arm/vfork.S: Likewise.
+---
+ sysdeps/arm/dl-machine.h                  | 14 ++++++
+ sysdeps/unix/sysv/linux/arm/brk.c         | 10 +++++
+ sysdeps/unix/sysv/linux/arm/clone.S       |  7 +++
+ sysdeps/unix/sysv/linux/arm/mmap.S        |  7 +++
+ sysdeps/unix/sysv/linux/arm/mmap64.S      |  7 +++
+ sysdeps/unix/sysv/linux/arm/sigrestorer.S | 14 ++++++
+ sysdeps/unix/sysv/linux/arm/socket.S      |  7 +++
+ sysdeps/unix/sysv/linux/arm/sysdep.h      | 54 +++++++++++++++++++++++
+ sysdeps/unix/sysv/linux/arm/vfork.S       | 14 ++++++
+ 9 files changed, 134 insertions(+)
+
+diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h
+index 2d802b7..f0558bb 100644
+--- a/sysdeps/arm/dl-machine.h
++++ b/sysdeps/arm/dl-machine.h
+@@ -32,6 +32,19 @@
+   && VALID_ELF_OSABI (hdr[EI_OSABI]) \
+   && VALID_ELF_ABIVERSION (hdr[EI_ABIVERSION])
+ 
++#if __ARM_EABI__
++#define CLEAR_CACHE(BEG,END)						\
++{									\
++  register unsigned long _beg __asm ("a1") = (unsigned long)(BEG);	\
++  register unsigned long _end __asm ("a2") = (unsigned long)(END);	\
++  register unsigned long _flg __asm ("a3") = 0;				\
++  __asm __volatile ("mov r7, 0xf0002\n\t"				\
++		    "swi 0x0		@ sys_cacheflush"		\
++		    : /* no outputs */					\
++		    : /* no inputs */					\
++		    : "a1","r7");					\
++}
++#else // !__ARM_EABI__
+ #define CLEAR_CACHE(BEG,END)						\
+ {									\
+   register unsigned long _beg __asm ("a1") = (unsigned long)(BEG);	\
+@@ -42,6 +55,7 @@
+ 		    : /* no inputs */					\
+ 		    : "a1");						\
+ }
++#endif // !__ARM_EABI__
+ 
+ /* Return nonzero iff ELF header is compatible with the running host.  */
+ static inline int __attribute__ ((unused))
+diff --git a/sysdeps/unix/sysv/linux/arm/brk.c b/sysdeps/unix/sysv/linux/arm/brk.c
+index 153d893..d5d0904 100644
+--- a/sysdeps/unix/sysv/linux/arm/brk.c
++++ b/sysdeps/unix/sysv/linux/arm/brk.c
+@@ -29,12 +29,22 @@ __brk (void *addr)
+ {
+   void *newbrk;
+ 
++#if __ARM_EABI__
++  asm ("mov a1, %1\n"	/* save the argment in r0 */
++       "mov r7, %2\n"	/* system call nr in r7 */
++       "swi 0x0\n"	/* do the system call */
++       "mov %0, a1;"	/* keep the return value */
++       : "=r"(newbrk)
++       : "r"(addr), "i" (SYS_ify (brk))
++       : "a1","r7");
++#else // !__ARM_EABI__
+   asm ("mov a1, %1\n"	/* save the argment in r0 */
+        "swi %2\n"	/* do the system call */
+        "mov %0, a1;"	/* keep the return value */
+        : "=r"(newbrk) 
+        : "r"(addr), "i" (SYS_ify (brk))
+        : "a1");
++#endif // !__ARM_EABI__
+ 
+   __curbrk = newbrk;
+ 
+diff --git a/sysdeps/unix/sysv/linux/arm/clone.S b/sysdeps/unix/sysv/linux/arm/clone.S
+index c9a1ec2..bd088b4 100644
+--- a/sysdeps/unix/sysv/linux/arm/clone.S
++++ b/sysdeps/unix/sysv/linux/arm/clone.S
+@@ -44,7 +44,14 @@ ENTRY(__clone)
+ 	@ get flags
+ 	mov	r0, r2
+ 	@ new sp is already in r1
++#if __ARM_EABI__
++	str	r7, [sp, #-4]!
++	mov     r7, #SYS_ify(clone)
++	swi	0x0
++	ldr	r7, [sp], #4
++#else // !__ARM_EABI__
+ 	swi	SYS_ify(clone)
++#endif // !__ARM_EABI__
+ 	movs	a1, a1
+ 	blt	PLTJMP(C_SYMBOL_NAME(__syscall_error))
+ 	RETINSTR(movne, pc, lr)
+diff --git a/sysdeps/unix/sysv/linux/arm/mmap.S b/sysdeps/unix/sysv/linux/arm/mmap.S
+index af93c7b..97b4a55 100644
+--- a/sysdeps/unix/sysv/linux/arm/mmap.S
++++ b/sysdeps/unix/sysv/linux/arm/mmap.S
+@@ -41,7 +41,14 @@ ENTRY (__mmap)
+ 
+ 	/* do the syscall */
+ 	mov	a1, sp
++#if __ARM_EABI__
++	str	r7, [sp, #-4]!
++	mov	r7, #SYS_ify (mmap)
++	swi	0x0
++	ldr	r7, [sp], #4
++#else // !__ARM_EABI__
+ 	swi	SYS_ify (mmap)
++#endif // !__ARM_EABI__
+ 
+ 	/* pop args off the stack. */
+ 	add	sp, sp, #16
+diff --git a/sysdeps/unix/sysv/linux/arm/mmap64.S b/sysdeps/unix/sysv/linux/arm/mmap64.S
+index 1f19bf0..8cb40f5 100644
+--- a/sysdeps/unix/sysv/linux/arm/mmap64.S
++++ b/sysdeps/unix/sysv/linux/arm/mmap64.S
+@@ -36,7 +36,14 @@ ENTRY (__mmap64)
+ 	movs	ip, ip, lsr $12
+ 	bne	.Linval			@ check for overflow
+ 	mov	ip, r0
++#if __ARM_EABI__
++	str	r7, [sp, #-4]!
++	mov	r7, #SYS_ify (mmap2)
++	swi	0x0
++	ldr	r7, [sp], #4
++#else // !__ARM_EABI__
+ 	swi	SYS_ify (mmap2)
++#endif // !__ARM_EABI__
+ 	cmn	r0, $4096
+ 	LOADREGS(ccfd, sp!, {r4, r5, pc})
+ 	cmn	r0, $ENOSYS
+diff --git a/sysdeps/unix/sysv/linux/arm/sigrestorer.S b/sysdeps/unix/sysv/linux/arm/sigrestorer.S
+index a4769ca..54aa196 100644
+--- a/sysdeps/unix/sysv/linux/arm/sigrestorer.S
++++ b/sysdeps/unix/sysv/linux/arm/sigrestorer.S
+@@ -24,12 +24,26 @@
+ 
+ #ifdef __NR_sigreturn
+ ENTRY(__default_sa_restorer)
++#if __ARM_EABI__
++	str	r7, [sp, #-4]!
++	mov	r7, #SYS_ify(sigreturn)
++	swi	0x0
++	ldr	r7, [sp], #4
++#else // !__ARM_EABI__
+ 	swi	SYS_ify(sigreturn)
++#endif // !__ARM_EABI__
+ #endif
+ 
+ #ifdef __NR_rt_sigreturn
+ 
+ ENTRY(__default_rt_sa_restorer)
++#if __ARM_EABI__
++	str	r7, [sp, #-4]!
++	mov	r7, #SYS_ify(rt_sigreturn)
++	swi	0x0
++	ldr	r7, [sp], #4
++#else // !__ARM_EABI__
+ 	swi	SYS_ify(rt_sigreturn)
++#endif // !__ARM_EABI__
+ 
+ #endif
+diff --git a/sysdeps/unix/sysv/linux/arm/socket.S b/sysdeps/unix/sysv/linux/arm/socket.S
+index c8143a2..f0d6e08 100644
+--- a/sysdeps/unix/sysv/linux/arm/socket.S
++++ b/sysdeps/unix/sysv/linux/arm/socket.S
+@@ -72,7 +72,14 @@ ENTRY (__socket)
+ 	mov a1, $P(SOCKOP_,socket)
+ 	mov a2, sp
+ #ifdef __NR_socketcall
++#if __ARM_EABI__
++	str	r7, [sp, #-4]!
++	mov r7, #SYS_ify(socketcall)
++	swi 0x0
++	ldr	r7, [sp], #4
++#else // !__ARM_EABI__
+ 	swi SYS_ify(socketcall)
++#endif // !__ARM_EABI__
+ #endif
+ 
+ 	/* Pop args off the stack */
+diff --git a/sysdeps/unix/sysv/linux/arm/sysdep.h b/sysdeps/unix/sysv/linux/arm/sysdep.h
+index 89ad194..f8e88e4 100644
+--- a/sysdeps/unix/sysv/linux/arm/sysdep.h
++++ b/sysdeps/unix/sysv/linux/arm/sysdep.h
+@@ -95,10 +95,40 @@
+ */
+ 
+ #undef	DO_CALL
++#if __ARM_EABI__
++#define DO_CALL(args, syscall_name)		\
++    DOARGS_##args				\
++    ldr r7, =SYS_ify (syscall_name);		\
++    swi 0x0;					\
++    UNDOARGS_##args
++#else //!__ARM_EABI__
+ #define DO_CALL(args, syscall_name)		\
+     DOARGS_##args				\
+     swi SYS_ify (syscall_name); 		\
+     UNDOARGS_##args
++#endif //!__ARM_EABI__
++
++#if __ARM_EABI__
++
++#define DOARGS_0 str r7, [sp, $-4]!;
++#define DOARGS_1 str r7, [sp, $-4]!;
++#define DOARGS_2 str r7, [sp, $-4]!;
++#define DOARGS_3 str r7, [sp, $-4]!;
++#define DOARGS_4 str r7, [sp, $-4]!;
++#define DOARGS_5 mov ip, sp; stmfd sp!, {r4, r7}; ldmia ip, {r4, r7};
++#define DOARGS_6 mov ip, sp; stmfd sp!, {r4, r5, r7}; ldmia ip, {r4, r5, r7};
++#define DOARGS_7 mov ip, sp; stmfd sp!, {r4, r5, r6, r7}; ldmia ip, {r4, r5, r6, r7};
++
++#define UNDOARGS_0 ldr r7, [sp], $4;
++#define UNDOARGS_1 ldr r7, [sp], $4;
++#define UNDOARGS_2 ldr r7, [sp], $4;
++#define UNDOARGS_3 ldr r7, [sp], $4;
++#define UNDOARGS_4 ldr r7, [sp], $4;
++#define UNDOARGS_5 ldmfd sp!, {r4, r7};
++#define UNDOARGS_6 ldmfd sp!, {r4, r5, r7};
++#define UNDOARGS_7 ldmfd sp!, {r4, r5, r6, r7};
++
++#else //!__ARM_EABI__
+ 
+ #define DOARGS_0 /* nothing */
+ #define DOARGS_1 /* nothing */
+@@ -118,11 +148,34 @@
+ #define UNDOARGS_6 ldmfd sp!, {r4, r5};
+ #define UNDOARGS_7 ldmfd sp!, {r4, r5, r6};
+ 
++#endif //!__ARM_EABI__
++
+ #else /* not __ASSEMBLER__ */
+ 
+ /* Define a macro which expands into the inline wrapper code for a system
+    call.  */
+ #undef INLINE_SYSCALL
++
++#if __ARM_EABI__
++#define INLINE_SYSCALL(name, nr, args...)			\
++  ({ unsigned int _sys_result;					\
++     {								\
++       register int _a1 asm ("a1");				\
++       LOAD_ARGS_##nr (args)					\
++       asm volatile ("mov 	r7, %1\n\t"			\
++		     "swi	$0	@ syscall " #name	\
++		     : "=r" (_a1)				\
++		     : "i" (SYS_ify(name)) ASM_ARGS_##nr	\
++		     : "a1", "r7", "memory");                   \
++       _sys_result = _a1;					\
++     }								\
++     if (_sys_result >= (unsigned int) -4095)			\
++       {							\
++	 __set_errno (-_sys_result);				\
++	 _sys_result = (unsigned int) -1;			\
++       }							\
++     (int) _sys_result; })
++#else //!__ARM_EABI__
+ #define INLINE_SYSCALL(name, nr, args...)			\
+   ({ unsigned int _sys_result;					\
+      {								\
+@@ -140,6 +193,7 @@
+ 	 _sys_result = (unsigned int) -1;			\
+        }							\
+      (int) _sys_result; })
++#endif //!__ARM_EABI__
+ 
+ #define LOAD_ARGS_0()
+ #define ASM_ARGS_0
+diff --git a/sysdeps/unix/sysv/linux/arm/vfork.S b/sysdeps/unix/sysv/linux/arm/vfork.S
+index b10117e..ba2259d 100644
+--- a/sysdeps/unix/sysv/linux/arm/vfork.S
++++ b/sysdeps/unix/sysv/linux/arm/vfork.S
+@@ -29,7 +29,14 @@
+ ENTRY (__vfork)
+ 
+ #ifdef __NR_vfork
++#if __ARM_EABI__
++	str	r7, [sp, #-4]!
++	mov	r7, #__NR_vfork
++	swi	0x0
++	ldr	r7, [sp], #4
++#else // !__ARM_EABI__
+ 	swi	__NR_vfork
++#endif // !__ARM_EABI__
+ 	cmn	a1, #4096
+ 	RETINSTR(movcc, pc, lr)
+ 
+@@ -40,7 +47,14 @@ ENTRY (__vfork)
+ #endif
+ 
+ 	/* If we don't have vfork, fork is close enough.  */
++#if __ARM_EABI__
++	str	r7, [sp, #-4]!
++	mov	r7, #__NR_fork
++	swi	0x0
++	ldr	r7, [sp], #4
++#else // !__ARM_EABI__
+ 	swi	__NR_fork
++#endif // !__ARM_EABI__
+ 	cmn	a1, #4096
+ 	RETINSTR(movcc, pc, lr)
+     	b	PLTJMP(C_SYMBOL_NAME(__syscall_error))
+-- 
+Jan Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond http://lilypond.org
+Freelance IT http://JoyofSource.com | Avatar® http://AvatarAcademy.com
+
+From 030ccc9978c73eccddbaf8049b02a5cecf913383 Mon Sep 17 00:00:00 2001
+From: "Jan (janneke) Nieuwenhuizen" <janneke@gnu.org>
+Date: Tue, 22 Feb 2022 07:06:39 +0100
+Subject: [PATCH 09/10] bootstrappable: arm: Add #warning when using OABI.
+Content-Transfer-Encoding: 8bit
+Content-Type: text/plain; charset=UTF-8
+
+---
+ sysdeps/arm/dl-machine.h                  | 1 +
+ sysdeps/unix/sysv/linux/arm/brk.c         | 1 +
+ sysdeps/unix/sysv/linux/arm/clone.S       | 1 +
+ sysdeps/unix/sysv/linux/arm/mmap.S        | 1 +
+ sysdeps/unix/sysv/linux/arm/mmap64.S      | 1 +
+ sysdeps/unix/sysv/linux/arm/sigrestorer.S | 2 ++
+ sysdeps/unix/sysv/linux/arm/socket.S      | 1 +
+ sysdeps/unix/sysv/linux/arm/sysdep.h      | 3 +++
+ sysdeps/unix/sysv/linux/arm/vfork.S       | 2 ++
+ 9 files changed, 13 insertions(+)
+
+diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h
+index f0558bb..c0ac564 100644
+--- a/sysdeps/arm/dl-machine.h
++++ b/sysdeps/arm/dl-machine.h
+@@ -45,6 +45,7 @@
+ 		    : "a1","r7");					\
+ }
+ #else // !__ARM_EABI__
++#warning Using ARM_OABI
+ #define CLEAR_CACHE(BEG,END)						\
+ {									\
+   register unsigned long _beg __asm ("a1") = (unsigned long)(BEG);	\
+diff --git a/sysdeps/unix/sysv/linux/arm/brk.c b/sysdeps/unix/sysv/linux/arm/brk.c
+index d5d0904..8d7ffae 100644
+--- a/sysdeps/unix/sysv/linux/arm/brk.c
++++ b/sysdeps/unix/sysv/linux/arm/brk.c
+@@ -38,6 +38,7 @@ __brk (void *addr)
+        : "r"(addr), "i" (SYS_ify (brk))
+        : "a1","r7");
+ #else // !__ARM_EABI__
++#warning Using ARM_OABI
+   asm ("mov a1, %1\n"	/* save the argment in r0 */
+        "swi %2\n"	/* do the system call */
+        "mov %0, a1;"	/* keep the return value */
+diff --git a/sysdeps/unix/sysv/linux/arm/clone.S b/sysdeps/unix/sysv/linux/arm/clone.S
+index bd088b4..e0c5d8f 100644
+--- a/sysdeps/unix/sysv/linux/arm/clone.S
++++ b/sysdeps/unix/sysv/linux/arm/clone.S
+@@ -50,6 +50,7 @@ ENTRY(__clone)
+ 	swi	0x0
+ 	ldr	r7, [sp], #4
+ #else // !__ARM_EABI__
++#warning Using ARM_OABI
+ 	swi	SYS_ify(clone)
+ #endif // !__ARM_EABI__
+ 	movs	a1, a1
+diff --git a/sysdeps/unix/sysv/linux/arm/mmap.S b/sysdeps/unix/sysv/linux/arm/mmap.S
+index 97b4a55..f003f54 100644
+--- a/sysdeps/unix/sysv/linux/arm/mmap.S
++++ b/sysdeps/unix/sysv/linux/arm/mmap.S
+@@ -47,6 +47,7 @@ ENTRY (__mmap)
+ 	swi	0x0
+ 	ldr	r7, [sp], #4
+ #else // !__ARM_EABI__
++#warning Using ARM_OABI
+ 	swi	SYS_ify (mmap)
+ #endif // !__ARM_EABI__
+ 
+diff --git a/sysdeps/unix/sysv/linux/arm/mmap64.S b/sysdeps/unix/sysv/linux/arm/mmap64.S
+index 8cb40f5..462fc28 100644
+--- a/sysdeps/unix/sysv/linux/arm/mmap64.S
++++ b/sysdeps/unix/sysv/linux/arm/mmap64.S
+@@ -42,6 +42,7 @@ ENTRY (__mmap64)
+ 	swi	0x0
+ 	ldr	r7, [sp], #4
+ #else // !__ARM_EABI__
++#warning Using ARM_OABI
+ 	swi	SYS_ify (mmap2)
+ #endif // !__ARM_EABI__
+ 	cmn	r0, $4096
+diff --git a/sysdeps/unix/sysv/linux/arm/sigrestorer.S b/sysdeps/unix/sysv/linux/arm/sigrestorer.S
+index 54aa196..2985f08 100644
+--- a/sysdeps/unix/sysv/linux/arm/sigrestorer.S
++++ b/sysdeps/unix/sysv/linux/arm/sigrestorer.S
+@@ -30,6 +30,7 @@ ENTRY(__default_sa_restorer)
+ 	swi	0x0
+ 	ldr	r7, [sp], #4
+ #else // !__ARM_EABI__
++#warning Using ARM_OABI
+ 	swi	SYS_ify(sigreturn)
+ #endif // !__ARM_EABI__
+ #endif
+@@ -43,6 +44,7 @@ ENTRY(__default_rt_sa_restorer)
+ 	swi	0x0
+ 	ldr	r7, [sp], #4
+ #else // !__ARM_EABI__
++#warning Using ARM_OABI
+ 	swi	SYS_ify(rt_sigreturn)
+ #endif // !__ARM_EABI__
+ 
+diff --git a/sysdeps/unix/sysv/linux/arm/socket.S b/sysdeps/unix/sysv/linux/arm/socket.S
+index f0d6e08..3bf16e9 100644
+--- a/sysdeps/unix/sysv/linux/arm/socket.S
++++ b/sysdeps/unix/sysv/linux/arm/socket.S
+@@ -78,6 +78,7 @@ ENTRY (__socket)
+ 	swi 0x0
+ 	ldr	r7, [sp], #4
+ #else // !__ARM_EABI__
++#warning Using ARM_OABI
+ 	swi SYS_ify(socketcall)
+ #endif // !__ARM_EABI__
+ #endif
+diff --git a/sysdeps/unix/sysv/linux/arm/sysdep.h b/sysdeps/unix/sysv/linux/arm/sysdep.h
+index f8e88e4..37b8cb6 100644
+--- a/sysdeps/unix/sysv/linux/arm/sysdep.h
++++ b/sysdeps/unix/sysv/linux/arm/sysdep.h
+@@ -102,6 +102,7 @@
+     swi 0x0;					\
+     UNDOARGS_##args
+ #else //!__ARM_EABI__
++#warning Using ARM_OABI
+ #define DO_CALL(args, syscall_name)		\
+     DOARGS_##args				\
+     swi SYS_ify (syscall_name); 		\
+@@ -129,6 +130,7 @@
+ #define UNDOARGS_7 ldmfd sp!, {r4, r5, r6, r7};
+ 
+ #else //!__ARM_EABI__
++#warning Using ARM_OABI
+ 
+ #define DOARGS_0 /* nothing */
+ #define DOARGS_1 /* nothing */
+@@ -176,6 +178,7 @@
+        }							\
+      (int) _sys_result; })
+ #else //!__ARM_EABI__
++#warning Using ARM_OABI
+ #define INLINE_SYSCALL(name, nr, args...)			\
+   ({ unsigned int _sys_result;					\
+      {								\
+diff --git a/sysdeps/unix/sysv/linux/arm/vfork.S b/sysdeps/unix/sysv/linux/arm/vfork.S
+index ba2259d..9b0c9ec 100644
+--- a/sysdeps/unix/sysv/linux/arm/vfork.S
++++ b/sysdeps/unix/sysv/linux/arm/vfork.S
+@@ -35,6 +35,7 @@ ENTRY (__vfork)
+ 	swi	0x0
+ 	ldr	r7, [sp], #4
+ #else // !__ARM_EABI__
++#warning Using ARM_OABI
+ 	swi	__NR_vfork
+ #endif // !__ARM_EABI__
+ 	cmn	a1, #4096
+@@ -53,6 +54,7 @@ ENTRY (__vfork)
+ 	swi	0x0
+ 	ldr	r7, [sp], #4
+ #else // !__ARM_EABI__
++#warning Using ARM_OABI
+ 	swi	__NR_fork
+ #endif // !__ARM_EABI__
+ 	cmn	a1, #4096
+-- 
+Jan Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond http://lilypond.org
+Freelance IT http://JoyofSource.com | Avatar® http://AvatarAcademy.com
+
+From 3d0f788cb58075e9790956ef0d6778b56dac291f Mon Sep 17 00:00:00 2001
+From: "Jan (janneke) Nieuwenhuizen" <janneke@gnu.org>
+Date: Wed, 23 Feb 2022 08:16:46 +0100
+Subject: [PATCH 10/10] bootstrappable: arm: More minimal SYS_ify patch.
+Content-Transfer-Encoding: 8bit
+Content-Type: text/plain; charset=UTF-8
+
+* sysdeps/unix/sysv/linux/arm/sysdep.h (SWI_BASE): Set to zero.
+(SYS_ify): And with 0xfffff.
+
+Co-authored-by: Danny Milosavljevic <dannym@scratchpost.org>
+---
+ sysdeps/unix/sysv/linux/arm/sysdep.h | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+diff --git a/sysdeps/unix/sysv/linux/arm/sysdep.h b/sysdeps/unix/sysv/linux/arm/sysdep.h
+index 37b8cb6..3878331 100644
+--- a/sysdeps/unix/sysv/linux/arm/sysdep.h
++++ b/sysdeps/unix/sysv/linux/arm/sysdep.h
+@@ -29,9 +29,8 @@
+    of the kernel.  But these symbols do not follow the SYS_* syntax
+    so we have to redefine the `SYS_ify' macro here.  */
+ #undef SYS_ify
+-#define SWI_BASE  (0x900000)
+-#define SYS_ify(syscall_name)	(__NR_##syscall_name)
+-
++#define SWI_BASE  (0x000000)
++#define SYS_ify(syscall_name)  (__NR_##syscall_name & 0xfffff)
+ 
+ #ifdef __ASSEMBLER__
+ 
+-- 
+Jan Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond http://lilypond.org
+Freelance IT http://JoyofSource.com | Avatar® http://AvatarAcademy.com
+