1 /* SPDX-License-Identifier: GPL-2.0+ */
3 * U-Boot - x86 Startup Code
5 * (C) Copyright 2008-2011
6 * Graeme Russ, <graeme.russ@gmail.com>
8 * (C) Copyright 2002,2003
9 * Daniel Engström, Omicron Ceti AB, <daniel@omicron.se>
12 #include <asm/global_data.h>
13 #include <asm/processor-flags.h>
15 #define BOOT_SEG 0xffff0000 /* linear segment of boot code */
16 #define a32 .byte 0x67;
17 #define o32 .byte 0x66;
19 .section .start16, "ax"
27 movl %eax, %cr3 /* Invalidate TLB */
29 /* Turn off cache (this might require a 486-class CPU) */
31 orl $(X86_CR0_NW | X86_CR0_CD), %eax
35 /* load the temporary Global Descriptor Table */
39 /* Now, we enter protected mode */
44 /* Flush the prefetch queue */
48 /* Finally restore BIST and jump to the 32-bit initialization code */
49 movw $code32start, %ax
54 /* 48-bit far pointer */
56 .long _start /* offset */
57 .word 0x10 /* segment */
64 * The following Global Descriptor Table is just enough to get us into
65 * 'Flat Protected Mode' - It will be discarded as soon as the final
66 * GDT is setup in a safe location in RAM
69 .word 0x1f /* limit (31 bytes = 4 GDT entries - 1) */
70 .long BOOT_SEG + gdt_rom /* base */
72 /* Some CPUs are picky about GDT alignment... */
83 * 0x18 32bit data/stack
85 /* The NULL Desciptor - Mandatory */
86 .word 0x0000 /* limit_low */
87 .word 0x0000 /* base_low */
88 .byte 0x00 /* base_middle */
89 .byte 0x00 /* access */
90 .byte 0x00 /* flags + limit_high */
91 .byte 0x00 /* base_high */
93 /* Unused Desciptor - (matches Linux) */
94 .word 0x0000 /* limit_low */
95 .word 0x0000 /* base_low */
96 .byte 0x00 /* base_middle */
97 .byte 0x00 /* access */
98 .byte 0x00 /* flags + limit_high */
99 .byte 0x00 /* base_high */
102 * The Code Segment Descriptor:
103 * - Base = 0x00000000
105 * - Access = Present, Ring 0, Exec (Code), Readable
106 * - Flags = 4kB Granularity, 32-bit
108 .word 0xffff /* limit_low */
109 .word 0x0000 /* base_low */
110 .byte 0x00 /* base_middle */
111 .byte 0x9b /* access */
112 .byte 0xcf /* flags + limit_high */
113 .byte 0x00 /* base_high */
116 * The Data Segment Descriptor:
117 * - Base = 0x00000000
119 * - Access = Present, Ring 0, Non-Exec (Data), Writable
120 * - Flags = 4kB Granularity, 32-bit
122 .word 0xffff /* limit_low */
123 .word 0x0000 /* base_low */
124 .byte 0x00 /* base_middle */
125 .byte 0x93 /* access */
126 .byte 0xcf /* flags + limit_high */
127 .byte 0x00 /* base_high */