1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#include "optionrom.h"
22
23#define BOOT_ROM_PRODUCT "multiboot loader"
24
25#define MULTIBOOT_MAGIC 0x2badb002
26
27#define GS_PROT_JUMP 0
28#define GS_GDT_DESC 6
29
30
31BOOT_ROM_START
32
33run_multiboot:
34
35 cli
36 cld
37
38 mov %cs, %eax
39 shl $0x4, %eax
40
41
42
43
44 mov %ss, %ecx
45 shl $0x4, %ecx
46 mov %esp, %ebx
47 add %ebx, %ecx
48 sub $0x20, %ecx
49 sub $0x30, %esp
50 shr $0x4, %ecx
51 mov %cx, %gs
52
53
54 mov (prot_jump), %ebx
55 add %eax, %ebx
56 movl %ebx, %gs:GS_PROT_JUMP
57 mov $8, %bx
58 movw %bx, %gs:GS_PROT_JUMP + 4
59
60
61 movw (gdt_desc), %bx
62 movw %bx, %gs:GS_GDT_DESC
63 movl (gdt_desc+2), %ebx
64 add %eax, %ebx
65 movl %ebx, %gs:GS_GDT_DESC + 2
66
67 xor %eax, %eax
68 mov %eax, %es
69
70
71 read_fw_blob(FW_CFG_INITRD)
72
73
74 read_fw FW_CFG_INITRD_ADDR
75 shr $4, %eax
76 mov %ax, %fs
77
78
79
80
81 int $0x12
82 cwtl
83 movl %eax, %fs:4
84
85
86 mov %fs:48, %eax
87 shr $4, %eax
88 mov %ax, %es
89
90
91 xor %ebx, %ebx
92
93 xor %edi, %edi
94
95mmap_loop:
96
97 add $4, %di
98
99 movl $20, %ecx
100
101 movl $0x0000e820, %eax
102
103 movl $0x534d4150, %edx
104 int $0x15
105
106mmap_check_entry:
107
108 jb mmap_done
109
110mmap_store_entry:
111
112
113
114
115 .dc.b 0x26,0x67,0x66,0x89,0x4f,0xfc
116
117
118 add %ecx, %edi
119 movw %di, %fs:0x2c
120
121
122 test %ebx, %ebx
123 jnz mmap_loop
124
125mmap_done:
126
127
128 xor %di, %di
129 mov $0x100000, %edx
130upper_mem_entry:
131 cmp %fs:0x2c, %di
132 je upper_mem_done
133 add $4, %di
134
135
136 cmpl $1, %es:16(%di)
137 jne upper_mem_next
138
139
140 movl %es:4(%di), %eax
141 test %eax, %eax
142 jnz upper_mem_next
143
144
145 movl %es:(%di), %eax
146 cmp %eax, %edx
147 jb upper_mem_next
148 addl %es:8(%di), %eax
149 cmp %eax, %edx
150 jae upper_mem_next
151
152
153 mov %eax, %edx
154 xor %di, %di
155 jmp upper_mem_entry
156
157upper_mem_next:
158 addl %es:-4(%di), %edi
159 jmp upper_mem_entry
160
161upper_mem_done:
162 sub $0x100000, %edx
163 shr $10, %edx
164 mov %edx, %fs:0x8
165
166real_to_prot:
167
168lgdt:
169 data32 lgdt %gs:GS_GDT_DESC
170
171
172 movl $1, %eax
173 movl %eax, %cr0
174
175
176ljmp:
177 data32 ljmp *%gs:GS_PROT_JUMP
178
179prot_mode:
180.code32
181
182
183 movl $0x10, %eax
184 movl %eax, %ss
185 movl %eax, %ds
186 movl %eax, %es
187 movl %eax, %fs
188 movl %eax, %gs
189
190
191 read_fw_blob(FW_CFG_KERNEL)
192
193
194 read_fw FW_CFG_KERNEL_ENTRY
195 mov %eax, %ecx
196
197
198 read_fw FW_CFG_INITRD_ADDR
199 movl %eax, %ebx
200
201
202 movl $MULTIBOOT_MAGIC, %eax
203ljmp2:
204 jmp *%ecx
205
206
207.align 4, 0
208prot_jump: .long prot_mode
209 .short 8
210
211.align 4, 0
212gdt:
213
214.byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
215
216
217.byte 0xff, 0xff, 0x00, 0x00, 0x00, 0x9a, 0xcf, 0x00
218
219
220.byte 0xff, 0xff, 0x00, 0x00, 0x00, 0x92, 0xcf, 0x00
221
222
223.byte 0xff, 0xff, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00
224
225
226.byte 0xff, 0xff, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00
227
228gdt_desc:
229.short (5 * 8) - 1
230.long gdt
231
232BOOT_ROM_END
233