1/* 2 * U-boot - x86 Startup Code 3 * 4 * (C) Copyright 2008-2011 5 * Graeme Russ, <graeme.russ@gmail.com> 6 * 7 * (C) Copyright 2002 8 * Daniel Engström, Omicron Ceti AB, <daniel@omicron.se> 9 * 10 * SPDX-License-Identifier: GPL-2.0+ 11 */ 12 13#include <config.h> 14#include <version.h> 15#include <asm/global_data.h> 16#include <asm/processor.h> 17#include <asm/processor-flags.h> 18#include <generated/generic-asm-offsets.h> 19 20.section .text 21.code32 22.globl _start 23.type _start, @function 24.globl _x86boot_start 25_x86boot_start: 26 /* 27 * This is the fail safe 32-bit bootstrap entry point. The 28 * following code is not executed from a cold-reset (actually, a 29 * lot of it is, but from real-mode after cold reset. It is 30 * repeated here to put the board into a state as close to cold 31 * reset as necessary) 32 */ 33 cli 34 cld 35 36 /* Turn off cache (this might require a 486-class CPU) */ 37 movl %cr0, %eax 38 orl $(X86_CR0_NW | X86_CR0_CD), %eax 39 movl %eax, %cr0 40 wbinvd 41 42 /* Tell 32-bit code it is being entered from an in-RAM copy */ 43 movw $GD_FLG_WARM_BOOT, %bx 44 jmp 1f 45_start: 46 /* 47 * This is the 32-bit cold-reset entry point. Initialize %bx to 0 48 * in case we're preceeded by some sort of boot stub. 49 */ 50 movw $GD_FLG_COLD_BOOT, %bx 511: 52 53 /* Load the segement registes to match the gdt loaded in start16.S */ 54 movl $(X86_GDT_ENTRY_32BIT_DS * X86_GDT_ENTRY_SIZE), %eax 55 movw %ax, %fs 56 movw %ax, %ds 57 movw %ax, %gs 58 movw %ax, %es 59 movw %ax, %ss 60 61 /* Clear the interrupt vectors */ 62 lidt blank_idt_ptr 63 64 /* Early platform init (setup gpio, etc ) */ 65 jmp early_board_init 66.globl early_board_init_ret 67early_board_init_ret: 68 69 /* Initialise Cache-As-RAM */ 70 jmp car_init 71.globl car_init_ret 72car_init_ret: 73 /* 74 * We now have CONFIG_SYS_CAR_SIZE bytes of Cache-As-RAM (or SRAM, 75 * or fully initialised SDRAM - we really don't care which) 76 * starting at CONFIG_SYS_CAR_ADDR to be used as a temporary stack 77 */ 78 79 /* Stack grows down from top of CAR */ 80 movl $(CONFIG_SYS_CAR_ADDR + CONFIG_SYS_CAR_SIZE), %esp 81 82 /* Reserve space on stack for global data */ 83 subl $GENERATED_GBL_DATA_SIZE, %esp 84 85 /* Align global data to 16-byte boundary */ 86 andl $0xfffffff0, %esp 87 88 /* Setup first parameter to setup_gdt */ 89 movl %esp, %eax 90 91 /* Reserve space for global descriptor table */ 92 subl $X86_GDT_SIZE, %esp 93 94 /* Align temporary global descriptor table to 16-byte boundary */ 95 andl $0xfffffff0, %esp 96 97 /* Set second parameter to setup_gdt */ 98 movl %esp, %edx 99 100 /* Setup global descriptor table so gd->xyz works */ 101 call setup_gdt 102 103 /* Set parameter to board_init_f() to boot flags */ 104 xorl %eax, %eax 105 movw %bx, %ax 106 107 /* Enter, U-boot! */ 108 call board_init_f 109 110 /* indicate (lack of) progress */ 111 movw $0x85, %ax 112 jmp die 113 114.globl board_init_f_r_trampoline 115.type board_init_f_r_trampoline, @function 116board_init_f_r_trampoline: 117 /* 118 * SDRAM has been initialised, U-Boot code has been copied into 119 * RAM, BSS has been cleared and relocation adjustments have been 120 * made. It is now time to jump into the in-RAM copy of U-Boot 121 * 122 * %eax = Address of top of new stack 123 */ 124 125 /* Stack grows down from top of SDRAM */ 126 movl %eax, %esp 127 128 /* Reserve space on stack for global data */ 129 subl $GENERATED_GBL_DATA_SIZE, %esp 130 131 /* Align global data to 16-byte boundary */ 132 andl $0xfffffff0, %esp 133 134 /* Setup first parameter to memcpy (and setup_gdt) */ 135 movl %esp, %eax 136 137 /* Setup second parameter to memcpy */ 138 fs movl 0, %edx 139 140 /* Set third parameter to memcpy */ 141 movl $GENERATED_GBL_DATA_SIZE, %ecx 142 143 /* Copy global data from CAR to SDRAM stack */ 144 call memcpy 145 146 /* Reserve space for global descriptor table */ 147 subl $X86_GDT_SIZE, %esp 148 149 /* Align global descriptor table to 16-byte boundary */ 150 andl $0xfffffff0, %esp 151 152 /* Set second parameter to setup_gdt */ 153 movl %esp, %edx 154 155 /* Setup global descriptor table so gd->xyz works */ 156 call setup_gdt 157 158 /* Re-enter U-Boot by calling board_init_f_r */ 159 call board_init_f_r 160 161die: 162 hlt 163 jmp die 164 hlt 165 166blank_idt_ptr: 167 .word 0 /* limit */ 168 .long 0 /* base */ 169 170 .p2align 2 /* force 4-byte alignment */ 171 172multiboot_header: 173 /* magic */ 174 .long 0x1BADB002 175 /* flags */ 176 .long (1 << 16) 177 /* checksum */ 178 .long -0x1BADB002 - (1 << 16) 179 /* header addr */ 180 .long multiboot_header - _x86boot_start + CONFIG_SYS_TEXT_BASE 181 /* load addr */ 182 .long CONFIG_SYS_TEXT_BASE 183 /* load end addr */ 184 .long 0 185 /* bss end addr */ 186 .long 0 187 /* entry addr */ 188 .long CONFIG_SYS_TEXT_BASE 189