mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-09-09 22:33:28 +09:00
![Graeme Russ](/assets/img/avatar_default.png)
Add a parameter to the 32-bit entry to indicate if entry is from Real Mode or not. If entry is from Real Mode, execute the destructive 'sizer' routine to determine memory size as we are booting cold and running in Flash. If not entering from Real Mode, we are executing a U-Boot image from RAM and therefore the memory size is already known (and running 'sizer' will destroy the running image) There are now two 32-bit entry points. The first is the 'in RAM' entry point which exists at the start of the U-Boot binary image. As such, you can load u-boot.bin in RAM and jump directly to the load address without needing to calculate any offsets. The second entry point is used by the real-to-protected mode switch This patch also changes TEXT_BASE to 0x6000000 (in RAM). You can load the resulting image at 0x6000000 and simple go 0x6000000 from the u-boot prompt Hopefully a later patch will completely elliminate any dependency on TEXT_BASE like a relocatable linux kernel (perfect world) Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
177 lines
3.9 KiB
ArmAsm
177 lines
3.9 KiB
ArmAsm
/*
|
|
* 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:
|
|
/*
|
|
* This is the fail safe 32-bit bootstrap entry point. The
|
|
* following code is not executed from a cold-reset (actually, a
|
|
* lot of it is, but from real-mode after cold reset. It is
|
|
* repeated here to put the board into a state as close to cold
|
|
* reset as necessary)
|
|
*/
|
|
cli
|
|
cld
|
|
|
|
/* Turn of cache (this might require a 486-class CPU) */
|
|
movl %cr0, %eax
|
|
orl $0x60000000,%eax
|
|
movl %eax, %cr0
|
|
wbinvd
|
|
|
|
/* Tell 32-bit code it is being entered from an in-RAM copy */
|
|
movw $0x0000, %bx
|
|
_start:
|
|
/* This is the 32-bit cold-reset entry point */
|
|
|
|
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
|
|
|
|
/* Clear the interupt vectors */
|
|
lidt blank_idt_ptr
|
|
|
|
/*
|
|
* Skip low-level board and memory initialization if not starting
|
|
* from cold-reset. This allows us to do a fail safe boot-strap
|
|
* into a new build of U-Boot from a known-good boot flash
|
|
*/
|
|
movw $0x0001, %ax
|
|
cmpw %ax, %bx
|
|
jne mem_init_ret
|
|
|
|
/* 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_asm
|
|
.progress0:
|
|
|
|
/* size memory */
|
|
mov $mem_init_ret, %ebp
|
|
jmp mem_init
|
|
mem_init_ret:
|
|
|
|
/* fetch memory size (into %eax) */
|
|
mov $get_mem_size_ret, %ebp
|
|
jmp get_mem_size
|
|
get_mem_size_ret:
|
|
|
|
/* Check we have enough memory for stack */
|
|
movl $CONFIG_SYS_STACK_SIZE, %ecx
|
|
cmpl %ecx, %eax
|
|
jae mem_ok
|
|
|
|
/* indicate (lack of) progress */
|
|
movw $0x81, %ax
|
|
movl $.progress0a, %ebp
|
|
jmp show_boot_progress_asm
|
|
.progress0a:
|
|
jmp die
|
|
mem_ok:
|
|
/* Set stack pointer to upper memory limit*/
|
|
movl %eax, %esp
|
|
|
|
/* indicate progress */
|
|
movw $0x02, %ax
|
|
movl $.progress1, %ebp
|
|
jmp show_boot_progress_asm
|
|
.progress1:
|
|
|
|
/* Test the stack */
|
|
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_asm
|
|
.progress1a:
|
|
jmp die
|
|
|
|
|
|
stack_ok:
|
|
/* indicate progress */
|
|
movw $0x03, %ax
|
|
movl $.progress2, %ebp
|
|
jmp show_boot_progress_asm
|
|
.progress2:
|
|
|
|
wbinvd
|
|
|
|
/* Get upper memory limit */
|
|
movl %esp, %ecx
|
|
subl $CONFIG_SYS_STACK_SIZE, %ecx
|
|
|
|
/* Create a Stack Frame */
|
|
pushl %ebp
|
|
movl %esp, %ebp
|
|
|
|
/* stack_limit parameter */
|
|
pushl %ecx
|
|
call board_init_f /* Enter, U-boot! */
|
|
|
|
/* indicate (lack of) progress */
|
|
movw $0x85, %ax
|
|
movl $.progress4a, %ebp
|
|
jmp show_boot_progress_asm
|
|
.progress4a:
|
|
|
|
die: hlt
|
|
jmp die
|
|
hlt
|
|
|
|
blank_idt_ptr:
|
|
.word 0 /* limit */
|
|
.long 0 /* base */
|