[git commit master 1/1] microblaze: Fix crt bootstrap

Steven J. Magnani steve at digidescorp.com
Wed Nov 10 19:10:46 UTC 2010


commit: http://git.uclibc.org/uClibc/commit/?id=2be86fb41e29def10eec97e5f663cc8147227358
branch: http://git.uclibc.org/uClibc/commit/?id=refs/heads/master

Rework crt bootstrap to work with the new __uClibc_main(),
and hardwire crt init/fini code since the awk approach to generating it on
the fly doesn't work for microblaze. The output from the gcc 4.1.2 compiler
is scrambled so that the tags expected by the awk script to bracket the
init/fini entry and exit code no longer do.

Signed-off-by: Steven J. Magnani <steve at digidescorp.com>
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop at gmail.com>
---
 libc/sysdeps/linux/microblaze/crt1.S |   61 ++++++++++++++++++++++++++++++++++
 libc/sysdeps/linux/microblaze/crti.S |   41 +++++++++++++++++++++++
 libc/sysdeps/linux/microblaze/crtn.S |   45 +++++++++++++++++++++++++
 3 files changed, 147 insertions(+), 0 deletions(-)
 create mode 100644 libc/sysdeps/linux/microblaze/crt1.S
 create mode 100644 libc/sysdeps/linux/microblaze/crti.S
 create mode 100644 libc/sysdeps/linux/microblaze/crtn.S

diff --git a/libc/sysdeps/linux/microblaze/crt1.S b/libc/sysdeps/linux/microblaze/crt1.S
new file mode 100644
index 0000000..e9564cf
--- /dev/null
+++ b/libc/sysdeps/linux/microblaze/crt1.S
@@ -0,0 +1,61 @@
+/*
+ * libc/sysdeps/linux/microblaze/crt1.S -- Initial program entry point for linux/microblaze
+ *
+ *  Copyright (C) 2009       Meyer Sound Laboratories
+ *  Copyright (C) 2003       John Williams <jwilliams at itee.uq.edu.au>
+ *  Copyright (C) 2001,2002  NEC Corporation
+ *  Copyright (C) 2001,2002  Miles Bader <miles at gnu.org>
+ *
+ * This file is subject to the terms and conditions of the GNU Lesser
+ * General Public License.  See the file COPYING.LIB in the main
+ * directory of this archive for more details.
+ *
+ * Written by Miles Bader <miles at gnu.org>
+ */
+
+#include <libc-symbols.h>
+
+/* Upon entry, the stack contains the following data:
+	argc, argv[0], ..., argv[argc-1], 0, envp[0], ..., 0
+*/
+
+	.text
+	.globl C_SYMBOL_NAME(_start)
+	.align 4
+C_SYMBOL_NAME(_start):
+
+	/* Load SDAs */
+	la	r2, r0, C_SYMBOL_NAME(_SDA2_BASE_) /* in the original source r2 was SDA, and r13 was SDA2, no idea why */
+	la	r13, r0, C_SYMBOL_NAME(_SDA_BASE_)
+
+	/*
+	Preparing arguments for uClibc's startup routine.
+	The routine has 6 arguments, so 5 of them are placed
+	into registers, one on the stack
+	*/
+
+	la      r5, r0, C_SYMBOL_NAME(main) /* Arg 1: main() */
+	lw	r6, r0, r1		    /* Arg 2: argc   */
+	addi	r7, r1, 4		    /* Arg 3: argv   */
+	la	r8, r0, _init               /* Arg 4: init   */
+	la	r9, r0, _fini               /* Arg 5: fini   */
+	addk	r10,r0,r0                   /* Arg 6: rtld_fini = NULL */
+
+
+	/* Reserve space for __uClibc_main to save parameters
+	   (Microblaze ABI stack calling convention)
+	   and for stack_end argument to __uClibc_main  */
+	add 	r3, r1, r0
+	addi    r1, r1, -32
+
+	/* tail-call uClibc's startup routine */
+	brid	C_SYMBOL_NAME(__uClibc_main)
+	swi 	r3, r1, 28	/* Arg 7: stack end [DELAY SLOT] */
+
+/* Define a symbol for the first piece of initialized data.  */
+	.data
+	.globl __data_start
+__data_start:
+	.long 0
+	.weak data_start
+	data_start = __data_start
diff --git a/libc/sysdeps/linux/microblaze/crti.S b/libc/sysdeps/linux/microblaze/crti.S
new file mode 100644
index 0000000..e003968
--- /dev/null
+++ b/libc/sysdeps/linux/microblaze/crti.S
@@ -0,0 +1,41 @@
+/*
+ * libc/sysdeps/linux/microblaze/crti.S -- init/fini entry code for microblaze
+ *                                         (baselined with gcc 4.1.2)
+ *
+ *  Copyright (C) 2010       Digital Design Corporation
+ *
+ * This file is subject to the terms and conditions of the GNU Lesser
+ * General Public License.  See the file COPYING.LIB in the main
+ * directory of this archive for more details.
+ */
+
+#define END_INIT
+#define END_FINI
+#define ALIGN
+#include <libc-symbols.h>
+
+/*@HEADER_ENDS*/
+
+	.section .init
+	.align	2
+	.globl	_init
+_init:
+	addik	r1, r1, -32
+	swi	r19, r1, 28
+	addk	r19, r1, r0
+	swi	r15, r1, 0
+
+	ALIGN
+	END_INIT
+
+	.section .fini
+	.align	2
+	.globl	_fini
+_fini:
+	addik	r1, r1, -32
+	swi	r19, r1, 28
+	addk	r19, r1, r0
+	swi	r15, r1, 0
+
+	ALIGN
+	END_FINI
diff --git a/libc/sysdeps/linux/microblaze/crtn.S b/libc/sysdeps/linux/microblaze/crtn.S
new file mode 100644
index 0000000..da8c920
--- /dev/null
+++ b/libc/sysdeps/linux/microblaze/crtn.S
@@ -0,0 +1,45 @@
+/*
+ * libc/sysdeps/linux/microblaze/crtn.S -- init/fini exit code for microblaze
+ *                                         (baselined with gcc 4.1.2)
+ *
+ *  Copyright (C) 2010       Digital Design Corporation
+ *
+ * This file is subject to the terms and conditions of the GNU Lesser
+ * General Public License.  See the file COPYING.LIB in the main
+ * directory of this archive for more details.
+ */
+
+#define END_INIT
+#define END_FINI
+#define ALIGN
+#include <libc-symbols.h>
+
+	.section .init
+	.align	2
+	.globl	_init
+	.ent	_init
+
+	lwi	r15, r1, 0
+	lwi	r19, r1, 28
+	rtsd	r15, 8
+	addik	r1, r1, 32	# Delay slot
+
+	.end	_init
+$Lfe2:
+	.size	_init,$Lfe2-_init
+
+	.section .fini
+	.align	2
+	.globl	_fini
+	.ent	_fini
+
+	lwi	r15, r1, 0
+	lwi	r19, r1, 28
+	rtsd	r15, 8
+	addik	r1, r1, 32	# Delay slot
+
+	.end	_fini
+$Lfe3:
+	.size	_fini,$Lfe3-_fini
+
+/*@TRAILER_BEGINS*/
-- 
1.7.1



More information about the uClibc-cvs mailing list