summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/kvx/crt1.S
diff options
context:
space:
mode:
authorYann Sionneau <ysionneau@kalray.eu>2020-10-02 16:24:55 +0200
committerWaldemar Brodkorb <wbx@openadk.org>2020-10-02 19:10:36 +0200
commit672a303852353ba9299f6f50190fca8b3abe4c1d (patch)
treef204ea8dc0b5a3e4b2bd4251b8daf5f0783ae260 /libc/sysdeps/linux/kvx/crt1.S
parent4acf6f072cbc255b0b0d6cfd598a100f95d84f2a (diff)
kvx: add support for kvx arch to uClibc-ng
This commit adds support for Kalray VLIW family (kvx) Kalray kv3 core is embedded in Kalray Coolidge SoC. This core which is the third of the KV family has the following features: 32/64 bits execution mode 6-issue VLIW architecture 64 x 64bits general purpose registers SIMD instructions little-endian In order to build a usable toolchain, build scripts are provided at the following address: https://github.com/kalray/build-scripts. Kalray uses FOSS which is available at https://github.com/kalray This includes Linux kernel, uClibc-ng, gcc, binutils, etc. Signed-off-by: Clément Léger <cleger@kalray.eu> Signed-off-by: Guillaume Thouvenin <gthouvenin@kalray.eu> Signed-off-by: Laurent Thevenoux <lthevenoux@kalray.eu> Signed-off-by: Marc Poulhies <mpoulhies@kalray.eu> Signed-off-by: Marius Gligor <mgligor@kalray.eu> Signed-off-by: Yann Sionneau <ysionneau@kalray.eu>
Diffstat (limited to 'libc/sysdeps/linux/kvx/crt1.S')
-rw-r--r--libc/sysdeps/linux/kvx/crt1.S83
1 files changed, 83 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/kvx/crt1.S b/libc/sysdeps/linux/kvx/crt1.S
new file mode 100644
index 000000000..34501103e
--- /dev/null
+++ b/libc/sysdeps/linux/kvx/crt1.S
@@ -0,0 +1,83 @@
+/*
+ * This file is subject to the terms and conditions of the LGPL V2.1
+ * License. See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (C) 2018 Kalray Inc.
+ */
+
+/* Startup code compliant to the ELF KVX ABI */
+
+#include <libc-symbols.h>
+#include <features.h>
+
+.type main,@function
+.type __uClibc_main,@function
+
+/*
+ * When we enter this piece of code, the program stack has been
+ * layed out by the kernel like this:
+ * argc argument counter (integer)
+ * argv[0] program name (pointer)
+ * argv[1...N] program args (pointers)
+ * argv[argc-1] end of args (integer)
+ * NULL
+ * env[0...N] environment variables (pointers)
+ * NULL
+ *
+ * Moreover, when using dynamic loader, $r0 contains the rtld_fini
+ * address
+ *
+ * And we need to call the following function:
+ * __uClibc_main (int (*main) (int, char **, char **), int argc,
+ * char **argv, void (*init) (void), void (*fini) (void),
+ * void (*rtld_fini) (void), void *stack_end)
+ */
+.text
+.globl _start
+.type _start,@function
+.align 8
+C_SYMBOL_NAME(_start):
+ /* Load argc from stack */
+ ld $r1 = 0[$sp]
+ /* Load argv addr from stack */
+ addd $r2 = $sp, 0x8
+#ifdef __PIC__
+ pcrel $r7 = @gotaddr()
+#endif
+ ;;
+ /* $r0 contains rtld_fini when run by dynamic loader */
+ copyd $r5 = $r0
+ /* prepare __uClibc_main arg */
+#ifndef __PIC__
+ make $r3 = _init
+ make $r4 = _fini
+#endif
+ ;;
+ /* Align stack to 32-byte boundary */
+ andd $sp = $sp, -32
+ make $r8 = 0
+ make $fp = 0
+ /* prepare __uClibc_main arg */
+#ifdef __PIC__
+ ld $r3 = @got(_init)[$r7]
+#endif
+ ;;
+ /* Setup stack_end for __uClibc_main */
+ copyd $r6 = $sp
+ /* Clear compute status */
+ set $cs = $r8
+#ifdef __PIC__
+ ld $r4 = @got(_fini)[$r7]
+#endif
+ ;;
+#ifdef __PIC__
+ ld $r0 = @got(main)[$r7]
+#else
+ make $r0 = main
+#endif
+ goto __uClibc_main
+ ;;
+ /* We should never return ! */
+ errop
+ ;;