~pmdj/ubuntu/trusty/qemu/2.9+applesmc+fadtv3

« back to all changes in this revision

Viewing changes to roms/u-boot/arch/x86/cpu/start.S

  • Committer: Phil Dennis-Jordan
  • Date: 2017-07-21 08:03:43 UTC
  • mfrom: (1.1.1)
  • Revision ID: phil@philjordan.eu-20170721080343-2yr2vdj7713czahv
New upstream release 2.9.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 
51
1:
 
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
 
67
early_board_init_ret:
 
68
 
 
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
         */
 
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
 
116
board_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
 
 
161
die:
 
162
        hlt
 
163
        jmp     die
 
164
        hlt
 
165
 
 
166
blank_idt_ptr:
 
167
        .word   0               /* limit */
 
168
        .long   0               /* base */
 
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