Subversion Repositories Kolibri OS

Rev

Rev 9958 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
8150 dunkaist 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
9958 dunkaist 3
;; Copyright (C) KolibriOS team 2020-2024. All rights reserved. ;;
8150 dunkaist 4
;; Distributed under terms of the GNU General Public License    ;;
5
;; Version 2, or (at your option) any later version.            ;;
6
;;                                                              ;;
9227 dunkaist 7
;; Written by Ivan Baravy                                       ;;
8
;;                                                              ;;
8150 dunkaist 9
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10
 
11
format pe64 efi
8092 dunkaist 12
entry main
13
 
14
section '.text' code executable readable
15
 
16
include '../../struct.inc'
17
include '../../macros.inc'
9227 dunkaist 18
include '../../kglobals.inc'
19
fastcall fix fstcall
20
include 'proc64.inc'
8092 dunkaist 21
include '../../const.inc'
22
 
8150 dunkaist 23
purge DQ
24
include 'uefi64.inc'
25
 
8206 dunkaist 26
MEMORY_MAP_SIZE = 0x10000
9227 dunkaist 27
PROTOCOL_HANDLERS_BUFFER_SIZE = 0x100
8092 dunkaist 28
FILE_BUFFER_SIZE = 0x1000
29
 
8656 dunkaist 30
KERNEL_TRAMPOLINE = 0x8f80      ; just before BOOT_LO
8284 dunkaist 31
MAX_FILE_SIZE = 0x10000000
8092 dunkaist 32
 
33
CODE_32_SELECTOR = 8
34
DATA_32_SELECTOR = 16
35
CODE_64_SELECTOR = 24
36
 
37
; linux/arch/x86/include/uapi/asm/e820.h
38
E820_RAM       = 1
39
E820_RESERVED  = 2
40
E820_ACPI      = 3
41
E820_NVS       = 4
42
E820_UNUSABLE  = 5
43
E820_PMEM      = 7
44
 
9253 dunkaist 45
proc load_file _root, _name, _buffer, _size, _fatal
46
        mov     [_root], rcx
47
        mov     [_name], rdx
48
        mov     [_buffer], r8
49
        mov     [_size], r9
50
        mov     r10, [_root]
51
        mov     r11, [_name]
9227 dunkaist 52
        fstcall [r10+EFI_FILE_PROTOCOL.Open], r10, file_handle, \
53
                r11, EFI_FILE_MODE_READ, 0
8206 dunkaist 54
        test    eax, eax
8092 dunkaist 55
        jz      @f
9958 dunkaist 56
        mov     [_size], 0
9253 dunkaist 57
        cmp     [_fatal], 1
8092 dunkaist 58
        jnz     .done
9253 dunkaist 59
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
60
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
8150 dunkaist 61
                msg_error_open_file
9253 dunkaist 62
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
63
        mov     rdx, [_name]
64
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, [_name]
8092 dunkaist 65
        jmp     $
66
@@:
9253 dunkaist 67
        lea     rdx, [_size]
68
        mov     r8, [_buffer]
9227 dunkaist 69
        mov     r10, [file_handle]
70
        fstcall [r10+EFI_FILE_PROTOCOL.Read], [file_handle], rdx, r8
71
        mov     r10, [file_handle]
72
        fstcall [r10+EFI_FILE_PROTOCOL.Close], [file_handle]
8092 dunkaist 73
.done:
8206 dunkaist 74
        call    clearbuf
9286 dunkaist 75
        mov     rax, [_size]
8206 dunkaist 76
        mov     rdi, msg
77
        call    num2dec
9253 dunkaist 78
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
79
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
8206 dunkaist 80
                msg_file_size
9253 dunkaist 81
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
82
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, msg
9286 dunkaist 83
        mov     rax, [_size]
9253 dunkaist 84
        ret
85
endp
8092 dunkaist 86
 
87
skip_whitespace:
88
.next_char:
89
        cmp     byte[rsi], 0
90
        jz      .done
91
        cmp     byte[rsi], 0x20 ; ' '
92
        jz      .whitespace
93
        cmp     byte[rsi], 9    ; '\t'
94
        jz      .whitespace
95
        jmp     .done
96
.whitespace:
97
        inc     rsi
98
        jmp     .next_char
99
.done:
100
        ret
101
 
102
skip_until_newline:
103
.next_char:
104
        cmp     byte[rsi], 0
105
        jz      .done
106
        cmp     byte[rsi], 0xd  ; '\r'
107
        jz      .done
108
        cmp     byte[rsi], 0xa  ; '\n'
109
        jz      .done
110
        inc     rsi
111
        jmp     .next_char
112
.done:
113
        ret
114
 
115
skip_newline:
116
.next_char:
117
        cmp     byte[rsi], 0xd  ; '\r'
118
        jz      .newline
119
        cmp     byte[rsi], 0xa  ; '\n'
120
        jz      .newline
121
        jmp     .done
122
.newline:
123
        inc     rsi
124
        jmp     .next_char
125
.done:
126
        ret
127
 
128
skip_line:
129
        call    skip_until_newline
130
        call    skip_newline
131
        ret
132
 
133
dec2bin:
9977 rgimad 134
        xor     edx, edx
8092 dunkaist 135
.next_char:
136
        movzx   eax, byte[rsi]
137
        test    eax, eax
138
        jz      .done
139
        sub     eax, '0'
140
        jb      .done
141
        cmp     eax, 9
142
        ja      .done
143
        inc     rsi
144
        imul    edx, 10
145
        add     edx, eax
146
        jmp     .next_char
147
.done:
148
        mov     eax, edx
149
        ret
150
 
151
parse_option:
152
        mov     rbx, config_options-3*8
153
.try_next_option:
154
        add     rbx, 3*8
155
        mov     rdi, rsi
156
        mov     rdx, [rbx]      ; option name
157
        test    rdx, rdx
158
        jz      .done
159
.next_char:
160
        cmp     byte[rdx], 0
161
        jnz     @f
162
        cmp     byte[rdi], '='
163
        jz      .opt_name_ok
164
@@:
165
        cmp     byte[rdi], 0
166
        jz      .done
167
        movzx   eax, byte[rdi]
168
        cmp     [rdx], al
169
        jnz     .try_next_option
170
        inc     rdi
171
        inc     rdx
172
        jmp     .next_char
173
.opt_name_ok:
174
        inc     rdi
175
        mov     rsi, rdi
176
        call    qword[rbx+8]
177
.done:
178
        ret
179
 
180
parse_line:
181
.next_line:
182
        cmp     byte[rsi], 0
183
        jz      .done
184
        cmp     byte[rsi], 0xd  ; '\r'
185
        jz      .skip
186
        cmp     byte[rsi], 0xa  ; '\n'
187
        jz      .skip
188
        cmp     byte[rsi], '#'
189
        jz      .skip
190
        call    parse_option
191
        call    skip_line
192
        jmp     .next_line
193
.skip:
194
        call    skip_line
195
        jmp     .next_line
196
.done:
197
        ret
198
 
199
cfg_opt_func_resolution:
200
        call    dec2bin
201
        xor     edx, edx
202
        mov     [rdx+BOOT_LO.x_res], ax
203
        cmp     byte[rsi], 'x'
204
        jz      @f
205
        cmp     byte[rsi], '*'
206
        jz      @f
207
        jmp     .done
208
@@:
209
        inc     rsi
210
        call    dec2bin
211
        xor     edx, edx
212
        mov     [rdx+BOOT_LO.y_res], ax
213
        mov     [cfg_opt_used_resolution], 1
214
.done:
215
        ret
216
 
217
cfg_opt_func_acpi:
218
        call    dec2bin
219
        mov     [cfg_opt_used_acpi], 1
220
        mov     [cfg_opt_value_acpi], al
221
        ret
222
 
223
cfg_opt_func_debug_print:
224
        call    dec2bin
225
        mov     [cfg_opt_used_debug_print], 1
226
        mov     [cfg_opt_value_debug_print], al
227
        ret
228
 
229
cfg_opt_func_launcher_start:
230
        call    dec2bin
231
        mov     [cfg_opt_used_launcher_start], 1
232
        mov     [cfg_opt_value_launcher_start], al
233
        ret
234
 
235
cfg_opt_func_mtrr:
236
        call    dec2bin
237
        mov     [cfg_opt_used_mtrr], 1
238
        mov     [cfg_opt_value_mtrr], al
239
        ret
240
 
241
cfg_opt_func_ask_params:
242
        call    dec2bin
243
        mov     [cfg_opt_used_ask_params], 1
244
        mov     [cfg_opt_value_ask_params], al
245
        ret
246
 
247
cfg_opt_func_imgfrom:
248
        call    dec2bin
249
        mov     [cfg_opt_used_imgfrom], 1
250
        mov     [cfg_opt_value_imgfrom], al
251
        ret
252
 
253
cfg_opt_func_syspath:
254
        mov     rdi, cfg_opt_value_syspath
255
.next_char:
256
        movzx   eax, byte[rsi]
257
        cmp     al, 0xd ; \r
258
        jz      .done
259
        cmp     al, 0xa ; \n
260
        jz      .done
261
        inc     rsi
262
        stosb
263
        jmp     .next_char
264
.done:
265
        mov     byte[rdi], 0
266
        ret
267
 
9253 dunkaist 268
proc parse_config uses rbx rsi rdi, _buffer
269
        mov     rsi, rcx
270
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
271
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
8206 dunkaist 272
                msg_parsing_config
8092 dunkaist 273
.next_line:
274
        call    parse_line
275
        cmp     byte[rsi], 0
276
        jnz     .next_line
9253 dunkaist 277
        ret
278
endp
8092 dunkaist 279
 
9253 dunkaist 280
proc read_options_from_config
281
        mov     r10, [rbx+EFI_SYSTEM_TABLE.BootServices]
282
        fstcall [r10+EFI_BOOT_SERVICES.HandleProtocol], [efi_handle], \
283
                lip_guid, lip_interface
8206 dunkaist 284
        test    eax, eax
285
        jz      @f
9253 dunkaist 286
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
287
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
8206 dunkaist 288
                msg_error_efi_lip_handle
289
        jmp     $
290
@@:
9253 dunkaist 291
        mov     r11, [lip_interface]
292
        mov     r10, [rbx+EFI_SYSTEM_TABLE.BootServices]
293
        fstcall [r10+EFI_BOOT_SERVICES.HandleProtocol], \
294
                [r11+EFI_LOADED_IMAGE_PROTOCOL.DeviceHandle], sfsp_guid, \
8092 dunkaist 295
                sfsp_interface
8206 dunkaist 296
        test    eax, eax
297
        jz      @f
9958 dunkaist 298
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
9253 dunkaist 299
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
8206 dunkaist 300
                msg_error_lip_dev_sfsp
301
        jmp     $
302
@@:
9227 dunkaist 303
        mov     r10, [sfsp_interface]
304
        fstcall [r10+EFI_SIMPLE_FILE_SYSTEM_PROTOCOL.OpenVolume], \
8092 dunkaist 305
                [sfsp_interface], esp_root
8206 dunkaist 306
        test    eax, eax
307
        jz      @f
9253 dunkaist 308
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
309
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
8206 dunkaist 310
                msg_error_sfsp_openvolume
311
        jmp     $
312
@@:
9253 dunkaist 313
        fstcall load_file, [esp_root], file_name, KERNEL_BASE, \
314
                FILE_BUFFER_SIZE, 0     ; not fatal
8092 dunkaist 315
 
316
        test    eax, eax
317
        jz      @f
9253 dunkaist 318
        fstcall parse_config, KERNEL_BASE
8092 dunkaist 319
@@:
320
 
321
.error:
322
        ret
9253 dunkaist 323
endp
8092 dunkaist 324
 
9253 dunkaist 325
proc print_vmode uses rax rbx rcx rdx rsi rdi
326
        mov     r10, rcx
8150 dunkaist 327
        call    clearbuf
9253 dunkaist 328
        mov     eax, [r10+EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.HorizontalResolution]
8150 dunkaist 329
        mov     rdi, msg
330
        call    num2dec
9253 dunkaist 331
        mov     eax, [r10+EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.VerticalResolution]
8150 dunkaist 332
        mov     rdi, msg+8*2
333
        call    num2dec
334
 
9253 dunkaist 335
        mov     eax, [r10+EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.PixelFormat]
8150 dunkaist 336
        mov     rdi, msg+16*2
337
        call    num2dec
338
 
9253 dunkaist 339
        mov     eax, [r10+EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.PixelsPerScanLine]
8150 dunkaist 340
        mov     rdi, msg+24*2
341
        call    num2dec
9253 dunkaist 342
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
343
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, msg
8150 dunkaist 344
        ret
9253 dunkaist 345
endp
8150 dunkaist 346
 
9253 dunkaist 347
proc find_vmode_index_by_resolution
8092 dunkaist 348
        mov     [cfg_opt_used_resolution], 1
349
        mov     [cfg_opt_value_vmode], 0
8150 dunkaist 350
.next_mode:
9227 dunkaist 351
        movzx   edx, [cfg_opt_value_vmode]
352
        mov     r10, [gop_interface]
353
        fstcall [r10+EFI_GRAPHICS_OUTPUT_PROTOCOL.QueryMode], [gop_interface], \
354
                rdx, gop_info_size, gop_info
8092 dunkaist 355
        cmp     rax, EFI_SUCCESS
356
        jnz     .error
357
        mov     rcx, [gop_info]
9253 dunkaist 358
        fstcall print_vmode
8092 dunkaist 359
        ; PixelBlueGreenRedReserved8BitPerColor
360
        cmp     [rcx+EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.PixelFormat], 1
361
        jnz     .skip_mode
362
        xor     edx, edx
363
        mov     eax, [rcx+EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.HorizontalResolution]
364
        cmp     ax, [rdx+BOOT_LO.x_res]
365
        jnz     .skip_mode
366
        mov     eax, [rcx+EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.VerticalResolution]
367
        cmp     ax, [rdx+BOOT_LO.y_res]
368
        jnz     .skip_mode
369
        jmp     .done
8150 dunkaist 370
.skip_mode:
8092 dunkaist 371
        inc     [cfg_opt_value_vmode]
372
        movzx   eax, [cfg_opt_value_vmode]
373
        mov     rcx, [gop_interface]
374
        mov     rdx, [rcx+EFI_GRAPHICS_OUTPUT_PROTOCOL.Mode]
8284 dunkaist 375
        cmp     eax, [rdx+EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.MaxMode]
8092 dunkaist 376
        jnz     .next_mode
377
        mov     [cfg_opt_used_resolution], 0
378
        mov     [cfg_opt_value_ask_params], 1
8150 dunkaist 379
 
9253 dunkaist 380
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
381
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
8150 dunkaist 382
                msg_error_no_such_vmode
9253 dunkaist 383
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
384
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
8206 dunkaist 385
                msg_error
8150 dunkaist 386
        jmp     $
8092 dunkaist 387
.error:
388
.done:
389
        ret
9253 dunkaist 390
endp
8092 dunkaist 391
 
392
ask_for_params:
9253 dunkaist 393
        jmp     $
8150 dunkaist 394
 
9253 dunkaist 395
proc detect_pci_config
9227 dunkaist 396
        fstcall get_protocol_interface, pcirbiop_guid
397
        mov     [pcirbiop_interface], rax
398
        mov     r10, rax
399
        fstcall [r10+EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.Configuration], r10, \
400
                pcirbiop_resources
401
;        fstcall dump_pci_resources
402
        fstcall get_last_pci_bus
403
        call    clearbuf
404
        movzx   eax, [pci_last_bus]
405
        mov     rdi, msg
406
        call    num2hex
9253 dunkaist 407
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
408
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
9227 dunkaist 409
                msg_pci_last_bus
9253 dunkaist 410
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
411
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, msg
9227 dunkaist 412
        ret
9253 dunkaist 413
endp
9227 dunkaist 414
 
415
proc get_last_pci_bus
416
        mov     rsi, [pcirbiop_resources]
417
.next_resource:
418
        cmp     [rsi+EFI_QWORD_ADDRESS_SPACE_DESCRIPTOR.Type], \
419
                EFI_RESOURCE_DESCRIPTOR_TYPE.END_TAG
420
        jz      .not_found
421
        mov     rax, [rsi+EFI_QWORD_ADDRESS_SPACE_DESCRIPTOR.RangeMaximum]
422
        cmp     [rsi+EFI_QWORD_ADDRESS_SPACE_DESCRIPTOR.ResourceType], \
423
                EFI_RESOURCE_TYPE.BUS
424
        jz      .found
425
        movzx   eax, [rsi+EFI_QWORD_ADDRESS_SPACE_DESCRIPTOR.Length]
426
        lea     rsi, [rsi+rax+3]
427
        jmp     .next_resource
428
.found:
429
        mov     [pci_last_bus], al
430
.not_found:
431
        ret
432
endp
433
 
434
proc main _efi_handle, _efi_table
8150 dunkaist 435
        mov     [efi_handle], rcx
436
        mov     [efi_table], rdx
9253 dunkaist 437
        mov     rbx, rdx
8092 dunkaist 438
 
9253 dunkaist 439
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
440
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.Reset], rcx, 1
8150 dunkaist 441
        test    eax, eax
9253 dunkaist 442
        jnz     $       ; what can I do here?
443
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
444
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
8150 dunkaist 445
                msg_u4k_loaded
8092 dunkaist 446
 
9253 dunkaist 447
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
448
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
9227 dunkaist 449
                msg_detect_pci_config
9253 dunkaist 450
        fstcall detect_pci_config
9227 dunkaist 451
 
9253 dunkaist 452
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
453
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
8150 dunkaist 454
                msg_read_options
9253 dunkaist 455
        fstcall read_options_from_config
8092 dunkaist 456
 
457
        ; read kernel file
9253 dunkaist 458
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
459
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
8150 dunkaist 460
                msg_load_kernel
9253 dunkaist 461
        fstcall load_file, [esp_root], kernel_name, KERNEL_BASE, \
462
                MAX_FILE_SIZE, 1 ; fatal
8092 dunkaist 463
 
464
        ; read ramdisk image
9253 dunkaist 465
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
466
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
8150 dunkaist 467
                msg_load_ramdisk
9253 dunkaist 468
        fstcall load_file, [esp_root], ramdisk_name, RAMDISK_BASE, \
469
                MAX_FILE_SIZE, 1 ; fatal
8092 dunkaist 470
 
471
        ; alloc buffer for devices.dat
9253 dunkaist 472
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
473
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
8150 dunkaist 474
                msg_alloc_devicesdat
9253 dunkaist 475
        mov     r10, [rbx+EFI_SYSTEM_TABLE.BootServices]
476
        fstcall [r10+EFI_BOOT_SERVICES.AllocatePages], \
8150 dunkaist 477
                EFI_ALLOCATE_MAX_ADDRESS, EFI_RESERVED_MEMORY_TYPE, 1, \
478
                devicesdat_data
8092 dunkaist 479
        cmp     eax, EFI_SUCCESS
480
        jnz     .error
481
 
482
        ; read devices.dat
9253 dunkaist 483
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
484
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
8150 dunkaist 485
                msg_load_devicesdat
486
 
9253 dunkaist 487
        fstcall load_file, [esp_root], devicesdat_name, [devicesdat_data], \
488
                [devicesdat_size], 0    ; not fatal
8092 dunkaist 489
        mov     [devicesdat_size], rax
490
 
9253 dunkaist 491
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
492
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
9227 dunkaist 493
                msg_locate_gop_interface
8150 dunkaist 494
 
9227 dunkaist 495
        fstcall get_protocol_interface, gop_guid
496
        mov     [gop_interface], rax
8150 dunkaist 497
 
9253 dunkaist 498
        fstcall find_rsdp
8150 dunkaist 499
 
9253 dunkaist 500
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
501
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
8150 dunkaist 502
                msg_acpi_tables_done
503
 
8092 dunkaist 504
        cmp     [cfg_opt_used_resolution], 0
505
        jz      .not_used_resolution
9253 dunkaist 506
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
507
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
8150 dunkaist 508
                msg_opt_resolution
509
        call    clearbuf
510
        xor     edx, edx
511
        movzx   eax, [rdx+BOOT_LO.x_res]
512
        mov     rdi, msg
513
        call    num2dec
514
        xor     edx, edx
515
        movzx   eax, [rdx+BOOT_LO.y_res]
516
        mov     rdi, msg+8*2
517
        call    num2dec
9253 dunkaist 518
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
519
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, msg
520
        fstcall find_vmode_index_by_resolution
8092 dunkaist 521
.not_used_resolution:
522
        cmp     [cfg_opt_used_debug_print], 0
523
        jz      .not_used_debug_print
524
        movzx   eax, [cfg_opt_value_debug_print]
525
        xor     edx, edx
526
        mov     [rdx+BOOT_LO.debug_print], al
527
.not_used_debug_print:
528
 
529
        cmp     [cfg_opt_value_ask_params], 0
530
        jz      @f
531
        call    ask_for_params
532
@@:
533
 
9227 dunkaist 534
        movzx   edx, [cfg_opt_value_vmode]
535
        mov     r10, [gop_interface]
536
        fstcall [r10+EFI_GRAPHICS_OUTPUT_PROTOCOL.SetMode], [gop_interface], rdx
8150 dunkaist 537
        test    eax, eax
538
        jz      @f
539
        call    clearbuf
540
        mov     rdi, msg
541
        call    num2hex
9253 dunkaist 542
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
543
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, msg
544
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
545
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
8206 dunkaist 546
                msg_error
8150 dunkaist 547
        jmp     $
548
@@:
8092 dunkaist 549
 
550
        mov     rcx, [gop_interface]
551
        mov     rdx, [rcx+EFI_GRAPHICS_OUTPUT_PROTOCOL.Mode]
552
        mov     rdi, [rdx+EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.FrameBufferBase]
553
        mov     [fb_base], rdi
554
 
9253 dunkaist 555
        mov     edx, [rdx+EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.Mode]
556
        mov     r10, [gop_interface]
557
        fstcall [r10+EFI_GRAPHICS_OUTPUT_PROTOCOL.QueryMode], [gop_interface], \
558
                rdx, gop_info_size, gop_info
8206 dunkaist 559
        test    eax, eax
560
        jz      @f
561
        jmp     .error
562
@@:
8092 dunkaist 563
        mov     rcx, [gop_info]
564
        mov     eax, [rcx+EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.HorizontalResolution]
565
        xor     rdx, rdx
566
        mov     [rdx+BOOT_LO.x_res], ax
567
        mov     eax, [rcx+EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.VerticalResolution]
568
        mov     [rdx+BOOT_LO.y_res], ax
569
        mov     eax, [rcx+EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.PixelsPerScanLine]
570
        shl     eax, 2
571
        mov     [rdx+BOOT_LO.pitch], ax
572
 
9227 dunkaist 573
        mov     [rdx+BOOT_LO.pci_data.access_mechanism], 1
574
        movzx   eax, [pci_last_bus]
575
        mov     [rdx+BOOT_LO.pci_data.last_bus], al
576
        mov     [rdx+BOOT_LO.pci_data.version], 0x0300  ; PCI 3.0
577
        mov     [rdx+BOOT_LO.pci_data.pm_entry], 0
8092 dunkaist 578
 
579
        ; kernel
9227 dunkaist 580
;        fstcall BootServices, AllocatePages, EFI_RESERVED_MEMORY_TYPE, \
8092 dunkaist 581
;                450000/0x1000, EFI_ALLOCATE_ADDRESS
582
 
583
        ; ramdisk
9227 dunkaist 584
;        fstcall BootServices, AllocatePages, EFI_RESERVED_MEMORY_TYPE, \
8092 dunkaist 585
;                2880*512/0x1000, EFI_ALLOCATE_ADDRESS
586
 
9253 dunkaist 587
        fstcall calc_memmap
9227 dunkaist 588
;        fstcall dump_memmap
8206 dunkaist 589
 
9253 dunkaist 590
        mov     r10, [rbx+EFI_SYSTEM_TABLE.BootServices]
591
        fstcall [r10+EFI_BOOT_SERVICES.ExitBootServices], [efi_handle], \
8150 dunkaist 592
                [memory_map_key]
9253 dunkaist 593
        fstcall halt_on_error
8092 dunkaist 594
 
595
        cli
596
 
597
        xor     edx, edx
598
        xor     esi, esi
9253 dunkaist 599
        mov     [rsi+BOOT_LO.bpp], 32
600
        mov     [rsi+BOOT_LO.vesa_mode], dx
601
        mov     [rsi+BOOT_LO.bank_switch], edx
8092 dunkaist 602
        mov     rdi, [fb_base]
9253 dunkaist 603
        mov     [rsi+BOOT_LO.lfb], edi
8092 dunkaist 604
 
605
        movzx   eax, [cfg_opt_value_mtrr]
9253 dunkaist 606
        mov     [rsi+BOOT_LO.mtrr], al
8092 dunkaist 607
 
608
        movzx   eax, [cfg_opt_value_launcher_start]
9253 dunkaist 609
        mov     [rsi+BOOT_LO.launcher_start], al
8092 dunkaist 610
 
611
        movzx   eax, [cfg_opt_value_debug_print]
9253 dunkaist 612
        mov     [rsi+BOOT_LO.debug_print], al
8092 dunkaist 613
 
9253 dunkaist 614
        mov     [rsi+BOOT_LO.dma], dl
615
        mov     [rsi+BOOT_LO.apm_entry], edx
616
        mov     [rsi+BOOT_LO.apm_version], dx
617
        mov     [rsi+BOOT_LO.apm_flags], dx
618
        mov     [rsi+BOOT_LO.apm_code_32], dx
619
        mov     [rsi+BOOT_LO.apm_code_16], dx
620
        mov     [rsi+BOOT_LO.apm_data_16], dx
621
        mov     [rsi+BOOT_LO.bios_hd_cnt], dl
8092 dunkaist 622
 
623
        movzx   eax, [cfg_opt_value_imgfrom]
9253 dunkaist 624
        mov     [rsi+BOOT_LO.rd_load_from], al
8092 dunkaist 625
 
626
        mov     eax, dword[devicesdat_size]
627
        mov     [rdx+BOOT_LO.devicesdat_size], eax
628
        mov     eax, dword[devicesdat_data]
629
        mov     [rdx+BOOT_LO.devicesdat_data], eax
630
 
631
        mov     rsi, cfg_opt_value_syspath
632
        mov     rdi, BOOT_LO.syspath
633
        mov     ecx, 0x17
634
        rep movsb
635
 
8656 dunkaist 636
        ; kernel trampoline
637
        mov     rsi, kernel_trampoline
638
        mov     rdi, KERNEL_TRAMPOLINE
639
        mov     ecx, kernel_trampoline.size
640
        rep movsb
8092 dunkaist 641
 
8656 dunkaist 642
        mov     rax, GDTR
643
        lgdt    [cs:rax]
644
 
8092 dunkaist 645
        mov     ax, DATA_32_SELECTOR
646
        mov     ds, ax
647
        mov     es, ax
648
        mov     fs, ax
649
        mov     gs, ax
650
        mov     ss, ax
651
 
652
        push    CODE_32_SELECTOR
8656 dunkaist 653
        mov     rax, KERNEL_TRAMPOLINE
8092 dunkaist 654
        push    rax
655
        retf
656
 
8150 dunkaist 657
.error:
9253 dunkaist 658
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
659
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
8150 dunkaist 660
                msg_error
661
        jmp     $
9227 dunkaist 662
endp
8092 dunkaist 663
 
9253 dunkaist 664
proc halt_on_error
8206 dunkaist 665
        test    eax, eax
666
        jz      @f
667
        call    clearbuf
668
        mov     rdi, msg
669
        call    num2hex
9253 dunkaist 670
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
671
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
8206 dunkaist 672
                msg_error
9253 dunkaist 673
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
674
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, msg
8206 dunkaist 675
        jmp     $
676
@@:
677
        ret
9253 dunkaist 678
endp
8206 dunkaist 679
 
9253 dunkaist 680
proc get_protocol_interface uses rsi rdi, _guid
681
locals
682
        .status dq ?
683
endl
9227 dunkaist 684
        mov     [_guid], rcx
685
        mov     [prot_handlers_buffer_size], PROTOCOL_HANDLERS_BUFFER_SIZE
9253 dunkaist 686
        mov     r10, [rbx+EFI_SYSTEM_TABLE.BootServices]
687
        fstcall [r10+EFI_BOOT_SERVICES.LocateHandle], \
9227 dunkaist 688
                EFI_LOCATE_SEARCH_TYPE.ByProtocol, [_guid], 0, \
689
                prot_handlers_buffer_size, prot_handlers_buffer
9253 dunkaist 690
        mov     [.status], rax
9227 dunkaist 691
 
9253 dunkaist 692
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
693
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
9227 dunkaist 694
                msg_protocol_buffer_size
695
        call    clearbuf
696
        mov     rax, [prot_handlers_buffer_size]
697
        mov     rdi, msg
698
        call    num2hex
9253 dunkaist 699
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
700
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, msg
9227 dunkaist 701
 
9253 dunkaist 702
        mov     rax, [.status]
9227 dunkaist 703
        test    eax, eax
704
        jz      @f
705
        call    clearbuf
706
        mov     rdi, msg
707
        call    num2hex
9253 dunkaist 708
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
709
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
9227 dunkaist 710
                msg_error
9253 dunkaist 711
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
712
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, msg
9227 dunkaist 713
        jmp     $
714
@@:
715
 
9253 dunkaist 716
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
717
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
9227 dunkaist 718
                msg_look_for_handler
719
 
9253 dunkaist 720
        mov     rsi, prot_handlers_buffer
9227 dunkaist 721
.try_next_handle:
9253 dunkaist 722
        mov     rax, rsi
9227 dunkaist 723
        mov     rcx, prot_handlers_buffer
724
        sub     rax, rcx
725
        cmp     rax, [prot_handlers_buffer_size]
726
        jb      @f
9253 dunkaist 727
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
728
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
9227 dunkaist 729
                msg_error_out_of_handlers
9253 dunkaist 730
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
731
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
9227 dunkaist 732
                msg_error
733
        jmp     $
734
@@:
9253 dunkaist 735
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
736
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
9227 dunkaist 737
                msg_query_handler
738
 
9253 dunkaist 739
        mov     r10, [rbx+EFI_SYSTEM_TABLE.BootServices]
740
        fstcall [r10+EFI_BOOT_SERVICES.HandleProtocol], qword[rsi], [_guid], \
9227 dunkaist 741
                prot_interface
742
;mov rax, 0x8000_0000_0000_0003
743
        test    eax, eax
744
        jz      @f
745
        call    clearbuf
746
        mov     rdi, msg
747
        call    num2hex
9253 dunkaist 748
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
749
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, msg
9227 dunkaist 750
 
9253 dunkaist 751
        add     rsi, 8
9227 dunkaist 752
        jmp     .try_next_handle
753
@@:
754
        mov     rax, [prot_interface]
755
        ret
756
endp
757
 
758
 
9253 dunkaist 759
proc find_rsdp uses rsi rdi
760
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
761
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
8206 dunkaist 762
                msg_look_for_rsdp
763
 
764
        mov     rdi, [rbx+EFI_SYSTEM_TABLE.ConfigurationTable]
765
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.NumberOfTableEntries]
766
        mov     rax, 0x11d3e4f18868e871
767
        mov     rdx, 0x81883cc7800022bc
768
.next_table:
769
        dec     ecx
770
        js      .all_tables_done
771
        cmp     [rdi+0], rax
772
        jnz     .not_acpi20
773
        cmp     [rdi+8], rdx
774
        jnz     .not_acpi20
775
        mov     rax, [rdi+16]
776
        mov     rdx, BOOT_LO.acpi_rsdp
777
        mov     [rdx], eax
778
        jmp     .all_tables_done
779
.not_acpi20:
780
        add     rdi, 24
781
        jmp     .next_table
782
.all_tables_done:
783
        ret
9253 dunkaist 784
endp
8206 dunkaist 785
 
9253 dunkaist 786
proc dump_pci_resources uses rsi rdi
9227 dunkaist 787
        xor     eax, eax
788
        mov     rsi, [pcirbiop_resources]
9253 dunkaist 789
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
790
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
9227 dunkaist 791
                msg_dump_pci_resources
792
.next_resource:
793
        call    clearbuf
794
        movzx   eax, [rsi+EFI_QWORD_ADDRESS_SPACE_DESCRIPTOR.Type]
795
        cmp     eax, EFI_RESOURCE_DESCRIPTOR_TYPE.END_TAG
796
        jz      .done
797
        mov     rdi, msg
798
        call    num2hex
9253 dunkaist 799
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
800
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, msg
9227 dunkaist 801
        call    clearbuf
802
        movzx   eax, [rsi+EFI_QWORD_ADDRESS_SPACE_DESCRIPTOR.ResourceType]
803
        mov     rdi, msg
804
        call    num2dec
805
        mov     rax, [rsi+EFI_QWORD_ADDRESS_SPACE_DESCRIPTOR.RangeMinimum]
806
        mov     rdi, msg+2*2
807
        call    num2hex
808
        mov     rax, [rsi+EFI_QWORD_ADDRESS_SPACE_DESCRIPTOR.RangeMaximum]
809
        mov     rdi, msg+19*2
810
        call    num2hex
811
        mov     rax, [rsi+EFI_QWORD_ADDRESS_SPACE_DESCRIPTOR.TranslationOffset]
812
        mov     rdi, msg+36*2
813
        call    num2hex
814
        mov     rax, [rsi+EFI_QWORD_ADDRESS_SPACE_DESCRIPTOR.AddressLength]
815
        mov     rdi, msg+53*2
816
        call    num2hex
9253 dunkaist 817
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
818
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, msg
9227 dunkaist 819
        movzx   eax, [rsi+EFI_QWORD_ADDRESS_SPACE_DESCRIPTOR.Length]
820
        add     eax, 3
821
        add     rsi, rax
822
        jmp     .next_resource
823
.done:
824
        ret
825
endp
826
 
9253 dunkaist 827
proc calc_memmap uses rsi rdi
828
        mov     r10, [rbx+EFI_SYSTEM_TABLE.BootServices]
829
        fstcall [r10+EFI_BOOT_SERVICES.AllocatePages], EFI_ALLOCATE_ANY_PAGES, \
8206 dunkaist 830
                EFI_RESERVED_MEMORY_TYPE, MEMORY_MAP_SIZE/0x1000, memory_map
831
        call    halt_on_error
832
 
9253 dunkaist 833
        mov     r10, [rbx+EFI_SYSTEM_TABLE.BootServices]
834
        fstcall [r10+EFI_BOOT_SERVICES.GetMemoryMap], memory_map_size, \
8206 dunkaist 835
                [memory_map], memory_map_key, descriptor_size, descriptor_ver
836
        call    halt_on_error
837
 
838
        mov     rdi, BOOT_LO.memmap_blocks
8220 dunkaist 839
        mov     dword[rdi-4], 0 ; memmap_block_cnt
8206 dunkaist 840
        mov     rsi, [memory_map]
9253 dunkaist 841
        mov     r10, rsi
842
        add     r10, [memory_map_size]
8206 dunkaist 843
.next_descr:
9253 dunkaist 844
        fstcall add_uefi_memmap
8206 dunkaist 845
        add     rsi, [descriptor_size]
9253 dunkaist 846
        cmp     rsi, r10
8220 dunkaist 847
        jb      .next_descr
8206 dunkaist 848
        ret
9253 dunkaist 849
endp
8206 dunkaist 850
 
9253 dunkaist 851
proc dump_memmap uses rsi rdi
8206 dunkaist 852
        xor     eax, eax
853
        mov     rsi, BOOT_LO.memmap_blocks
9253 dunkaist 854
        mov     r12, [rax+BOOT_LO.memmap_block_cnt]
8206 dunkaist 855
 
856
        call    clearbuf
857
        mov     eax, ebx
858
        mov     rdi, msg
859
        call    num2dec
9253 dunkaist 860
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
861
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, \
8206 dunkaist 862
                msg_memmap
9253 dunkaist 863
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
864
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, msg
8206 dunkaist 865
        call    clearbuf
866
.next_mapping:
9253 dunkaist 867
        dec     r12d
8206 dunkaist 868
        js      .done
869
        mov     rax, rsi
870
        mov     rcx, BOOT_LO.memmap_blocks
871
        sub     rax, rcx
872
        mov     ecx, sizeof.e820entry
873
        xor     edx, edx
874
        div     ecx
875
        mov     rdi, msg
876
        call    num2dec
877
        mov     rax, [rsi+e820entry.addr]
878
        mov     rdi, msg+4*2
879
        call    num2hex
880
        mov     rax, [rsi+e820entry.size]
881
        mov     rdi, msg+24*2
882
        call    num2hex
9253 dunkaist 883
        mov     rcx, [rbx+EFI_SYSTEM_TABLE.ConOut]
884
        fstcall [rcx+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], rcx, msg
8206 dunkaist 885
        add     rsi, sizeof.e820entry
886
        jmp     .next_mapping
887
.done:
888
        ret
9227 dunkaist 889
endp
8206 dunkaist 890
 
8092 dunkaist 891
; linux/arch/x86/platform/efi/efi.c
892
; do_add_efi_memmap
9253 dunkaist 893
proc add_uefi_memmap
8220 dunkaist 894
        xor     eax, eax
895
        cmp     [rax+BOOT_LO.memmap_block_cnt], MAX_MEMMAP_BLOCKS
896
        jz      .done
8092 dunkaist 897
 
8220 dunkaist 898
        mov     rax, [rsi+EFI_MEMORY_DESCRIPTOR.PhysicalStart]
899
        mov     [rdi+e820entry.addr], rax
8092 dunkaist 900
 
8220 dunkaist 901
        mov     rax, [rsi+EFI_MEMORY_DESCRIPTOR.NumberOfPages]
8092 dunkaist 902
        shl     rax, 12
903
        mov     [rdi+e820entry.size], rax
904
 
8220 dunkaist 905
        mov     ecx, [rsi+EFI_MEMORY_DESCRIPTOR.Type]
906
        cmp     ecx, EFI_LOADER_CODE
907
        jz      .mem_ram_if_wb
908
        cmp     ecx, EFI_LOADER_DATA
909
        jz      .mem_ram_if_wb
910
        cmp     ecx, EFI_BOOT_SERVICES_CODE
911
        jz      .mem_ram_if_wb
912
        cmp     ecx, EFI_BOOT_SERVICES_DATA
913
        jz      .mem_ram_if_wb
914
        cmp     ecx, EFI_CONVENTIONAL_MEMORY
915
        jz      .mem_ram_if_wb
916
        cmp     ecx, EFI_ACPI_RECLAIM_MEMORY
8092 dunkaist 917
        mov     eax, E820_ACPI
8220 dunkaist 918
        jz      .type_done
919
        cmp     ecx, EFI_ACPI_MEMORY_NVS
8092 dunkaist 920
        mov     eax, E820_NVS
8220 dunkaist 921
        jz      .type_done
922
        cmp     ecx, EFI_UNUSABLE_MEMORY
8092 dunkaist 923
        mov     eax, E820_UNUSABLE
8220 dunkaist 924
        jz      .type_done
925
        cmp     ecx, EFI_PERSISTENT_MEMORY
8092 dunkaist 926
        mov     eax, E820_PMEM
8220 dunkaist 927
        jz      .type_done
928
        jmp     .reserved
929
.mem_ram_if_wb:
930
        test    [rsi+EFI_MEMORY_DESCRIPTOR.Attribute], dword EFI_MEMORY_WB
931
        mov     eax, E820_RAM
932
        jnz     .type_done
933
.reserved:
8092 dunkaist 934
        mov     eax, E820_RESERVED
8220 dunkaist 935
.type_done:
936
        mov     [rdi+e820entry.type], eax
937
        cmp     eax, E820_RAM
938
        jnz     @f
939
        xor     eax, eax
940
        inc     [rax+BOOT_LO.memmap_block_cnt]
941
        add     rdi, sizeof.e820entry
942
@@:
8150 dunkaist 943
.done:
8092 dunkaist 944
        ret
9253 dunkaist 945
endp
8092 dunkaist 946
 
947
num2dec:
9253 dunkaist 948
        push    rbx rcx rdx rdi
8092 dunkaist 949
 
950
        xor     ecx, ecx
951
        mov     ebx, 10
8150 dunkaist 952
.next_digit:
8092 dunkaist 953
        xor     edx, edx
954
        div     ebx
955
        push    rdx
956
        inc     ecx
957
        test    eax, eax
958
        jnz     .next_digit
959
 
8150 dunkaist 960
.next_char:
8092 dunkaist 961
        pop     rax
962
        add     eax, '0'
963
        stosw
964
        loop    .next_char
965
 
9253 dunkaist 966
        pop     rdi rdx rcx rbx
8092 dunkaist 967
        ret
968
 
969
 
970
num2hex:
9253 dunkaist 971
        push    rbx rcx rdx rdi
8092 dunkaist 972
 
973
        xchg    rdx, rax
974
        mov     ecx, 16
8150 dunkaist 975
.next_tetra:
8092 dunkaist 976
        rol     rdx, 4
977
        movzx   eax, dl
978
        and     eax, 0x0f
9253 dunkaist 979
        movzx   eax, byte[hex_abc+eax]
8092 dunkaist 980
        stosw
981
        loop    .next_tetra
982
 
9253 dunkaist 983
        pop     rdi rdx rcx rbx
8092 dunkaist 984
        ret
985
 
986
clearbuf:
9253 dunkaist 987
        push    rcx rdi
988
        mov     eax, ' '
8092 dunkaist 989
        mov     ecx, 79
990
        mov     rdi, msg
991
        rep stosw
9253 dunkaist 992
        pop     rdi rcx
8092 dunkaist 993
        ret
994
 
8656 dunkaist 995
use32
996
kernel_trampoline:
997
org KERNEL_TRAMPOLINE
998
        mov     eax, cr0
999
        and     eax, not CR0_PG
1000
        mov     cr0, eax
1001
 
1002
        mov     ecx, MSR_AMD_EFER
1003
        rdmsr
1004
        btr     eax, 8                  ; LME
1005
        wrmsr
1006
 
1007
        mov     eax, cr4
1008
        and     eax, not CR4_PAE
1009
        mov     cr4, eax
1010
 
9958 dunkaist 1011
        mov     eax, KERNEL_BASE
1012
        ; add the 32-bit entry point
1013
        add     eax, [eax+kernel_header.b32_offset]
1014
        push    eax
8656 dunkaist 1015
        retn
1016
 
8284 dunkaist 1017
align 16
8092 dunkaist 1018
GDTR:
1019
        dw 4*8-1
1020
        dq GDT
8284 dunkaist 1021
align 16
8092 dunkaist 1022
GDT:
1023
        dw 0, 0, 0, 0
1024
        dw 0FFFFh,0,9A00h,0CFh          ; 32-bit code
1025
        dw 0FFFFh,0,9200h,0CFh          ; flat data
1026
        dw 0FFFFh,0,9A00h,0AFh          ; 64-bit code
8656 dunkaist 1027
assert $ < BOOT_LO
1028
kernel_trampoline.size = $ - KERNEL_TRAMPOLINE
8092 dunkaist 1029
 
8656 dunkaist 1030
section '.rodata' data readable
9227 dunkaist 1031
gop_guid        db EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID
1032
lip_guid        db EFI_LOADED_IMAGE_PROTOCOL_GUID
1033
sfsp_guid       db EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID
1034
pcirbiop_guid   db EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_GUID
8092 dunkaist 1035
 
8150 dunkaist 1036
file_name       du '\EFI\KOLIBRIOS\KOLIBRI.INI',0
1037
kernel_name     du '\EFI\KOLIBRIOS\KOLIBRI.KRN',0
1038
ramdisk_name    du '\EFI\KOLIBRIOS\KOLIBRI.IMG',0
1039
devicesdat_name du '\EFI\KOLIBRIOS\DEVICES.DAT',0
8092 dunkaist 1040
 
1041
config_options  dq cfg_opt_name_resolution, cfg_opt_func_resolution, \
1042
                   cfg_opt_cmnt_resolution, \
1043
                   cfg_opt_name_acpi,  cfg_opt_func_acpi, cfg_opt_cmnt_acpi, \
1044
                   cfg_opt_name_debug_print, cfg_opt_func_debug_print, \
1045
                   cfg_opt_cmnt_debug_print, \
1046
                   cfg_opt_name_launcher_start, cfg_opt_func_launcher_start, \
1047
                   cfg_opt_cmnt_launcher_start, \
1048
                   cfg_opt_name_mtrr,  cfg_opt_func_mtrr, cfg_opt_cmnt_mtrr, \
1049
                   cfg_opt_name_ask_params,  cfg_opt_func_ask_params, \
1050
                   cfg_opt_cmnt_ask_params, \
1051
                   cfg_opt_name_imgfrom, cfg_opt_func_imgfrom, \
1052
                   cfg_opt_cmnt_imgfrom, \
1053
                   cfg_opt_name_syspath, cfg_opt_func_syspath, \
1054
                   cfg_opt_cmnt_syspath, \
1055
 
1056
 
8150 dunkaist 1057
cfg_opt_name_resolution     db "resolution",0
1058
cfg_opt_name_acpi           db "acpi",0
1059
cfg_opt_name_debug_print    db "debug_print",0
1060
cfg_opt_name_launcher_start db "launcher_start",0
1061
cfg_opt_name_mtrr           db "mtrr",0
1062
cfg_opt_name_ask_params     db "ask_params",0
1063
cfg_opt_name_imgfrom        db "imgfrom",0
1064
cfg_opt_name_syspath        db "syspath",0
8092 dunkaist 1065
 
8150 dunkaist 1066
cfg_opt_cmnt_resolution     db "# Graphic mode",0
1067
cfg_opt_cmnt_acpi           db "# ACPI settings",0xa, \
1068
                               "#   0: don't use",0xa, \
1069
                               "#   1: parse ACPI tables",0xa, \
1070
                               "#   2: + call _PIC method",0xa, \
1071
                               "#   3: + get APIC interrupts",0xa,0
1072
cfg_opt_cmnt_debug_print    db "# Duplicate debug output to the screen",0
8092 dunkaist 1073
cfg_opt_cmnt_launcher_start db "# Start LAUNCHER app after kernel is loaded",0
8150 dunkaist 1074
cfg_opt_cmnt_mtrr           db "# Configure MTRR's",0
1075
cfg_opt_cmnt_ask_params     db "# Interrupt booting to ask the user for boot", \
1076
                               " params",0
1077
cfg_opt_cmnt_imgfrom        db "# Where to load ramdisk image from",0
1078
cfg_opt_cmnt_syspath        db "# Path to /sys directory",0
8092 dunkaist 1079
 
8150 dunkaist 1080
msg_u4k_loaded            du "uefi64kos loaded",13,10,0
9227 dunkaist 1081
msg_detect_pci_config     du "Detect PCI configuration",13,10,0
1082
msg_dump_pci_resources    du "Dump PCI resources",13,10,0
1083
msg_pci_last_bus          du "Last PCI bus",13,10,0
8150 dunkaist 1084
msg_read_options          du "Read options from config file",13,10,0
8206 dunkaist 1085
msg_file_size             du "File size:",13,10,0
1086
msg_parsing_config        du "Parsing config file",13,10,0
8150 dunkaist 1087
msg_load_kernel           du "Load kernel",13,10,0
1088
msg_load_ramdisk          du "Load ramdisk",13,10,0
1089
msg_load_devicesdat       du "Load DEVICES.DAT",13,10,0
1090
msg_alloc_devicesdat      du "Allocate memory for DEVICES.DAT",13,10,0
9227 dunkaist 1091
msg_locate_gop_interface  du "Locate GOP interface",13,10,0
1092
msg_look_for_handler      du "Look for protocol handler",13,10,0
8150 dunkaist 1093
msg_query_handler         du "Query handler",13,10,0
1094
msg_query_vmode           du "Query vmode",13,10,0
1095
msg_vmode_found           du "Video mode found",13,10,0
1096
msg_look_for_rsdp         du "Look for RSDP",13,10,0
1097
msg_rsdp_found            du "RSDP found",13,10,0
1098
msg_acpi_tables_done      du "ACPI tables done",13,10,0
1099
msg_ask_for_params        du "Ask for params",13,10,0
1100
msg_set_graphic_mode      du "Set graphic mode",13,10,0
1101
msg_success               du "Success!",13,10,0
9227 dunkaist 1102
msg_protocol_buffer_size  du "Protocol buffer size",13,10,0
8206 dunkaist 1103
msg_opt_resolution        du "Option resolution: ",0
1104
msg_memmap                du "Memmap",13,10,0
8150 dunkaist 1105
msg_error                 du "Error!",13,10,0
8206 dunkaist 1106
msg_error_efi_lip_handle  du "efi_handle can't handle LIP",13,10,0
1107
msg_error_lip_dev_sfsp    du "LIP device handle can't handle SFSP",13,10,0
1108
msg_error_sfsp_openvolume du "SFSP OpenVolume failed",13,10,0
8150 dunkaist 1109
msg_error_no_such_vmode   du "No such vmode",13,10,0
1110
msg_error_out_of_handlers du "Out of handlers",13,10,0
1111
msg_error_open_file       du "Error: can't open file ",0
8206 dunkaist 1112
msg_error_exit_boot_services du "Error: Exit boot services",13,10,0
8150 dunkaist 1113
msg                       du 79 dup " ",13,10,0
9253 dunkaist 1114
msg_debug                 du "Debug ",13,10,0
8092 dunkaist 1115
 
8284 dunkaist 1116
section '.data' data readable writeable
1117
efi_handle  dq 0
1118
efi_table   dq 0
1119
 
1120
fb_base         dq 0
1121
 
1122
gop_interface   dq 0
1123
gop_info_size   dq 0
1124
gop_info        dq 0
1125
 
1126
lip_interface   dq 0
1127
 
1128
sfsp_interface  dq 0
1129
 
9227 dunkaist 1130
pci_last_bus db 254
1131
 
8284 dunkaist 1132
cfg_opt_used_resolution     db 0
1133
cfg_opt_used_acpi           db 0
1134
cfg_opt_used_debug_print    db 0
1135
cfg_opt_used_launcher_start db 0
1136
cfg_opt_used_mtrr           db 0
1137
cfg_opt_used_ask_params     db 0
1138
cfg_opt_used_imgfrom        db 0
1139
cfg_opt_used_syspath        db 0
1140
 
1141
cfg_opt_value_vmode          db 0
1142
cfg_opt_value_acpi           db 0
1143
cfg_opt_value_debug_print    db 0
1144
cfg_opt_value_launcher_start db 1
1145
cfg_opt_value_mtrr           db 0
1146
cfg_opt_value_ask_params     db 0
1147
cfg_opt_value_imgfrom        db RD_LOAD_FROM_MEMORY
1148
cfg_opt_value_syspath        db "/RD/1",0
1149
                             rb 20
1150
 
1151
memory_map_key  dq 0
1152
descriptor_size dq 0
1153
descriptor_ver  dq 0
1154
memory_map_size dq MEMORY_MAP_SIZE
1155
 
8092 dunkaist 1156
efi_fs_info_id db EFI_FILE_SYSTEM_INFO_ID
1157
efi_fs_info_size dq sizeof.EFI_FILE_SYSTEM_INFO
9253 dunkaist 1158
 
1159
devicesdat_data dq 0xffffffff
1160
devicesdat_size dq 0x1000
1161
 
1162
hex_abc db '0123456789ABCDEF'
1163
 
1164
section '.bss' data readable writeable discardable
1165
prot_handlers_buffer_size dq ?
1166
prot_interface  dq ?
1167
esp_root        dq ?
1168
file_handle     dq ?
1169
pcirbiop_interface dq ?
1170
pcirbiop_resources dq ?
8092 dunkaist 1171
efi_fs_info EFI_FILE_SYSTEM_INFO
1172
memory_map      dq ?
9227 dunkaist 1173
prot_handlers_buffer rq PROTOCOL_HANDLERS_BUFFER_SIZE/8
1174
pcirbio_buffer  rq PROTOCOL_HANDLERS_BUFFER_SIZE/8
8092 dunkaist 1175
 
1176
section '.reloc' fixups data discardable