Newer
Older
uwuboot / source / arm9 / start.s
#include "mem_map.h"
#include "version.h"

.arm
.arch armv5te
.fpu softvfp

.global _start
.global clearMem
.global _init
.global firmLaunchEntry9
.global firmLaunchEntry11

.type _start STT_FUNC
.type clearMem STT_FUNC
.type _init STT_FUNC

.extern setupSystem
.extern __libc_init_array
.extern main
.extern firm_launch
.extern __bss_start__
.extern __bss_end__
.extern fake_heap_start
.extern fake_heap_end

.section ".crt0"



_start:
	b skip_pool

	.string "3DS BOOTLOADER "
	.word   BOOTLOADER_VERSION
	.word   0                   @ Flags
firmLaunchEntry9:
	.word   0                   @ Entrypoint override field
firmLaunchEntry11:
	.word   0

skip_pool:
	msr cpsr_c, #0xDF           @ Disable all interrupts, system mode
	bl setupSystem

	@ Set sp
	ldr sp, =A9_STUB_ENTRY

	@ Clear bss section
	ldr r0, =__bss_start__
	ldr r1, =__bss_end__
	bl clearMem

	@ Setup newlib heap
	ldr r0, =A9_HEAP_START
	ldr r1, =fake_heap_start
	str r0, [r1]
	add r0, r0, #(A9_HEAP_END - A9_HEAP_START)
	ldr r1, =fake_heap_end
	str r0, [r1]

	blx __libc_init_array       @ Initialize ctors and dtors
	blx main
	cmp r0, #0
	beq firm_launch
	b .


@ void clearMem(u32 *start, u32 *end)
clearMem:
	sub r1, r1, r0
	mov r2, #0
	loop_clear:
		str r2, [r0], #4
		subs r1, r1, #4
		bne loop_clear
	bx lr


@ needed by libc
_init:
	bx lr