Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

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