summaryrefslogtreecommitdiff
path: root/riscv/trunk/rtl/linux/riscv32/gprt0.as
blob: d7d6337e55a876b6f31ddf2726e868a18a6e629c (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
/*
   Start-up code for Free Pascal Compiler when linking with C library
   with profiling support.

   Written by Edmund Grimley Evans in 2015 and released into the public domain.
*/

	.text
	.align 2

	.globl _start
	.type  _start,#function
_start:
	/* Initialise FP to zero */
	mov	x29,#0

	/* This is rtld_fini */
	mov	x5,x0

	/* Get argc, argv, envp */
	ldr	x1,[sp]
	add	x2,sp,#8
	add	x11,x1,#1
	add	x11,x2,x11,lsl #3

	/* Save argc, argv, envp, and initial stack pointer */
	adrp	x10,:got:operatingsystem_parameter_argc
	ldr	x10,[x10,#:got_lo12:operatingsystem_parameter_argc]
	str	x1,[x10]
	adrp	x10,:got:operatingsystem_parameter_argv
	ldr	x10,[x10,#:got_lo12:operatingsystem_parameter_argv]
	str	x2,[x10]
	adrp	x10,:got:operatingsystem_parameter_envp
	ldr	x10,[x10,#:got_lo12:operatingsystem_parameter_envp]
	str	x11,[x10]
	adrp	x10,:got:__stkptr
	ldr	x10,[x10,#:got_lo12:__stkptr]
	mov	x6,sp
	str	x6,[x10]

	/* __libc_start_main(main, argc, argv,
	                     init, fini, rtld_fini, stack_end) */
	adrp	x0,:got:main_stub
	ldr	x0,[x0,#:got_lo12:main_stub]
	adrp	x3,:got:_init_dummy
	ldr	x3,[x3,#:got_lo12:_init_dummy]
	adrp	x4,:got:_fini_dummy
	ldr	x4,[x4,#:got_lo12:_fini_dummy]
	bl	__libc_start_main

	/* This should never happen */
	b	abort

	.globl	_init_dummy
	.type	_init_dummy,#function
_init_dummy:
	ret

	.globl	_fini_dummy
	.type	_fini_dummy,#function
_fini_dummy:
	ret

	.globl	main_stub
	.type	main_stub,#function
main_stub:
	stp	x29,x30,[sp,#-16]!

	/* Save initial stackpointer */
	mov	x0,sp
	adrp	x1,:got:__stkptr
	ldr	x1,[x1,#:got_lo12:__stkptr]
	str	x0,[x1]

	/* Initialize gmon */
	adrp	x0,:got:_start
	ldr	x0,[x0,#:got_lo12:_start]
	adrp	x1,:got:_etext
	ldr	x1,[x1,#:got_lo12:_etext]
	bl	__monstartup
	adrp	x0,:got:_mcleanup
	ldr	x0,[x0,#:got_lo12:_mcleanup]
	bl	atexit

	/* Start the program */
	bl	 PASCALMAIN
	b	 abort

	.globl	_haltproc
	.type	_haltproc,#function
_haltproc:
	/* Return to libc */
	adrp	x1,:got:__stkptr
	ldr	x1,[x1,#:got_lo12:__stkptr]
	ldr	x1,[x1]
	mov	sp,x1
	ldp	x29,x30,[sp],#16
	ret

	/* Define a symbol for the first piece of initialized data. */
	.data
	.align 3
	.globl __data_start
__data_start:
	.long 0
	.weak data_start
	data_start = __data_start

	.bss
	.align 3

	.comm __stkptr,8

	.comm operatingsystem_parameter_envp,8
	.comm operatingsystem_parameter_argc,8
	.comm operatingsystem_parameter_argv,8

	.section .note.GNU-stack,"",%progbits