]> git.proxmox.com Git - mirror_edk2.git/blob - OvmfPkg/ResetVector/Ia16/16RealTo32Flat.asm
Adding files from OvmfPkg to common location. This is so multiple packages can use...
[mirror_edk2.git] / OvmfPkg / ResetVector / Ia16 / 16RealTo32Flat.asm
1 ;------------------------------------------------------------------------------
2 ; @file
3 ; Transition from 16 bit real mode into 32 bit flat protected mode
4 ;
5 ; Copyright (c) 2008 - 2010, Intel Corporation
6 ; All rights reserved. This program and the accompanying materials
7 ; are licensed and made available under the terms and conditions of the BSD License
8 ; which accompanies this distribution. The full text of the license may be found at
9 ; http://opensource.org/licenses/bsd-license.php
10 ;
11 ; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 ; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 ;
14 ;------------------------------------------------------------------------------
15
16 %define SEC_DEFAULT_CR0 0x40000023
17 %define SEC_DEFAULT_CR4 0x640
18
19 BITS 16
20
21 ;
22 ; Modified: EAX, EBX
23 ;
24 TransitionFromReal16To32BitFlat:
25
26 debugShowPostCode POSTCODE_16BIT_MODE
27
28 cli
29
30 mov bx, 0xf000
31 mov ds, bx
32
33 mov bx, ADDR16_OF(gdtr)
34
35 o32 lgdt [cs:bx]
36
37 mov eax, SEC_DEFAULT_CR0
38 mov cr0, eax
39
40 jmp LINEAR_CODE_SEL:dword ADDR_OF(jumpTo32BitAndLandHere)
41 BITS 32
42 jumpTo32BitAndLandHere:
43
44 mov eax, SEC_DEFAULT_CR4
45 mov cr4, eax
46
47 debugShowPostCode POSTCODE_32BIT_MODE
48
49 mov ax, LINEAR_SEL
50 mov ds, ax
51 mov es, ax
52 mov fs, ax
53 mov gs, ax
54 mov ss, ax
55
56 OneTimeCallRet TransitionFromReal16To32BitFlat
57
58 ALIGN 2
59
60 gdtr:
61 dw GDT_END - GDT_BASE - 1 ; GDT limit
62 dd ADDR_OF(GDT_BASE)
63
64 ALIGN 16
65
66 ;
67 ; Macros for GDT entries
68 ;
69
70 %define PRESENT_FLAG(p) (p << 7)
71 %define DPL(dpl) (dpl << 5)
72 %define SYSTEM_FLAG(s) (s << 4)
73 %define DESC_TYPE(t) (t)
74
75 ; Type: data, expand-up, writable, accessed
76 %define DATA32_TYPE 3
77
78 ; Type: execute, readable, expand-up, accessed
79 %define CODE32_TYPE 0xb
80
81 ; Type: execute, readable, expand-up, accessed
82 %define CODE64_TYPE 0xb
83
84 %define GRANULARITY_FLAG(g) (g << 7)
85 %define DEFAULT_SIZE32(d) (d << 6)
86 %define CODE64_FLAG(l) (l << 5)
87 %define UPPER_LIMIT(l) (l)
88
89 ;
90 ; The Global Descriptor Table (GDT)
91 ;
92
93 GDT_BASE:
94 ; null descriptor
95 NULL_SEL equ $-GDT_BASE
96 DW 0 ; limit 15:0
97 DW 0 ; base 15:0
98 DB 0 ; base 23:16
99 DB 0 ; sys flag, dpl, type
100 DB 0 ; limit 19:16, flags
101 DB 0 ; base 31:24
102
103 ; linear data segment descriptor
104 LINEAR_SEL equ $-GDT_BASE
105 DW 0xffff ; limit 15:0
106 DW 0 ; base 15:0
107 DB 0 ; base 23:16
108 DB PRESENT_FLAG(1)|DPL(0)|SYSTEM_FLAG(1)|DESC_TYPE(DATA32_TYPE)
109 DB GRANULARITY_FLAG(1)|DEFAULT_SIZE32(1)|CODE64_FLAG(0)|UPPER_LIMIT(0xf)
110 DB 0 ; base 31:24
111
112 ; linear code segment descriptor
113 LINEAR_CODE_SEL equ $-GDT_BASE
114 DW 0xffff ; limit 15:0
115 DW 0 ; base 15:0
116 DB 0 ; base 23:16
117 DB PRESENT_FLAG(1)|DPL(0)|SYSTEM_FLAG(1)|DESC_TYPE(CODE32_TYPE)
118 DB GRANULARITY_FLAG(1)|DEFAULT_SIZE32(1)|CODE64_FLAG(0)|UPPER_LIMIT(0xf)
119 DB 0 ; base 31:24
120
121 %ifdef ARCH_X64
122 ; linear code (64-bit) segment descriptor
123 LINEAR_CODE64_SEL equ $-GDT_BASE
124 DW 0xffff ; limit 15:0
125 DW 0 ; base 15:0
126 DB 0 ; base 23:16
127 DB PRESENT_FLAG(1)|DPL(0)|SYSTEM_FLAG(1)|DESC_TYPE(CODE64_TYPE)
128 DB GRANULARITY_FLAG(1)|DEFAULT_SIZE32(0)|CODE64_FLAG(1)|UPPER_LIMIT(0xf)
129 DB 0 ; base 31:24
130 %endif
131
132 GDT_END:
133