Rev 8089 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 8089 | Rev 8091 | ||
---|---|---|---|
1 | format pe64 dll efi at 0 |
1 | format pe64 dll efi at 0 |
2 | entry main |
2 | entry main |
3 | 3 | ||
4 | 4 | ||
5 | section '.text' code executable readable |
5 | section '.text' code executable readable |
6 | 6 | ||
7 | include '../struct.inc' |
7 | include '../struct.inc' |
8 | include '../macros.inc' |
8 | include '../macros.inc' |
9 | include '../const.inc' |
9 | include '../const.inc' |
10 | include 'uefi.inc' |
10 | include 'uefi.inc' |
11 | 11 | ||
12 | MEMORY_MAP_SIZE = 0x4000 |
12 | MEMORY_MAP_SIZE = 0x4000 |
13 | GOP_BUFFER_SIZE = 0x800 |
13 | GOP_BUFFER_SIZE = 0x800 |
14 | 14 | ||
15 | KERNEL_BASE = 0x10000 |
15 | KERNEL_BASE = 0x10000 |
16 | RAMDISK_BASE = 0x100000 |
16 | RAMDISK_BASE = 0x100000 |
17 | 17 | ||
18 | CODE_32_SELECTOR = 8 |
18 | CODE_32_SELECTOR = 8 |
19 | DATA_32_SELECTOR = 16 |
19 | DATA_32_SELECTOR = 16 |
20 | CODE_64_SELECTOR = 24 |
20 | CODE_64_SELECTOR = 24 |
21 | 21 | ||
22 | ; linux/arch/x86/include/uapi/asm/e820.h |
22 | ; linux/arch/x86/include/uapi/asm/e820.h |
23 | E820_RAM = 1 |
23 | E820_RAM = 1 |
24 | E820_RESERVED = 2 |
24 | E820_RESERVED = 2 |
25 | E820_ACPI = 3 |
25 | E820_ACPI = 3 |
26 | E820_NVS = 4 |
26 | E820_NVS = 4 |
27 | E820_UNUSABLE = 5 |
27 | E820_UNUSABLE = 5 |
28 | E820_PMEM = 7 |
28 | E820_PMEM = 7 |
29 | ;E820_MAX = 128 |
29 | ;E820_MAX = 128 |
30 | 30 | ||
31 | main: |
31 | main: |
32 | sub rsp, 0x38 |
32 | sub rsp, 0x38 |
33 | ; initialize UEFI library |
33 | ; initialize UEFI library |
34 | InitializeLib |
34 | InitializeLib |
35 | jc .error |
35 | jc .error |
36 | 36 | ||
37 | ; uefi_call_wrapper ConOut, Reset, ConOut, 1 |
37 | ; uefi_call_wrapper ConOut, Reset, ConOut, 1 |
38 | ; cmp rax, EFI_SUCCESS |
38 | ; cmp rax, EFI_SUCCESS |
39 | ; jnz .error |
39 | ; jnz .error |
40 | 40 | ||
41 | uefi_call_wrapper ConOut, ClearScreen, ConOut |
41 | uefi_call_wrapper ConOut, ClearScreen, ConOut |
42 | cmp rax, EFI_SUCCESS |
42 | cmp rax, EFI_SUCCESS |
43 | jnz .error |
43 | jnz .error |
44 | 44 | ||
45 | ; uefi_call_wrapper ConOut, OutputString, ConOut, msg_hello |
45 | ; uefi_call_wrapper ConOut, OutputString, ConOut, msg_hello |
46 | ; cmp eax, EFI_SUCCESS |
46 | ; cmp eax, EFI_SUCCESS |
47 | ; jnz .error |
47 | ; jnz .error |
48 | 48 | ||
49 | uefi_call_wrapper BootServices, LocateHandle, 2, gopuuid, 0, gop_buffer_size, gop_buffer |
49 | uefi_call_wrapper BootServices, LocateHandle, 2, gopuuid, 0, gop_buffer_size, gop_buffer |
50 | cmp eax, EFI_SUCCESS |
50 | cmp eax, EFI_SUCCESS |
51 | jnz .error |
51 | jnz .error |
52 | 52 | ||
53 | mov rsi, gop_buffer |
53 | mov rsi, gop_buffer |
54 | lodsq |
54 | lodsq |
55 | mov [gop_handle], rax |
55 | mov [gop_handle], rax |
56 | uefi_call_wrapper BootServices, HandleProtocol, qword [gop_handle], gopuuid, gop_interface |
56 | uefi_call_wrapper BootServices, HandleProtocol, qword [gop_handle], gopuuid, gop_interface |
57 | cmp eax, EFI_SUCCESS |
57 | cmp eax, EFI_SUCCESS |
58 | jnz .error |
58 | jnz .error |
59 | 59 | ||
60 | mov rbx, [efi_ptr] |
60 | mov rbx, [efi_ptr] |
61 | mov rdi, [rbx + EFI_SYSTEM_TABLE.ConfigurationTable] |
61 | mov rdi, [rbx + EFI_SYSTEM_TABLE.ConfigurationTable] |
62 | mov rcx, [rbx + EFI_SYSTEM_TABLE.NumberOfTableEntries] |
62 | mov rcx, [rbx + EFI_SYSTEM_TABLE.NumberOfTableEntries] |
63 | mov rax, 0x11d3e4f18868e871 |
63 | mov rax, 0x11d3e4f18868e871 |
64 | mov rdx, 0x81883cc7800022bc |
64 | mov rdx, 0x81883cc7800022bc |
65 | .next_table: |
65 | .next_table: |
66 | dec ecx |
66 | dec ecx |
67 | js .all_tables_done |
67 | js .all_tables_done |
68 | cmp [rdi + 0], rax |
68 | cmp [rdi + 0], rax |
69 | jnz .not_acpi20 |
69 | jnz .not_acpi20 |
70 | cmp [rdi + 8], rdx |
70 | cmp [rdi + 8], rdx |
71 | jnz .not_acpi20 |
71 | jnz .not_acpi20 |
72 | mov rax, [rdi + 16] |
72 | mov rax, [rdi + 16] |
73 | mov rdx, BOOT_LO.acpi_rsdp |
73 | mov rdx, BOOT_LO.acpi_rsdp |
74 | mov [rdx], eax |
74 | mov [rdx], eax |
75 | ;jmp $ |
75 | ;jmp $ |
76 | jmp .all_tables_done |
76 | jmp .all_tables_done |
77 | .not_acpi20: |
77 | .not_acpi20: |
78 | add rdi, 24 |
78 | add rdi, 24 |
79 | jmp .next_table |
79 | jmp .next_table |
80 | .all_tables_done: |
80 | .all_tables_done: |
81 | 81 | ||
82 | xor ebx, ebx |
82 | xor ebx, ebx |
83 | .next_mode: |
83 | .next_mode: |
84 | call clearbuf |
84 | call clearbuf |
85 | mov eax, ebx |
85 | mov eax, ebx |
86 | lea rdi, [msg] |
86 | lea rdi, [msg] |
87 | call num2dec |
87 | call num2dec |
88 | 88 | ||
89 | push rbx |
89 | push rbx |
90 | uefi_call_wrapper [gop_interface], EFI_GRAPHICS_OUTPUT_PROTOCOL.QueryMode, [gop_interface], rbx, gop_info_size, gop_info |
90 | uefi_call_wrapper [gop_interface], EFI_GRAPHICS_OUTPUT_PROTOCOL.QueryMode, [gop_interface], rbx, gop_info_size, gop_info |
91 | cmp rax, EFI_SUCCESS |
91 | cmp rax, EFI_SUCCESS |
92 | jnz .error |
92 | jnz .error |
93 | mov rcx, [gop_info] |
93 | mov rcx, [gop_info] |
94 | cmp [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.PixelFormat], 1 ; PixelBlueGreenRedReserved8BitPerColor |
94 | cmp [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.PixelFormat], 1 ; PixelBlueGreenRedReserved8BitPerColor |
95 | jnz .skip |
95 | jnz .skip |
96 | mov eax, [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.HorizontalResolution] |
96 | mov eax, [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.HorizontalResolution] |
97 | lea rdi, [msg+4*2] |
97 | lea rdi, [msg+4*2] |
98 | call num2dec |
98 | call num2dec |
99 | mov eax, [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.VerticalResolution] |
99 | mov eax, [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.VerticalResolution] |
100 | lea rdi, [msg+9*2] |
100 | lea rdi, [msg+9*2] |
101 | call num2dec |
101 | call num2dec |
102 | ; mov eax, [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.PixelsPerScanLine] |
102 | ; mov eax, [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.PixelsPerScanLine] |
103 | ; lea rdi, [msg+14*2] |
103 | ; lea rdi, [msg+14*2] |
104 | ; call num2dec |
104 | ; call num2dec |
105 | .skip: |
105 | .skip: |
106 | uefi_call_wrapper ConOut, OutputString, ConOut, msg |
106 | uefi_call_wrapper ConOut, OutputString, ConOut, msg |
107 | cmp rax, EFI_SUCCESS |
107 | cmp rax, EFI_SUCCESS |
108 | jnz .error |
108 | jnz .error |
109 | 109 | ||
110 | pop rbx |
110 | pop rbx |
111 | inc rbx |
111 | inc rbx |
112 | mov rcx, [gop_interface] |
112 | mov rcx, [gop_interface] |
113 | mov rdx, [rcx + EFI_GRAPHICS_OUTPUT_PROTOCOL.Mode] |
113 | mov rdx, [rcx + EFI_GRAPHICS_OUTPUT_PROTOCOL.Mode] |
114 | cmp ebx, [rdx + EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.MaxMode] |
114 | cmp ebx, [rdx + EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.MaxMode] |
115 | jnz .next_mode |
115 | jnz .next_mode |
116 | 116 | ||
117 | 117 | ||
118 | uefi_call_wrapper ConIn, Reset, ConIn, 1 |
118 | uefi_call_wrapper ConIn, Reset, ConIn, 1 |
119 | cmp rax, EFI_SUCCESS |
119 | cmp rax, EFI_SUCCESS |
120 | jnz .error |
120 | jnz .error |
121 | xor ecx, ecx |
121 | xor ecx, ecx |
122 | @@: |
122 | @@: |
123 | push rcx |
123 | push rcx |
124 | uefi_call_wrapper ConIn, ReadKeyStroke, ConIn, msg |
124 | uefi_call_wrapper ConIn, ReadKeyStroke, ConIn, msg |
125 | pop rcx |
125 | pop rcx |
126 | mov rdx, EFI_DEVICE_ERROR |
126 | mov rdx, EFI_DEVICE_ERROR |
127 | cmp rax, rdx |
127 | cmp rax, rdx |
128 | jz .error |
128 | jz .error |
129 | mov rdx, EFI_NOT_READY |
129 | mov rdx, EFI_NOT_READY |
130 | cmp rax, rdx |
130 | cmp rax, rdx |
131 | jz @b |
131 | jz @b |
132 | ; cmp rax, EFI_SUCCESS |
132 | ; cmp rax, EFI_SUCCESS |
133 | movzx eax, word[msg+2] |
133 | movzx eax, word[msg+2] |
134 | ;jmp .key_done |
134 | ;jmp .key_done |
135 | cmp al, 0x0D |
135 | cmp al, 0x0D |
136 | jz .key_done |
136 | jz .key_done |
137 | imul ecx, 10 |
137 | imul ecx, 10 |
138 | sub eax, '0' |
138 | sub eax, '0' |
139 | add ecx, eax |
139 | add ecx, eax |
140 | jmp @b |
140 | jmp @b |
141 | .key_done: |
141 | .key_done: |
142 | 142 | ||
143 | uefi_call_wrapper [gop_interface], EFI_GRAPHICS_OUTPUT_PROTOCOL.SetMode, [gop_interface], rcx |
143 | uefi_call_wrapper [gop_interface], EFI_GRAPHICS_OUTPUT_PROTOCOL.SetMode, [gop_interface], rcx |
144 | cmp eax, EFI_SUCCESS |
144 | cmp eax, EFI_SUCCESS |
145 | jnz .error |
145 | jnz .error |
146 | 146 | ||
147 | mov rcx, [gop_interface] |
147 | mov rcx, [gop_interface] |
148 | mov rdx, [rcx + EFI_GRAPHICS_OUTPUT_PROTOCOL.Mode] |
148 | mov rdx, [rcx + EFI_GRAPHICS_OUTPUT_PROTOCOL.Mode] |
149 | mov rdi, [rdx + EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.FrameBufferBase] |
149 | mov rdi, [rdx + EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.FrameBufferBase] |
150 | mov [fb_base], rdi |
150 | mov [fb_base], rdi |
151 | 151 | ||
152 | 152 | ||
153 | mov ebx, [rdx + EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.Mode] |
153 | mov ebx, [rdx + EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.Mode] |
154 | uefi_call_wrapper [gop_interface], EFI_GRAPHICS_OUTPUT_PROTOCOL.QueryMode, [gop_interface], rbx, gop_info_size, gop_info |
154 | uefi_call_wrapper [gop_interface], EFI_GRAPHICS_OUTPUT_PROTOCOL.QueryMode, [gop_interface], rbx, gop_info_size, gop_info |
155 | cmp rax, EFI_SUCCESS |
155 | cmp rax, EFI_SUCCESS |
156 | jnz .error |
156 | jnz .error |
157 | mov rcx, [gop_info] |
157 | mov rcx, [gop_info] |
158 | mov eax, [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.HorizontalResolution] |
158 | mov eax, [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.HorizontalResolution] |
159 | xor rdx, rdx |
159 | xor rdx, rdx |
160 | mov word [rdx + BOOT_LO.x_res], ax |
160 | mov word [rdx + BOOT_LO.x_res], ax |
161 | mov eax, [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.VerticalResolution] |
161 | mov eax, [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.VerticalResolution] |
162 | mov word [rdx + BOOT_LO.y_res], ax |
162 | mov word [rdx + BOOT_LO.y_res], ax |
163 | mov eax, [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.PixelsPerScanLine] |
163 | mov eax, [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.PixelsPerScanLine] |
164 | shl eax, 2 |
164 | shl eax, 2 |
165 | mov word [rdx + BOOT_LO.pitch], ax |
165 | mov word [rdx + BOOT_LO.pitch], ax |
166 | 166 | ||
167 | mov byte [rdx + BOOT_LO.pci_data + 0], 1 ; PCI access mechanism |
167 | mov byte [rdx + BOOT_LO.pci_data + 0], 1 ; PCI access mechanism |
168 | mov byte [rdx + BOOT_LO.pci_data + 1], 8 ; last bus, don't know how to count them |
168 | mov byte [rdx + BOOT_LO.pci_data + 1], 8 ; last bus, don't know how to count them |
169 | mov byte [rdx + BOOT_LO.pci_data + 2], 0x10 ; PCI version |
169 | mov byte [rdx + BOOT_LO.pci_data + 2], 0x10 ; PCI version |
170 | mov byte [rdx + BOOT_LO.pci_data + 3], 0x02 |
170 | mov byte [rdx + BOOT_LO.pci_data + 3], 0x02 |
171 | mov dword [rdx + BOOT_LO.pci_data + 4], 0xe3 |
171 | mov dword [rdx + BOOT_LO.pci_data + 4], 0xe3 |
172 | 172 | ||
173 | 173 | ||
174 | uefi_call_wrapper BootServices, GetMemoryMap, memory_map_size, memory_map, memory_map_key, descriptor_size, descriptor_ver |
174 | uefi_call_wrapper BootServices, GetMemoryMap, memory_map_size, memory_map, memory_map_key, descriptor_size, descriptor_ver |
175 | cmp eax, EFI_SUCCESS |
175 | cmp eax, EFI_SUCCESS |
176 | jnz .error |
176 | jnz .error |
177 | 177 | ||
178 | mov rdi, BOOT_LO.memmap_block_cnt |
178 | mov rdi, BOOT_LO.memmap_block_cnt |
179 | mov dword[rdi], 0 |
179 | mov dword[rdi], 0 |
180 | mov rdi, BOOT_LO.memmap_blocks |
180 | mov rdi, BOOT_LO.memmap_blocks |
181 | mov rax, [memory_map_size] |
181 | mov rax, [memory_map_size] |
182 | xor edx, edx |
182 | xor edx, edx |
183 | mov rcx, [descriptor_size] |
183 | mov rcx, [descriptor_size] |
184 | div ecx |
184 | div ecx |
185 | mov ecx, eax |
185 | mov ecx, eax |
186 | mov rsi, memory_map |
186 | mov rsi, memory_map |
187 | .next_descr: |
187 | .next_descr: |
188 | call add_uefi_memmap |
188 | call add_uefi_memmap |
189 | add rsi, [descriptor_size] |
189 | add rsi, [descriptor_size] |
190 | add rdi, sizeof.e820entry |
190 | add rdi, sizeof.e820entry |
191 | dec rcx |
191 | dec rcx |
192 | cmp rcx, 0 |
192 | cmp rcx, 0 |
193 | jnz .next_descr |
193 | jnz .next_descr |
194 | 194 | ||
195 | mov [memory_map_size], MEMORY_MAP_SIZE |
195 | mov [memory_map_size], MEMORY_MAP_SIZE |
196 | uefi_call_wrapper BootServices, GetMemoryMap, memory_map_size, memory_map, memory_map_key, descriptor_size, descriptor_ver |
196 | uefi_call_wrapper BootServices, GetMemoryMap, memory_map_size, memory_map, memory_map_key, descriptor_size, descriptor_ver |
197 | cmp eax, EFI_SUCCESS |
197 | cmp eax, EFI_SUCCESS |
198 | jnz .error |
198 | jnz .error |
199 | 199 | ||
200 | uefi_call_wrapper BootServices, ExitBootServices, [efi_handler], [memory_map_key] |
200 | uefi_call_wrapper BootServices, ExitBootServices, [efi_handler], [memory_map_key] |
201 | cmp eax, EFI_SUCCESS |
201 | cmp eax, EFI_SUCCESS |
202 | jnz .error |
202 | jnz .error |
203 | 203 | ||
204 | 204 | ||
205 | cli |
205 | cli |
206 | 206 | ||
207 | mov rsi, kernel_bin_data_begin |
207 | mov rsi, kernel_data_begin |
208 | mov rdi, KERNEL_BASE |
208 | mov rdi, KERNEL_BASE |
209 | mov rcx, (kernel_bin_data_end - kernel_bin_data_begin + 7) / 8 |
209 | mov rcx, (kernel_data_end - kernel_data_begin + 7) / 8 |
210 | rep movsq |
210 | rep movsq |
211 | 211 | ||
212 | mov rsi, kolibri_img_data_begin |
212 | mov rsi, ramdisk_data_begin |
213 | mov rdi, RAMDISK_BASE |
213 | mov rdi, RAMDISK_BASE |
214 | mov rcx, (kolibri_img_data_end - kolibri_img_data_begin + 7 ) / 8 |
214 | mov rcx, (ramdisk_data_end - ramdisk_data_begin + 7 ) / 8 |
215 | rep movsq |
215 | rep movsq |
216 | 216 | ||
217 | xor esi, esi |
217 | xor esi, esi |
218 | mov byte[esi + BOOT_LO.bpp], 32 |
218 | mov byte[esi + BOOT_LO.bpp], 32 |
219 | mov word[esi + BOOT_LO.vesa_mode], 0 |
219 | mov word[esi + BOOT_LO.vesa_mode], 0 |
220 | mov dword[esi + BOOT_LO.bank_switch], 0 |
220 | mov dword[esi + BOOT_LO.bank_switch], 0 |
221 | mov rdi, [fb_base] |
221 | mov rdi, [fb_base] |
222 | mov dword[esi + BOOT_LO.lfb], edi |
222 | mov dword[esi + BOOT_LO.lfb], edi |
223 | mov byte[esi + BOOT_LO.mtrr], 1 |
223 | mov byte[esi + BOOT_LO.mtrr], 1 |
224 | mov byte[esi + BOOT_LO.launcher_start], 1 |
224 | mov byte[esi + BOOT_LO.launcher_start], 1 |
225 | mov byte[esi + BOOT_LO.debug_print], 1 |
225 | mov byte[esi + BOOT_LO.debug_print], 1 |
226 | mov byte[esi + BOOT_LO.dma], 0 |
226 | mov byte[esi + BOOT_LO.dma], 0 |
227 | ; mov qword[esi + BOOT_LO.pci_data], 0 |
227 | ; mov qword[esi + BOOT_LO.pci_data], 0 |
228 | mov dword[esi + BOOT_LO.apm_entry], 0 |
228 | mov dword[esi + BOOT_LO.apm_entry], 0 |
229 | mov word[esi + BOOT_LO.apm_version], 0 |
229 | mov word[esi + BOOT_LO.apm_version], 0 |
230 | mov dword[esi + BOOT_LO.apm_flags], 0 |
230 | mov dword[esi + BOOT_LO.apm_flags], 0 |
231 | mov word[esi + BOOT_LO.apm_code_32], 0 |
231 | mov word[esi + BOOT_LO.apm_code_32], 0 |
232 | mov word[esi + BOOT_LO.apm_code_16], 0 |
232 | mov word[esi + BOOT_LO.apm_code_16], 0 |
233 | mov word[esi + BOOT_LO.apm_data_16], 0 |
233 | mov word[esi + BOOT_LO.apm_data_16], 0 |
234 | mov byte[esi + BOOT_LO.bios_hd_cnt], 0 |
234 | mov byte[esi + BOOT_LO.bios_hd_cnt], 0 |
- | 235 | mov rsi, syspath |
|
235 | mov word[esi + BOOT_LO.sys_disk], 'r1' ; boot from /rd/1 |
236 | mov rdi, BOOT_LO.syspath |
236 | - | ||
- | 237 | mov ecx, 32 |
|
- | 238 | rep movsb |
|
237 | 239 | ||
238 | lgdt [cs:GDTR] |
240 | lgdt [cs:GDTR] |
239 | 241 | ||
240 | mov ax, DATA_32_SELECTOR |
242 | mov ax, DATA_32_SELECTOR |
241 | mov ds, ax |
243 | mov ds, ax |
242 | mov es, ax |
244 | mov es, ax |
243 | mov fs, ax |
245 | mov fs, ax |
244 | mov gs, ax |
246 | mov gs, ax |
245 | mov ss, ax |
247 | mov ss, ax |
246 | 248 | ||
247 | push CODE_32_SELECTOR |
249 | push CODE_32_SELECTOR |
248 | lea rax, [.next] |
250 | lea rax, [.next] |
249 | push rax |
251 | push rax |
250 | ; push .next |
252 | ; push .next |
251 | retf |
253 | retf |
252 | use32 |
254 | use32 |
253 | align 16 |
255 | align 16 |
254 | .next: |
256 | .next: |
255 | mov eax, cr0 |
257 | mov eax, cr0 |
256 | and eax, not CR0_PG |
258 | and eax, not CR0_PG |
257 | mov cr0, eax |
259 | mov cr0, eax |
258 | 260 | ||
259 | mov ecx, MSR_AMD_EFER |
261 | mov ecx, MSR_AMD_EFER |
260 | rdmsr |
262 | rdmsr |
261 | btr eax, 8 ; LME |
263 | btr eax, 8 ; LME |
262 | wrmsr |
264 | wrmsr |
263 | 265 | ||
264 | mov eax, cr4 |
266 | mov eax, cr4 |
265 | and eax, not CR4_PAE |
267 | and eax, not CR4_PAE |
266 | mov cr4, eax |
268 | mov cr4, eax |
267 | 269 | ||
268 | push KERNEL_BASE |
270 | push KERNEL_BASE |
269 | retn |
271 | retn |
270 | 272 | ||
271 | use64 |
273 | use64 |
272 | .error: |
274 | .error: |
273 | uefi_call_wrapper ConOut, OutputString, ConOut, msg_error |
275 | uefi_call_wrapper ConOut, OutputString, ConOut, msg_error |
274 | jmp .quit |
276 | jmp .quit |
275 | .quit: |
277 | .quit: |
276 | mov rcx, -1 |
278 | mov rcx, -1 |
277 | loop $ |
279 | loop $ |
278 | 280 | ||
279 | 281 | ||
280 | ; linux/arch/x86/platform/efi/efi.c |
282 | ; linux/arch/x86/platform/efi/efi.c |
281 | ; do_add_efi_memmap |
283 | ; do_add_efi_memmap |
282 | add_uefi_memmap: |
284 | add_uefi_memmap: |
283 | push rax rbx rcx rdx rsi rdi |
285 | push rax rbx rcx rdx rsi rdi |
284 | 286 | ||
285 | mov r10d, [rsi + 0] |
287 | mov r10d, [rsi + 0] |
286 | mov r11, [rsi + 8] |
288 | mov r11, [rsi + 8] |
287 | ; mov r12, [rsi + 16] |
289 | ; mov r12, [rsi + 16] |
288 | mov r13, [rsi + 24] |
290 | mov r13, [rsi + 24] |
289 | mov r14, [rsi + 32] |
291 | mov r14, [rsi + 32] |
290 | 292 | ||
291 | mov [rdi + e820entry.addr], r11 |
293 | mov [rdi + e820entry.addr], r11 |
292 | mov rax, r13 |
294 | mov rax, r13 |
293 | shl rax, 12 |
295 | shl rax, 12 |
294 | mov [rdi + e820entry.size], rax |
296 | mov [rdi + e820entry.size], rax |
295 | 297 | ||
296 | 298 | ||
297 | cmp r10d, EFI_LOADER_CODE |
299 | cmp r10d, EFI_LOADER_CODE |
298 | jz .case0 |
300 | jz .case0 |
299 | cmp r10d, EFI_LOADER_DATA |
301 | cmp r10d, EFI_LOADER_DATA |
300 | jz .case0 |
302 | jz .case0 |
301 | cmp r10d, EFI_BOOT_SERVICES_CODE |
303 | cmp r10d, EFI_BOOT_SERVICES_CODE |
302 | jz .case0 |
304 | jz .case0 |
303 | cmp r10d, EFI_BOOT_SERVICES_DATA |
305 | cmp r10d, EFI_BOOT_SERVICES_DATA |
304 | jz .case0 |
306 | jz .case0 |
305 | cmp r10d, EFI_CONVENTIONAL_MEMORY |
307 | cmp r10d, EFI_CONVENTIONAL_MEMORY |
306 | jz .case0 |
308 | jz .case0 |
307 | cmp r10d, EFI_ACPI_RECLAIM_MEMORY |
309 | cmp r10d, EFI_ACPI_RECLAIM_MEMORY |
308 | jz .case1 |
310 | jz .case1 |
309 | cmp r10d, EFI_ACPI_MEMORY_NVS |
311 | cmp r10d, EFI_ACPI_MEMORY_NVS |
310 | jz .case2 |
312 | jz .case2 |
311 | cmp r10d, EFI_UNUSABLE_MEMORY |
313 | cmp r10d, EFI_UNUSABLE_MEMORY |
312 | jz .case3 |
314 | jz .case3 |
313 | cmp r10d, EFI_PERSISTENT_MEMORY |
315 | cmp r10d, EFI_PERSISTENT_MEMORY |
314 | jz .case4 |
316 | jz .case4 |
315 | jmp .default |
317 | jmp .default |
316 | 318 | ||
317 | .case0: |
319 | .case0: |
318 | test r14, EFI_MEMORY_WB |
320 | test r14, EFI_MEMORY_WB |
319 | jz @f |
321 | jz @f |
320 | mov eax, E820_RAM |
322 | mov eax, E820_RAM |
321 | jmp .done |
323 | jmp .done |
322 | @@: |
324 | @@: |
323 | mov eax, E820_RESERVED |
325 | mov eax, E820_RESERVED |
324 | jmp .done |
326 | jmp .done |
325 | .case1: |
327 | .case1: |
326 | mov eax, E820_ACPI |
328 | mov eax, E820_ACPI |
327 | jmp .done |
329 | jmp .done |
328 | .case2: |
330 | .case2: |
329 | mov eax, E820_NVS |
331 | mov eax, E820_NVS |
330 | jmp .done |
332 | jmp .done |
331 | .case3: |
333 | .case3: |
332 | mov eax, E820_UNUSABLE |
334 | mov eax, E820_UNUSABLE |
333 | jmp .done |
335 | jmp .done |
334 | .case4: |
336 | .case4: |
335 | mov eax, E820_PMEM |
337 | mov eax, E820_PMEM |
336 | jmp .done |
338 | jmp .done |
337 | .default: |
339 | .default: |
338 | mov eax, E820_RESERVED |
340 | mov eax, E820_RESERVED |
339 | jmp .done |
341 | jmp .done |
340 | 342 | ||
341 | .done: |
343 | .done: |
342 | mov [rdi + e820entry.type], eax |
344 | mov [rdi + e820entry.type], eax |
343 | 345 | ||
344 | mov rax, BOOT_LO.memmap_block_cnt |
346 | mov rax, BOOT_LO.memmap_block_cnt |
345 | inc word[rax] |
347 | inc word[rax] |
346 | 348 | ||
347 | pop rdi rsi rdx rcx rbx rax |
349 | pop rdi rsi rdx rcx rbx rax |
348 | ret |
350 | ret |
349 | 351 | ||
350 | 352 | ||
351 | num2dec: |
353 | num2dec: |
352 | push rax rbx rcx rdx rsi rdi |
354 | push rax rbx rcx rdx rsi rdi |
353 | 355 | ||
354 | xor ecx, ecx |
356 | xor ecx, ecx |
355 | mov ebx, 10 |
357 | mov ebx, 10 |
356 | .next_digit: |
358 | .next_digit: |
357 | xor edx, edx |
359 | xor edx, edx |
358 | div ebx |
360 | div ebx |
359 | push rdx |
361 | push rdx |
360 | inc ecx |
362 | inc ecx |
361 | test eax, eax |
363 | test eax, eax |
362 | jnz .next_digit |
364 | jnz .next_digit |
363 | 365 | ||
364 | .next_char: |
366 | .next_char: |
365 | pop rax |
367 | pop rax |
366 | add eax, '0' |
368 | add eax, '0' |
367 | stosw |
369 | stosw |
368 | loop .next_char |
370 | loop .next_char |
369 | 371 | ||
370 | pop rdi rsi rdx rcx rbx rax |
372 | pop rdi rsi rdx rcx rbx rax |
371 | ret |
373 | ret |
372 | 374 | ||
373 | 375 | ||
374 | num2hex: |
376 | num2hex: |
375 | push rax rbx rcx rdx rsi rdi |
377 | push rax rbx rcx rdx rsi rdi |
376 | 378 | ||
377 | xchg rdx, rax |
379 | xchg rdx, rax |
378 | mov ecx, 16 |
380 | mov ecx, 16 |
379 | .next_tetra: |
381 | .next_tetra: |
380 | rol rdx, 4 |
382 | rol rdx, 4 |
381 | movzx eax, dl |
383 | movzx eax, dl |
382 | and eax, 0x0f |
384 | and eax, 0x0f |
383 | movzx eax, byte[hex+eax] |
385 | movzx eax, byte[hex+eax] |
384 | stosw |
386 | stosw |
385 | loop .next_tetra |
387 | loop .next_tetra |
386 | 388 | ||
387 | pop rdi rsi rdx rcx rbx rax |
389 | pop rdi rsi rdx rcx rbx rax |
388 | ret |
390 | ret |
389 | 391 | ||
390 | hex db '0123456789ABCDEF' |
392 | hex db '0123456789ABCDEF' |
391 | 393 | ||
392 | clearbuf: |
394 | clearbuf: |
393 | push rax rbx rcx rdx rsi rdi |
395 | push rax rbx rcx rdx rsi rdi |
394 | mov eax, 0x0020 |
396 | mov eax, 0x0020 |
395 | mov ecx, 79 |
397 | mov ecx, 79 |
396 | mov rdi, msg |
398 | mov rdi, msg |
397 | rep stosw |
399 | rep stosw |
398 | pop rdi rsi rdx rcx rbx rax |
400 | pop rdi rsi rdx rcx rbx rax |
399 | ret |
401 | ret |
400 | 402 | ||
401 | section '.data' data readable writeable |
403 | section '.data' data readable writeable |
402 | 404 | ||
403 | GDTR: |
405 | GDTR: |
404 | dw 4*8-1 |
406 | dw 4*8-1 |
405 | dq GDT |
407 | dq GDT |
406 | GDT: |
408 | GDT: |
407 | dw 0, 0, 0, 0 |
409 | dw 0, 0, 0, 0 |
408 | dw 0FFFFh,0,9A00h,0CFh ; 32-bit code |
410 | dw 0FFFFh,0,9A00h,0CFh ; 32-bit code |
409 | dw 0FFFFh,0,9200h,0CFh ; flat data |
411 | dw 0FFFFh,0,9200h,0CFh ; flat data |
410 | dw 0FFFFh,0,9A00h,0AFh ; 64-bit code |
412 | dw 0FFFFh,0,9A00h,0AFh ; 64-bit code |
411 | 413 | ||
412 | 414 | ||
413 | fb_base dq 0 |
415 | fb_base dq 0 |
414 | 416 | ||
415 | gopuuid db EFI_GRAPHICS_OUTPUT_PROTOCOL_UUID |
417 | gopuuid db EFI_GRAPHICS_OUTPUT_PROTOCOL_UUID |
416 | gop_buffer_size dq GOP_BUFFER_SIZE |
418 | gop_buffer_size dq GOP_BUFFER_SIZE |
417 | gop_handle dq 0 |
419 | gop_handle dq 0 |
418 | gop_interface dq 0 |
420 | gop_interface dq 0 |
419 | gop_info_size dq 0 |
421 | gop_info_size dq 0 |
420 | gop_info dq 0 |
422 | gop_info dq 0 |
421 | 423 | ||
422 | memory_map_key dq 0 |
424 | memory_map_key dq 0 |
423 | descriptor_size dq 0 |
425 | descriptor_size dq 0 |
424 | descriptor_ver dq 0 |
426 | descriptor_ver dq 0 |
425 | memory_map_size dq MEMORY_MAP_SIZE |
427 | memory_map_size dq MEMORY_MAP_SIZE |
426 | 428 | ||
427 | msg_success du 'Success!',13,10,0 |
429 | msg_success du 'Success!',13,10,0 |
428 | msg_error du 'Error!',13,10,0 |
430 | msg_error du 'Error!',13,10,0 |
429 | msg du 79 dup ' ',13,10,0 |
431 | msg du 79 dup ' ',13,10,0 |
- | 432 | ||
- | 433 | syspath db '/RD/1',0 |
|
430 | 434 | ||
431 | memory_map rb MEMORY_MAP_SIZE |
435 | memory_map rb MEMORY_MAP_SIZE |
432 | gop_buffer rb GOP_BUFFER_SIZE |
436 | gop_buffer rb GOP_BUFFER_SIZE |
433 | 437 | ||
434 | 438 | ||
435 | kernel_bin_data_begin: |
439 | kernel_data_begin: |
436 | file '../kernel.bin' |
440 | file '../kernel.bin.ext_loader' |
437 | kernel_bin_data_end: |
441 | kernel_data_end: |
438 | 442 | ||
439 | kolibri_img_data_begin: |
443 | ramdisk_data_begin: |
440 | file '../../../data/kolibri.img' |
444 | file '../../../data/kolibri.img' |
441 | kolibri_img_data_end: |
445 | ramdisk_data_end: |
442 | 446 | ||
443 | align 16 |
447 | align 16 |
444 | data fixups |
448 | data fixups |
445 | end data |
449 | end data |