Loading...
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 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 | /* * U-boot - i386 Startup Code * * Copyright (c) 2002 Omicron Ceti AB, Daniel Engström <denaiel@omicron.se> * * See file CREDITS for list of people who contributed to this * project. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA */ #include <config.h> #include <version.h> .section .text .code32 .globl _start .type _start, @function .globl _i386boot_start _i386boot_start: _start: movl $0x18,%eax /* Load our segement registes, the * gdt have already been loaded by start16.S */ movw %ax,%fs movw %ax,%ds movw %ax,%gs movw %ax,%es movw %ax,%ss /* We call a few functions in the board support package * since we have no stack yet we'll have to use %ebp * to store the return address */ /* Early platform init (setup gpio, etc ) */ mov $early_board_init_ret, %ebp jmp early_board_init early_board_init_ret: /* The __port80 entry-point should be usabe by now */ /* so we try to indicate progress */ movw $0x01, %ax movl $.progress0, %ebp jmp __show_boot_progress .progress0: /* size memory */ mov $mem_init_ret, %ebp jmp mem_init mem_init_ret: /* check ammount of configured memory * (we need atleast bss start+bss size+stack size) */ movl $_i386boot_bss_start, %ecx /* BSS start */ addl $_i386boot_bss_size, %ecx /* BSS size */ addl $CFG_STACK_SIZE, %ecx cmpl %ecx, %eax jae mem_ok /* indicate (lack of) progress */ movw $0x81, %ax movl $.progress0a, %ebp jmp __show_boot_progress .progress0a: jmp die mem_ok: /* indicate progress */ movw $0x02, %ax movl $.progress1, %ebp jmp __show_boot_progress .progress1: /* create a stack after the bss */ movl $_i386boot_bss_start, %eax addl $_i386boot_bss_size, %eax addl $CFG_STACK_SIZE, %eax movl %eax, %esp pushl $0 popl %eax cmpl $0, %eax jne no_stack push $0x55aa55aa popl %ebx cmpl $0x55aa55aa, %ebx je stack_ok no_stack: /* indicate (lack of) progress */ movw $0x82, %ax movl $.progress1a, %ebp jmp __show_boot_progress .progress1a: jmp die stack_ok: /* indicate progress */ movw $0x03, %ax movl $.progress2, %ebp jmp __show_boot_progress .progress2: /* copy data section to ram, size must be 4-byte aligned */ movl $_i386boot_romdata_dest, %edi /* destination address */ movl $_i386boot_romdata_start, %esi /* source address */ movl $_i386boot_romdata_size, %ecx /* number of bytes to copy */ movl %ecx, %eax andl $3, %eax jnz data_fail shrl $2, %ecx /* copy 4 byte each time */ cld cmpl $0, %ecx je data_ok data_segment: movsl loop data_segment jmp data_ok data_fail: /* indicate (lack of) progress */ movw $0x83, %ax movl $.progress2a, %ebp jmp __show_boot_progress .progress2a: jmp die data_ok: /* indicate progress */ movw $0x04, %ax movl $.progress3, %ebp jmp __show_boot_progress .progress3: /* clear bss section in ram, size must be 4-byte aligned */ movl $_i386boot_bss_start, %edi /* MK_CHG BSS start */ movl $_i386boot_bss_size, %ecx /* BSS size */ movl %ecx, %eax andl $3, %eax jnz bss_fail shrl $2, %ecx /* clear 4 byte each time */ cld cmpl $0, %ecx je bss_ok bss: movl $0, (%edi) add $4, %edi loop bss jmp bss_ok bss_fail: /* indicate (lack of) progress */ movw $0x84, %ax movl $.progress3a, %ebp jmp __show_boot_progress .progress3a: jmp die bss_ok: wbinvd /* indicate progress */ movw $0x05, %ax movl $.progress4, %ebp jmp __show_boot_progress .progress4: call start_i386boot /* Enter, U-boot! */ /* indicate (lack of) progress */ movw $0x85, %ax movl $.progress4a, %ebp jmp __show_boot_progress .progress4a: die: hlt jmp die hlt |