summaryrefslogtreecommitdiff
path: root/examples/api/crt0.S
blob: 6899ebf8ac2fae63bb0e89aeb743e2e6340e61d7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/* SPDX-License-Identifier: GPL-2.0+ */
/*
 * (C) Copyright 2007 Semihalf
 *
 * Written by: Rafal Jaworowski <raj@semihalf.com>
 */

#if defined(CONFIG_PPC)

	.text
	.globl _start
_start:
	lis	%r11, search_hint@ha
	addi	%r11, %r11, search_hint@l
	stw	%r1, 0(%r11)
	b	main


	.globl syscall
syscall:
	lis	%r11, syscall_ptr@ha
	addi	%r11, %r11, syscall_ptr@l
	lwz	%r11, 0(%r11)
	mtctr	%r11
	bctr

#elif defined(CONFIG_ARM) && !defined(CONFIG_ARM64)

	.text
	.globl _start
_start:
	ldr	r4, =search_hint
	mov	r5, sp
	str	r5, [r4]
	b	main


	.globl syscall
syscall:
	ldr	r4, =syscall_ptr
	ldr	r4, [r4]
	bx	r4

#elif defined(CONFIG_ARM64)

	.text
	.globl _start
_start:
	ldr	x17, =search_hint
	mov	x16, sp
	str	x16, [x17]
	b	main

	.globl syscall
syscall:
	ldr	x16, =syscall_ptr
	ldr	x16, [x16]
	br	x16

#elif defined(CONFIG_MIPS)
#include <asm/asm.h>
	.text
	.globl __start
	.ent __start
__start:
	PTR_S	$sp, search_hint
	b	main
	.end __start

	.globl syscall
	.ent syscall
syscall:
	PTR_S	$ra, return_addr
	PTR_L	$t9, syscall_ptr
	jalr	$t9
	nop
	PTR_L	$ra, return_addr
	jr	$ra
	nop
	.end syscall

return_addr:
	.align 8
	.long 0
#elif defined(CONFIG_ARCH_RV32I)

	.text
	.globl _start
_start:
	la	t0, search_hint
	sw	sp, 0(t0)
	la	t0, main
	jalr	x0, t0

	.globl syscall
syscall:
	la	t0, syscall_ptr
	lw	t0, 0(t0)
	jalr	x0, t0

#elif defined(CONFIG_ARCH_RV64I)

	.text
	.globl _start
_start:
	la	t0, search_hint
	sd	sp, 0(t0)
	la	t0, main
	jalr	x0, t0

	.globl syscall
syscall:
	la	t0, syscall_ptr
	ld	t0, 0(t0)
	jalr	x0, t0

#else
#error No support for this arch!
#endif

.section .data

	.globl syscall_ptr
syscall_ptr:
	.align	8
	.long	0

	.globl search_hint
search_hint:
	.long	0