NanoPayload

Annotated stage2/head2.S

194:aac340efb570
2016-05-14 Paul Boddie Introduced memory layout headers and consolidated memory-related definitions. Made the linker scripts more consistent.
paul@8 1
/*
paul@63 2
 * Initialisation code for the stage 2 payload.
paul@63 3
 *
paul@63 4
 * Copyright 2009 (C) Qi Hardware Inc.
paul@63 5
 * Author: Wolfgang Spraul <wolfgang@sharism.cc>
paul@63 6
 *
paul@87 7
 * Copyright (C) 2015, 2016 Paul Boddie <paul@boddie.org.uk>
paul@8 8
 *
paul@63 9
 * This program is free software: you can redistribute it and/or modify
paul@63 10
 * it under the terms of the GNU General Public License as published by
paul@63 11
 * the Free Software Foundation, either version 3 of the License, or
paul@63 12
 * (at your option) any later version.
paul@63 13
 *
paul@63 14
 * This program is distributed in the hope that it will be useful,
paul@63 15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
paul@63 16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
paul@63 17
 * GNU General Public License for more details.
paul@63 18
 *
paul@63 19
 * You should have received a copy of the GNU General Public License
paul@63 20
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
paul@8 21
 */
paul@8 22
paul@194 23
#include "memory.h"
paul@184 24
#include "mips.h"
paul@73 25
#include "sdram.h"
paul@73 26
paul@68 27
.text
paul@68 28
.extern c_main
paul@141 29
.extern _tlb_entry
paul@141 30
.extern _exc_entry
paul@68 31
.extern _irq_entry
paul@68 32
.extern _end_entries
paul@128 33
.extern _got_start
paul@128 34
.extern _got_end
paul@128 35
.extern _got_copy_start
paul@68 36
.globl _start
paul@68 37
.set noreorder
paul@68 38
paul@8 39
_start:
paul@167 40
	b real_start
paul@87 41
	nop
paul@87 42
paul@87 43
	/* Apparently reserved region which, if used, breaks the USB Boot process. */
paul@87 44
paul@167 45
	.word 0
paul@167 46
	.word 0
paul@167 47
	.word 0
paul@167 48
	.word 0
paul@167 49
	.word 0
paul@167 50
	.word 0
paul@167 51
	.word 0
paul@167 52
	.word 0
paul@87 53
paul@87 54
real_start:     
paul@193 55
	/* Initialise the default kernel stack. */
paul@68 56
paul@194 57
	la $sp, STAGE2_INIT_STACK
paul@68 58
paul@69 59
	/* Initialise the globals pointer. */
paul@69 60
paul@69 61
	lui $gp, %hi(_GLOBAL_OFFSET_TABLE_)
paul@69 62
	ori $gp, $gp, %lo(_GLOBAL_OFFSET_TABLE_)
paul@69 63
paul@75 64
	move $k0, $ra
paul@75 65
paul@114 66
	/* Copy TLB handling instructions. */
paul@114 67
paul@114 68
	la $t0, _tlb_entry		/* start */
paul@114 69
	li $t1, 0x80000000
paul@141 70
	la $t2, _exc_entry		/* end */
paul@141 71
	jal _copy
paul@141 72
	nop
paul@141 73
paul@141 74
	/* Copy exception handling instructions. */
paul@141 75
paul@141 76
	la $t0, _exc_entry		/* start */
paul@141 77
	li $t1, 0x80000180
paul@114 78
	la $t2, _irq_entry		/* end */
paul@114 79
	jal _copy
paul@114 80
	nop
paul@114 81
paul@68 82
	/* Copy IRQ handling instructions. */
paul@8 83
paul@86 84
	la $t0, _irq_entry		/* start */
paul@68 85
	li $t1, 0x80000200
paul@69 86
	la $t2, _end_entries		/* end */
paul@75 87
	jal _copy
paul@75 88
	nop
paul@75 89
paul@128 90
	/* Copy the offset table for user mode programs. */
paul@128 91
paul@128 92
	la $t0, _got_start		/* start */
paul@128 93
	la $t1, _got_copy_start
paul@128 94
	la $t2, _got_end		/* end */
paul@128 95
	li $t3, 0x80000000		/* adjustment */
paul@128 96
	jal _copy_adjust
paul@128 97
	nop
paul@128 98
paul@75 99
	move $ra, $k0
paul@68 100
paul@73 101
	/* Enable caching. */
paul@68 102
paul@73 103
	li $t0, CONFIG_CM_CACHABLE_NONCOHERENT
paul@184 104
	mtc0 $t0, CP0_CONFIG
paul@68 105
	nop
paul@68 106
paul@68 107
	/* Start the program. */
paul@68 108
paul@122 109
	la $t9, c_main			/* load the address of the routine */
paul@68 110
	j c_main
paul@68 111
	nop
paul@68 112
paul@75 113
_copy:
paul@75 114
	/* Copy via $t3 the region from $t0 to $t2 into $t1. */
paul@75 115
paul@75 116
	lw $t3, 0($t0)
paul@75 117
	addiu $t0, $t0, 4
paul@75 118
	sw $t3, 0($t1)
paul@75 119
	bne $t0, $t2, _copy
paul@75 120
	addiu $t1, $t1, 4		/* executed in delay slot before branch */
paul@159 121
	jr $ra
paul@75 122
	nop
paul@75 123
paul@128 124
_copy_adjust:
paul@128 125
	/* Copy via $t4 the region from $t0 to $t2 into $t1, adjusting by $t3. */
paul@128 126
paul@128 127
	lw $t4, 0($t0)
paul@128 128
	addiu $t0, $t0, 4
paul@128 129
	subu $t4, $t4, $t3
paul@128 130
	sw $t4, 0($t1)
paul@128 131
	bne $t0, $t2, _copy_adjust
paul@128 132
	addiu $t1, $t1, 4		/* executed in delay slot before branch */
paul@159 133
	jr $ra
paul@128 134
	nop
paul@128 135
paul@68 136
.set reorder