From 747460025e9b4349139a310ee93a8c52145285fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 24 Aug 2024 17:09:21 +0200 Subject: [PATCH] glibc: Add csky start files. --- .../glibc/sysdeps/csky/abiv2/start-2.33.S | 112 ++++++++++++++++++ lib/libc/glibc/sysdeps/csky/abiv2/start.S | 103 ++++++++++++++++ lib/libc/glibc/sysdeps/csky/bits/endianness.h | 14 +++ 3 files changed, 229 insertions(+) create mode 100644 lib/libc/glibc/sysdeps/csky/abiv2/start-2.33.S create mode 100644 lib/libc/glibc/sysdeps/csky/abiv2/start.S create mode 100644 lib/libc/glibc/sysdeps/csky/bits/endianness.h diff --git a/lib/libc/glibc/sysdeps/csky/abiv2/start-2.33.S b/lib/libc/glibc/sysdeps/csky/abiv2/start-2.33.S new file mode 100644 index 0000000000..d65e37e61b --- /dev/null +++ b/lib/libc/glibc/sysdeps/csky/abiv2/start-2.33.S @@ -0,0 +1,112 @@ +/* Startup code compliant to the ELF C-SKY ABIV2. + Copyright (C) 2018-2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The GNU Lesser General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + Note that people who make modified versions of this file are not + obligated to grant this special exception for their modified + versions; it is their choice whether to do so. The GNU Lesser + General Public License gives permission to release a modified + version without this exception; this exception also makes it + possible to release a modified version which carries forward this + exception. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +/* We need to call: + __libc_start_main (int (*main) (int, char **, char **), int argc, + char **argv, void (*init) (void), void (*fini) (void), + void (*rtld_fini) (void), void *stack_end) + */ + +#include + + .text + .globl _start; + .type _start,@function; + .align 4; +_start: + cfi_startproc + .cfi_label .Ldummy + cfi_undefined (lr) + subi sp, 8 + /* Clear the link register since this is the outermost frame. */ + movi lr, 0 + /* Pop argc off the stack and save a pointer to argv. */ + ldw a1, (sp, 8) /* Init argc for __libc_start_main. */ + addi a2, sp, 12 /* Init argv for __libc_start_main. */ + + /* Push stack limit. */ + stw a2, (sp, 8) + /* Push rtld_fini. */ + stw a0, (sp, 4) + +#ifdef SHARED + grs t0, .Lgetpc +.Lgetpc: + lrw gb, .Lgetpc@GOTPC + addu gb, t0 + lrw a3, __libc_csu_fini@GOT + ldr.w a3, (gb, a3 << 0) + stw a3, (sp, 0) + + lrw a3, __libc_csu_init@GOT + addu a3, gb + ldw a3, (a3, 0) + + lrw t0, main@GOT + addu t0, gb + ldw a0, (t0, 0) + lrw t1, __libc_start_main@PLT + ldr.w t1, (gb, t1 << 0) + jsr t1 + + lrw t1, abort@PLT + ldr.w t1, (gb, t1 << 0) + jsr t1 +#else + /* Fetch address of __libc_csu_fini. */ + lrw a0, __libc_csu_fini + /* Push __libc_csu_fini */ + stw a0, (sp, 0) + + /* Set up the other arguments in registers. */ + lrw a0, main + lrw a3, __libc_csu_init + /* Let the libc call main and exit with its return code. */ + jsri __libc_start_main + + /* Should never get here. */ + jsri abort +#endif /* !SHARED */ + cfi_endproc + .size _start,.-_start + + + /* 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/lib/libc/glibc/sysdeps/csky/abiv2/start.S b/lib/libc/glibc/sysdeps/csky/abiv2/start.S new file mode 100644 index 0000000000..4c03a55335 --- /dev/null +++ b/lib/libc/glibc/sysdeps/csky/abiv2/start.S @@ -0,0 +1,103 @@ +/* Startup code compliant to the ELF C-SKY ABIV2. + Copyright (C) 2018-2024 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The GNU Lesser General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + Note that people who make modified versions of this file are not + obligated to grant this special exception for their modified + versions; it is their choice whether to do so. The GNU Lesser + General Public License gives permission to release a modified + version without this exception; this exception also makes it + possible to release a modified version which carries forward this + exception. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +/* We need to call: + __libc_start_main (int (*main) (int, char **, char **), int argc, + char **argv, void (*init) (void), void (*fini) (void), + void (*rtld_fini) (void), void *stack_end) + */ + +#include + + .text + .globl _start; + .type _start,@function; + .align 4; +_start: + cfi_startproc + .cfi_label .Ldummy + cfi_undefined (lr) + subi sp, 8 + /* Clear the link register since this is the outermost frame. */ + movi lr, 0 + /* Pop argc off the stack and save a pointer to argv. */ + ldw a1, (sp, 8) /* Init argc for __libc_start_main. */ + addi a2, sp, 12 /* Init argv for __libc_start_main. */ + + /* Push stack limit. */ + stw a2, (sp, 8) + /* Push rtld_fini. */ + stw a0, (sp, 4) + +#ifdef SHARED + grs t0, .Lgetpc +.Lgetpc: + lrw gb, .Lgetpc@GOTPC + addu gb, t0 + + movi a3, 0 /* Used to be init. */ + stw a3, (sp, 0) /* Used to be fini. */ + + lrw t0, main@GOT + addu t0, gb + ldw a0, (t0, 0) + lrw t1, __libc_start_main@PLT + ldr.w t1, (gb, t1 << 0) + jsr t1 + + lrw t1, abort@PLT + ldr.w t1, (gb, t1 << 0) + jsr t1 +#else + movi a3, 0 /* Used to be init. */ + stw a3, (sp, 0) /* Used to be fini. */ + lrw a0, main + /* Let the libc call main and exit with its return code. */ + jsri __libc_start_main + + /* Should never get here. */ + jsri abort +#endif /* !SHARED */ + cfi_endproc + .size _start,.-_start + + + /* 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/lib/libc/glibc/sysdeps/csky/bits/endianness.h b/lib/libc/glibc/sysdeps/csky/bits/endianness.h new file mode 100644 index 0000000000..ad20cf64e0 --- /dev/null +++ b/lib/libc/glibc/sysdeps/csky/bits/endianness.h @@ -0,0 +1,14 @@ +#ifndef _BITS_ENDIANNESS_H +#define _BITS_ENDIANNESS_H 1 + +#ifndef _BITS_ENDIAN_H +# error "Never use directly; include instead." +#endif + +#ifdef __CSKYBE__ +# error "Big endian not supported for C-SKY." +#else +# define __BYTE_ORDER __LITTLE_ENDIAN +#endif + +#endif /* bits/endianness.h */