Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 7 Jul 2023 16:56:23 GMT
From:      Dmitry Chagin <dchagin@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: bae6bb0698ee - main - csu: Implement _start using as to satisfy unwinders on aarch64
Message-ID:  <202307071656.367GuNr7013899@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by dchagin:

URL: https://cgit.FreeBSD.org/src/commit/?id=bae6bb0698ee727df601e4418153787b5b4b0c9d

commit bae6bb0698ee727df601e4418153787b5b4b0c9d
Author:     Dmitry Chagin <dchagin@FreeBSD.org>
AuthorDate: 2023-07-07 16:56:02 +0000
Commit:     Dmitry Chagin <dchagin@FreeBSD.org>
CommitDate: 2023-07-07 16:56:02 +0000

    csu: Implement _start using as to satisfy unwinders on aarch64
    
    The right unwinding stop indicator should be CFI-undefined PC.
    https://dwarfstd.org/doc/Dwarf3.pdf - page 118:
    If a Return Address register is defined in the virtual unwind table,
    and its rule is undefined (for example, by DW_CFA_undefined), then
    there is no return address and no call address, and the virtual
    unwind of stack activations is complete.
    
    Reviewed by:
    Differential Revision:  https://reviews.freebsd.org/D40623
---
 lib/csu/aarch64/Makefile |  3 ++-
 lib/csu/aarch64/crt1_c.c | 15 ---------------
 lib/csu/aarch64/crt1_s.S | 24 +++++++++++++++++++++++-
 3 files changed, 25 insertions(+), 17 deletions(-)

diff --git a/lib/csu/aarch64/Makefile b/lib/csu/aarch64/Makefile
index d8d0d3fd8f99..72be8b70ef19 100644
--- a/lib/csu/aarch64/Makefile
+++ b/lib/csu/aarch64/Makefile
@@ -4,6 +4,7 @@
 
 CFLAGS+=	-I${.CURDIR}
 
-CRT1OBJS+=	crt1_s.o
+CRT1SRC=	crt1_s.S
+CRT1OBJ=	crt1_c.o
 
 .include <bsd.lib.mk>
diff --git a/lib/csu/aarch64/crt1_c.c b/lib/csu/aarch64/crt1_c.c
index 7f4fea37ba1a..095c798046b4 100644
--- a/lib/csu/aarch64/crt1_c.c
+++ b/lib/csu/aarch64/crt1_c.c
@@ -32,19 +32,4 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
-#include "libc_private.h"
 #include "csu_common.h"
-
-void __start(int, char **, char **, void (*)(void)) __dead2;
-
-/* The entry function. */
-void
-__start(int argc, char *argv[], char *env[], void (*cleanup)(void))
-{
-#ifdef GCRT
-	__libc_start1_gcrt(argc, argv, env, cleanup, main, &eprol, &etext);
-__asm__("eprol:");
-#else
-	__libc_start1(argc, argv, env, cleanup, main);
-#endif
-}
diff --git a/lib/csu/aarch64/crt1_s.S b/lib/csu/aarch64/crt1_s.S
index 65803c8246ae..17ed74531675 100644
--- a/lib/csu/aarch64/crt1_s.S
+++ b/lib/csu/aarch64/crt1_s.S
@@ -32,13 +32,35 @@
 #include <machine/asm.h>
 __FBSDID("$FreeBSD$");
 
+	/*
+	 * The program entry point
+	 * void _start(char **ap, void (*cleanup)(void)) __dead2
+	 */
 ENTRY(_start)
+	.cfi_undefined x30
 	mov	x3, x2		/* cleanup */
 	add	x1, x0, #8	/* load argv */
 	ldr	x0, [x0]	/* load argc */
 	add	x2, x1, x0, lsl #3 /* env is after argv */
 	add	x2, x2, #8	/* argv is null terminated */
-	b	 __start
+#ifdef PIC
+	adrp	x4, main
+	add	x4, x4, :lo12:main
+#else
+	ldr	x4, =main
+#endif
+#ifdef GCRT
+	ldr	x5, =eprol
+	ldr	x6, =etext
+	/*
+	 * __libc_start1_gcrt(argc, argv, env, cleanup, main, &eprol, &etext)
+	 */
+	bl	__libc_start1_gcrt
+eprol:
+#else
+	/* __libc_start1(argc, argv, env, cleanup, main) */
+	bl	__libc_start1
+#endif
 END(_start)
 
 	.section .note.GNU-stack,"",@progbits



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202307071656.367GuNr7013899>