]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - arch/x86/cpu/start.S
x86: Clean up asm-offsets
[karo-tx-uboot.git] / arch / x86 / cpu / start.S
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/post.h>
17 #include <asm/processor.h>
18 #include <asm/processor-flags.h>
19 #include <generated/generic-asm-offsets.h>
20 #include <generated/asm-offsets.h>
21
22 .section .text
23 .code32
24 .globl _start
25 .type _start, @function
26 .globl _x86boot_start
27 _x86boot_start:
28         /*
29          * This is the fail safe 32-bit bootstrap entry point. The
30          * following code is not executed from a cold-reset (actually, a
31          * lot of it is, but from real-mode after cold reset. It is
32          * repeated here to put the board into a state as close to cold
33          * reset as necessary)
34          */
35         cli
36         cld
37
38         /* Turn off cache (this might require a 486-class CPU) */
39         movl    %cr0, %eax
40         orl     $(X86_CR0_NW | X86_CR0_CD), %eax
41         movl    %eax, %cr0
42         wbinvd
43
44         /* Tell 32-bit code it is being entered from an in-RAM copy */
45         movw    $GD_FLG_WARM_BOOT, %bx
46         jmp     1f
47 _start:
48         /*
49          * This is the 32-bit cold-reset entry point. Initialize %bx to 0
50          * in case we're preceeded by some sort of boot stub.
51          */
52         movw    $GD_FLG_COLD_BOOT, %bx
53 1:
54         /* Save BIST */
55         movl    %eax, %ebp
56
57         /* Load the segement registes to match the gdt loaded in start16.S */
58         movl    $(X86_GDT_ENTRY_32BIT_DS * X86_GDT_ENTRY_SIZE), %eax
59         movw    %ax, %fs
60         movw    %ax, %ds
61         movw    %ax, %gs
62         movw    %ax, %es
63         movw    %ax, %ss
64
65         /* Clear the interrupt vectors */
66         lidt    blank_idt_ptr
67
68         /* Early platform init (setup gpio, etc ) */
69         jmp     early_board_init
70 .globl early_board_init_ret
71 early_board_init_ret:
72         post_code(POST_START)
73
74         /* Initialise Cache-As-RAM */
75         jmp     car_init
76 .globl car_init_ret
77 car_init_ret:
78         /*
79          * We now have CONFIG_SYS_CAR_SIZE bytes of Cache-As-RAM (or SRAM,
80          * or fully initialised SDRAM - we really don't care which)
81          * starting at CONFIG_SYS_CAR_ADDR to be used as a temporary stack
82          * and early malloc area. The MRC requires some space at the top.
83          *
84          * Stack grows down from top of CAR. We have:
85          *
86          * top-> CONFIG_SYS_CAR_ADDR + CONFIG_SYS_CAR_SIZE
87          *      MRC area
88          *      global_data
89          *      x86 global descriptor table
90          *      early malloc area
91          *      stack
92          * bottom-> CONFIG_SYS_CAR_ADDR
93          */
94         movl    $(CONFIG_SYS_CAR_ADDR + CONFIG_SYS_CAR_SIZE - 4), %esp
95 #ifdef CONFIG_DCACHE_RAM_MRC_VAR_SIZE
96         subl    $CONFIG_DCACHE_RAM_MRC_VAR_SIZE, %esp
97 #endif
98
99         /* Reserve space on stack for global data */
100         subl    $GENERATED_GBL_DATA_SIZE, %esp
101
102         /* Align global data to 16-byte boundary */
103         andl    $0xfffffff0, %esp
104         post_code(POST_START_STACK)
105
106         /* Zero the global data since it won't happen later */
107         xorl    %eax, %eax
108         movl    $GENERATED_GBL_DATA_SIZE, %ecx
109         movl    %esp, %edi
110         rep     stosb
111
112         /* Setup first parameter to setup_gdt, pointer to global_data */
113         movl    %esp, %eax
114
115         /* Reserve space for global descriptor table */
116         subl    $X86_GDT_SIZE, %esp
117
118         /* Align temporary global descriptor table to 16-byte boundary */
119         andl    $0xfffffff0, %esp
120         movl    %esp, %ecx
121
122 #if defined(CONFIG_SYS_MALLOC_F_LEN)
123         subl    $CONFIG_SYS_MALLOC_F_LEN, %esp
124         movl    %eax, %edx
125         addl    $GD_MALLOC_BASE, %edx
126         movl    %esp, (%edx)
127 #endif
128         /* Store BIST */
129         movl    %eax, %edx
130         addl    $GD_BIST, %edx
131         movl    %ebp, (%edx)
132
133         /* Set second parameter to setup_gdt */
134         movl    %ecx, %edx
135
136         /* Setup global descriptor table so gd->xyz works */
137         call    setup_gdt
138
139         /* Set parameter to board_init_f() to boot flags */
140         post_code(POST_START_DONE)
141         xorl    %eax, %eax
142
143         /* Enter, U-boot! */
144         call    board_init_f
145
146         /* indicate (lack of) progress */
147         movw    $0x85, %ax
148         jmp     die
149
150 .globl board_init_f_r_trampoline
151 .type board_init_f_r_trampoline, @function
152 board_init_f_r_trampoline:
153         /*
154          * SDRAM has been initialised, U-Boot code has been copied into
155          * RAM, BSS has been cleared and relocation adjustments have been
156          * made. It is now time to jump into the in-RAM copy of U-Boot
157          *
158          * %eax = Address of top of new stack
159          */
160
161         /* Stack grows down from top of SDRAM */
162         movl    %eax, %esp
163
164         /* Reserve space on stack for global data */
165         subl    $GENERATED_GBL_DATA_SIZE, %esp
166
167         /* Align global data to 16-byte boundary */
168         andl    $0xfffffff0, %esp
169
170         /* Setup first parameter to memcpy (and setup_gdt) */
171         movl    %esp, %eax
172
173         /* Setup second parameter to memcpy */
174         fs movl 0, %edx
175
176         /* Set third parameter to memcpy */
177         movl    $GENERATED_GBL_DATA_SIZE, %ecx
178
179         /* Copy global data from CAR to SDRAM stack */
180         call    memcpy
181
182         /* Reserve space for global descriptor table */
183         subl    $X86_GDT_SIZE, %esp
184
185         /* Align global descriptor table to 16-byte boundary */
186         andl    $0xfffffff0, %esp
187
188         /* Set second parameter to setup_gdt */
189         movl    %esp, %edx
190
191         /* Setup global descriptor table so gd->xyz works */
192         call    setup_gdt
193
194         /* Re-enter U-Boot by calling board_init_f_r */
195         call    board_init_f_r
196
197 die:
198         hlt
199         jmp     die
200         hlt
201
202 blank_idt_ptr:
203         .word   0               /* limit */
204         .long   0               /* base */
205
206         .p2align        2       /* force 4-byte alignment */
207
208 multiboot_header:
209         /* magic */
210         .long   0x1BADB002
211         /* flags */
212         .long   (1 << 16)
213         /* checksum */
214         .long   -0x1BADB002 - (1 << 16)
215         /* header addr */
216         .long   multiboot_header - _x86boot_start + CONFIG_SYS_TEXT_BASE
217         /* load addr */
218         .long   CONFIG_SYS_TEXT_BASE
219         /* load end addr */
220         .long   0
221         /* bss end addr */
222         .long   0
223         /* entry addr */
224         .long   CONFIG_SYS_TEXT_BASE