1#   Copyright (C) 2001-2021 Free Software Foundation, Inc.
2#   Written By Nick Clifton
3#
4# This file is free software; you can redistribute it and/or modify it
5# under the terms of the GNU General Public License as published by the
6# Free Software Foundation; either version 3, or (at your option) any
7# later version.
8#
9# This file is distributed in the hope that it will be useful, but
10# WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12# General Public License for more details.
13#
14# Under Section 7 of GPL version 3, you are granted additional
15# permissions described in the GCC Runtime Library Exception, version
16# 3.1, as published by the Free Software Foundation.
17#
18# You should have received a copy of the GNU General Public License and
19# a copy of the GCC Runtime Library Exception along with this program;
20# see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
21# <http://www.gnu.org/licenses/>.
22
23/* An executable stack is *not* required for these functions.  */
24#if defined(__ELF__) && defined(__linux__)
25.section .note.GNU-stack,"",%progbits
26.previous
27#endif
28
29# This file just make a stack frame for the contents of the .fini and
30# .init sections.  Users may put any desired instructions in those
31# sections.
32
33#ifdef __ELF__
34#define TYPE(x) .type x,function
35#else
36#define TYPE(x)
37#endif
38#ifdef __ARM_EABI__
39/* Some attributes that are common to all routines in this file.  */
40	/* Tag_ABI_align_needed: This code does not require 8-byte
41	   alignment from the caller.  */
42	/* .eabi_attribute 24, 0  -- default setting.  */
43	/* Tag_ABI_align_preserved: This code preserves 8-byte
44	   alignment in any callee.  */
45	.eabi_attribute 25, 1
46#endif /* __ARM_EABI__ */
47
48	# Note - this macro is complemented by the FUNC_END macro
49	# in crtn.S.  If you change this macro you must also change
50	# that macro match.
51.macro FUNC_START
52#ifdef __thumb__
53	.thumb
54
55	push	{r3, r4, r5, r6, r7, lr}
56#else
57	.arm
58	#  Create a stack frame and save any call-preserved registers
59	mov	ip, sp
60	stmdb	sp!, {r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, lr, pc}
61	sub	fp, ip, #4
62#endif
63.endm
64
65	.section	".init"
66	.align 2
67	.global	_init
68#ifdef __thumb__
69	.thumb_func
70#endif
71	TYPE(_init)
72_init:
73	FUNC_START
74
75
76	.section	".fini"
77	.align	2
78	.global	_fini
79#ifdef __thumb__
80	.thumb_func
81#endif
82	TYPE(_fini)
83_fini:
84	FUNC_START
85
86# end of crti.S
87