From cc625c9b1edb3878cacb421d2645fb95d001dd10 Mon Sep 17 00:00:00 2001 From: "Jan (janneke) Nieuwenhuizen" Date: Tue, 28 Dec 2021 15:53:19 +0100 Subject: 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. --- gnu/local.mk | 3 +- gnu/packages/commencement.scm | 191 +-- .../patches/glibc-bootstrap-arm-2.2.5.patch | 1287 ++++++++++++++++++++ 3 files changed, 1391 insertions(+), 90 deletions(-) create mode 100644 gnu/packages/patches/glibc-bootstrap-arm-2.2.5.patch 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 # Copyright © 2016, 2017, 2018, 2019 Alex Vong # Copyright © 2016, 2017, 2018, 2019, 2020, 2021 Efraim Flashner -# Copyright © 2016, 2017, 2018, 2019, 2020, 2021 Jan (janneke) Nieuwenhuizen +# Copyright © 2016, 2017, 2018, 2019, 2020, 2021, 2022 Jan (janneke) Nieuwenhuizen # Copyright © 2017, 2018, 2019, 2020 Tobias Geerinckx-Rice # Copyright © 2017, 2018 Clément Lassieur # Copyright © 2017, 2020 Mathieu Othacehe @@ -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" +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 | 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" +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 | 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" +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 | 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" +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 + ++#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 + #ifdef __NR_oldumount + PSEUDO (__umount, oldumount, 1) +-#else ++#elif defined (__NR_umount) + PSEUDO (__umount, umount, 1) + #endif + ret +-- +Jan Nieuwenhuizen | 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" +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 | 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" +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 | 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" +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 | 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" +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 | 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" +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 | 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" +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 +--- + 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 | GNU LilyPond http://lilypond.org +Freelance IT http://JoyofSource.com | Avatar® http://AvatarAcademy.com + -- cgit 1.4.1