diff options
author | Steven J. Magnani <steve@digidescorp.com> | 2010-11-10 19:25:30 +0100 |
---|---|---|
committer | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2010-11-10 19:44:36 +0100 |
commit | 2be86fb41e29def10eec97e5f663cc8147227358 (patch) | |
tree | 6cfefacb518c3d37786eb9b876e1fa46c8782393 /libc/sysdeps | |
parent | 4dc998596f0ed8c9f1da6dc57a5640e3928cc12b (diff) |
microblaze: Fix crt bootstrap
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@digidescorp.com>
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Diffstat (limited to 'libc/sysdeps')
-rw-r--r-- | libc/sysdeps/linux/microblaze/crt1.S | 61 | ||||
-rw-r--r-- | libc/sysdeps/linux/microblaze/crti.S | 41 | ||||
-rw-r--r-- | libc/sysdeps/linux/microblaze/crtn.S | 45 |
3 files changed, 147 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/microblaze/crt1.S b/libc/sysdeps/linux/microblaze/crt1.S new file mode 100644 index 000000000..e9564cfba --- /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@itee.uq.edu.au> + * Copyright (C) 2001,2002 NEC Corporation + * Copyright (C) 2001,2002 Miles Bader <miles@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@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 000000000..e00396897 --- /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 000000000..da8c920ef --- /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*/ |