]>
Commit | Line | Data |
---|---|---|
2262cfee | 1 | /* |
fea25720 | 2 | * U-boot - x86 Startup Code |
2262cfee | 3 | * |
dbf7115a GR |
4 | * (C) Copyright 2008-2011 |
5 | * Graeme Russ, <graeme.russ@gmail.com> | |
6 | * | |
7 | * (C) Copyright 2002 | |
fa82f871 | 8 | * Daniel Engström, Omicron Ceti AB, <daniel@omicron.se> |
2262cfee | 9 | * |
1a459660 | 10 | * SPDX-License-Identifier: GPL-2.0+ |
2262cfee WD |
11 | */ |
12 | ||
2262cfee WD |
13 | #include <config.h> |
14 | #include <version.h> | |
161b3589 | 15 | #include <asm/global_data.h> |
109ad143 | 16 | #include <asm/processor.h> |
0c24c9cc | 17 | #include <asm/processor-flags.h> |
9e6c572f | 18 | #include <generated/generic-asm-offsets.h> |
2262cfee | 19 | |
2262cfee WD |
20 | .section .text |
21 | .code32 | |
22 | .globl _start | |
8bde7f77 | 23 | .type _start, @function |
fea25720 GR |
24 | .globl _x86boot_start |
25 | _x86boot_start: | |
077e1958 GR |
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 | ||
2f0e0cd2 | 36 | /* Turn off cache (this might require a 486-class CPU) */ |
077e1958 | 37 | movl %cr0, %eax |
0c24c9cc | 38 | orl $(X86_CR0_NW | X86_CR0_CD), %eax |
077e1958 GR |
39 | movl %eax, %cr0 |
40 | wbinvd | |
41 | ||
91d82a29 GB |
42 | /* Tell 32-bit code it is being entered from an in-RAM copy */ |
43 | movw $GD_FLG_WARM_BOOT, %bx | |
44 | jmp 1f | |
8bde7f77 | 45 | _start: |
91d82a29 GB |
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 | |
51 | 1: | |
077e1958 | 52 | |
dbf7115a | 53 | /* Load the segement registes to match the gdt loaded in start16.S */ |
109ad143 | 54 | movl $(X86_GDT_ENTRY_32BIT_DS * X86_GDT_ENTRY_SIZE), %eax |
8ffb2e8f GR |
55 | movw %ax, %fs |
56 | movw %ax, %ds | |
57 | movw %ax, %gs | |
58 | movw %ax, %es | |
59 | movw %ax, %ss | |
8bde7f77 | 60 | |
16263087 | 61 | /* Clear the interrupt vectors */ |
077e1958 GR |
62 | lidt blank_idt_ptr |
63 | ||
2262cfee | 64 | /* Early platform init (setup gpio, etc ) */ |
2262cfee | 65 | jmp early_board_init |
88fa0a6e | 66 | .globl early_board_init_ret |
2262cfee | 67 | early_board_init_ret: |
8bde7f77 | 68 | |
ed4cba79 GR |
69 | /* Initialise Cache-As-RAM */ |
70 | jmp car_init | |
71 | .globl car_init_ret | |
72 | car_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 | */ | |
759598f8 | 78 | |
8d61625d GR |
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 | ||
8d61625d GR |
100 | /* Setup global descriptor table so gd->xyz works */ |
101 | call setup_gdt | |
9e6c572f | 102 | |
96cd6642 | 103 | /* Set parameter to board_init_f() to boot flags */ |
dbf7115a GR |
104 | xorl %eax, %eax |
105 | movw %bx, %ax | |
161b3589 | 106 | |
dbf7115a GR |
107 | /* Enter, U-boot! */ |
108 | call board_init_f | |
2262cfee WD |
109 | |
110 | /* indicate (lack of) progress */ | |
8bde7f77 | 111 | movw $0x85, %ax |
fb002908 GR |
112 | jmp die |
113 | ||
f48dd6fc GR |
114 | .globl board_init_f_r_trampoline |
115 | .type board_init_f_r_trampoline, @function | |
116 | board_init_f_r_trampoline: | |
fb002908 GR |
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 | * | |
f48dd6fc | 122 | * %eax = Address of top of new stack |
fb002908 GR |
123 | */ |
124 | ||
8d61625d | 125 | /* Stack grows down from top of SDRAM */ |
fb002908 GR |
126 | movl %eax, %esp |
127 | ||
8d61625d GR |
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 | ||
8d61625d GR |
155 | /* Setup global descriptor table so gd->xyz works */ |
156 | call setup_gdt | |
157 | ||
f48dd6fc GR |
158 | /* Re-enter U-Boot by calling board_init_f_r */ |
159 | call board_init_f_r | |
fb002908 | 160 | |
2f0e0cd2 GR |
161 | die: |
162 | hlt | |
2262cfee | 163 | jmp die |
8bde7f77 | 164 | hlt |
077e1958 GR |
165 | |
166 | blank_idt_ptr: | |
167 | .word 0 /* limit */ | |
168 | .long 0 /* base */ | |
a206cc23 GR |
169 | |
170 | .p2align 2 /* force 4-byte alignment */ | |
171 | ||
172 | multiboot_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 |