From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp2 ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms11 with LMTPS id CeL8D3mmMmD0PwAA0tVLHw (envelope-from ) for ; Sun, 21 Feb 2021 18:29:13 +0000 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp2 with LMTPS id oH9SC3mmMmB6KQAAB5/wlQ (envelope-from ) for ; Sun, 21 Feb 2021 18:29:13 +0000 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id B9357D91D for ; Sun, 21 Feb 2021 19:29:12 +0100 (CET) Received: from localhost ([::1]:40226 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lDtTj-00038A-Vs for larch@yhetil.org; Sun, 21 Feb 2021 13:29:12 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:46496) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lDtTb-00037z-QD; Sun, 21 Feb 2021 13:29:03 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]:39565) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lDtTa-00083K-Up; Sun, 21 Feb 2021 13:29:02 -0500 Received: from [2001:980:1b4f:1:42d2:832d:bb59:862] (port=52576 helo=dundal.janneke.lilypond.org) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1lDtTX-0001hI-Hp; Sun, 21 Feb 2021 13:29:00 -0500 From: Jan Nieuwenhuizen To: Danny Milosavljevic Subject: Re: Update on wip-arm-bootstrap Organization: AvatarAcademy.nl References: <87blco9v58.fsf@gnu.org> <87h7m91d3j.fsf@yucca> <874ki9cabq.fsf@gnu.org> <20210219052341.5f10e637@scratchpost.org> <871rdceg30.fsf@gnu.org> X-Url: http://AvatarAcademy.nl Date: Sun, 21 Feb 2021 19:28:55 +0100 In-Reply-To: <871rdceg30.fsf@gnu.org> (Jan Nieuwenhuizen's message of "Fri, 19 Feb 2021 07:17:55 +0100") Message-ID: <87v9als2ag.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.1 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-BeenThere: guix-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Vagrant Cascadian , guix-devel@gnu.org, bug-mes@gnu.org Errors-To: guix-devel-bounces+larch=yhetil.org@gnu.org Sender: "Guix-devel" X-Migadu-Flow: FLOW_IN X-Migadu-Spam-Score: -2.87 Authentication-Results: aspmx1.migadu.com; dkim=none; dmarc=pass (policy=none) header.from=gnu.org; spf=pass (aspmx1.migadu.com: domain of guix-devel-bounces@gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=guix-devel-bounces@gnu.org X-Migadu-Queue-Id: B9357D91D X-Spam-Score: -2.87 X-Migadu-Scanner: scn0.migadu.com X-TUID: 13cGEWUzaGAK --=-=-= Content-Type: text/plain Jan Nieuwenhuizen writes: Hi Danny! >> On Thu, 18 Feb 2021 22:52:57 +0100 >> Jan Nieuwenhuizen wrote: >> Since this only affects the syscall interface and since also our >> ELF headers specify EABI, I would just change the syscalls to EABI: >> Just put the syscall number into r7 and use svc 0. > > Oh, if that's all we should be able to find and fix it? I took a stab at it and created the attached patch, also on wip-arm-bootstrap now. This allows creating simple binaries using gcc-core-mesboot0 and glibc-mesboot0 that run, like "return 42" and even "exit (42)". But something like puts or printf segfaults "Illegal instruction" in strlen: --8<---------------cut here---------------start------------->8--- (gdb) disas /r Dump of assembler code for function strlen: 0x0000d160 <+0>: 03 10 c0 e3 bic r1, r0, #3 => 0x0000d164 <+4>: 04 20 91 e4 ldr r2, [r1], #4 --8<---------------cut here---------------end--------------->8--- makes no sens to me? So, trying to build the first glibc-based gcc --8<---------------cut here---------------start------------->8--- ./pre-inst-env guix build -e '(@@ (gnu packages commencement) gcc-mesboot0)' --8<---------------cut here---------------end--------------->8--- still fails during configure. Seems like I'm stuck here again, hopefully you can spot some silly mistake in my patch or have another helpful insight :-) Greetings, Janneke --=-=-= Content-Type: text/x-patch; charset=utf-8 Content-Disposition: inline; filename=0008-bootstrappable-arm-Support-EABI-system-calls.patch Content-Transfer-Encoding: quoted-printable >From dda9f6d081d68848a1d602c375e0d7a8871e4ae4 Mon Sep 17 00:00:00 2001 From: "Jan (janneke) Nieuwenhuizen" Date: Sat, 20 Feb 2021 15:32:53 +0100 Subject: [PATCH 8/8] bootstrappable: arm: Support EABI system calls. Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=3DUTF-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. * sysdeps/unix/sysv/linux/arm/brk.c (__brk): Likewise.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..02c48bd 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]) =20 +#if __ARM_EABI__ +#define CLEAR_CACHE(BEG,END) \ +{ \ + register unsigned long _beg __asm ("a1") =3D (unsigned long)(BEG); \ + register unsigned long _end __asm ("a2") =3D (unsigned long)(END); \ + register unsigned long _flg __asm ("a3") =3D 0; \ + __asm __volatile ("mov r7, 0x9f0002\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") =3D (unsigned long)(BEG); \ @@ -42,6 +55,7 @@ : /* no inputs */ \ : "a1"); \ } +#endif // !__ARM_EABI__ =20 /* 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/ar= m/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; =20 +#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 */ + : "=3Dr"(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 */ : "=3Dr"(newbrk)=20 : "r"(addr), "i" (SYS_ify (brk)) : "a1"); +#endif // !__ARM_EABI__ =20 __curbrk =3D newbrk; =20 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/a= rm/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) =20 /* 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__ =20 /* 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 @@ =20 #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 =20 #ifdef __NR_rt_sigreturn =20 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__ =20 #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 =20 /* 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 @@ */ =20 #undef DO_CALL +#if __ARM_EABI__ +#define DO_CALL(args, syscall_name) \ + DOARGS_##args \ + ldr r7, =3DSYS_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, r= 7}; +#define DOARGS_7 mov ip, sp; stmfd sp!, {r4, r5, r6, r7}; ldmia ip, {r4, r= 5, 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__ =20 #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}; =20 +#endif //!__ARM_EABI__ + #else /* not __ASSEMBLER__ */ =20 /* 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 \ + : "=3Dr" (_a1) \ + : "i" (SYS_ify(name)) ASM_ARGS_##nr \ + : "a1", "r7", "memory"); \ + _sys_result =3D _a1; \ + } \ + if (_sys_result >=3D (unsigned int) -4095) \ + { \ + __set_errno (-_sys_result); \ + _sys_result =3D (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 =3D (unsigned int) -1; \ } \ (int) _sys_result; }) +#endif //!__ARM_EABI__ =20 #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) =20 #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) =20 @@ -40,7 +47,14 @@ ENTRY (__vfork) #endif =20 /* 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)) --=20 Jan Nieuwenhuizen | GNU LilyPond http://lilypond.org Freelance IT http://JoyofSource.com | Avatar=C2=AE http://AvatarAcademy.com --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable --=20 Jan Nieuwenhuizen | GNU LilyPond http://lilypond.org Freelance IT http://JoyofSource.com | Avatar=C2=AE http://AvatarAcademy.com --=-=-=--