Subversion Repositories Kolibri OS

Rev

Rev 7731 | Go to most recent revision | Details | Compare with Previous | 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
6
 
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
 
207
        mov     rsi, kernel_bin_data_begin
208
        mov     rdi, KERNEL_BASE
209
        mov     rcx, (kernel_bin_data_end - kernel_bin_data_begin + 7) / 8
210
        rep movsq
211
 
212
        mov     rsi, kolibri_img_data_begin
213
        mov     rdi, RAMDISK_BASE
214
        mov     rcx, (kolibri_img_data_end - kolibri_img_data_begin + 7 ) / 8
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
8089 dunkaist 235
        mov     word[esi + BOOT_LO.sys_disk], 'r1'   ; boot from /rd/1
7130 dunkaist 236
 
237
 
238
        lgdt    [cs:GDTR]
239
 
240
        mov     ax, DATA_32_SELECTOR
241
        mov     ds, ax
242
        mov     es, ax
243
        mov     fs, ax
244
        mov     gs, ax
245
        mov     ss, ax
246
 
247
        push    CODE_32_SELECTOR
248
        lea     rax, [.next]
249
        push    rax
250
;        push    .next
251
        retf
252
use32
253
align 16
254
  .next:
255
        mov     eax, cr0
256
        and     eax, not CR0_PG
257
        mov     cr0, eax
258
 
259
        mov     ecx, MSR_AMD_EFER
260
        rdmsr
261
        btr     eax, 8                  ; LME
262
        wrmsr
263
 
264
        mov     eax, cr4
265
        and     eax, not CR4_PAE
266
        mov     cr4, eax
267
 
268
        push    KERNEL_BASE
269
        retn
270
 
271
use64
272
  .error:
273
        uefi_call_wrapper ConOut, OutputString, ConOut, msg_error
274
        jmp     .quit
275
  .quit:
276
        mov     rcx, -1
277
        loop    $
278
 
279
 
280
; linux/arch/x86/platform/efi/efi.c
281
; do_add_efi_memmap
282
add_uefi_memmap:
283
        push    rax rbx rcx rdx rsi rdi
284
 
285
        mov     r10d, [rsi + 0]
286
        mov     r11, [rsi + 8]
287
;        mov     r12, [rsi + 16]
288
        mov     r13, [rsi + 24]
289
        mov     r14, [rsi + 32]
290
 
291
        mov     [rdi + e820entry.addr], r11
292
        mov     rax, r13
293
        shl     rax, 12
294
        mov     [rdi + e820entry.size], rax
295
 
296
 
297
        cmp     r10d, EFI_LOADER_CODE
298
        jz      .case0
299
        cmp     r10d, EFI_LOADER_DATA
300
        jz      .case0
301
        cmp     r10d, EFI_BOOT_SERVICES_CODE
302
        jz      .case0
303
        cmp     r10d, EFI_BOOT_SERVICES_DATA
304
        jz      .case0
305
        cmp     r10d, EFI_CONVENTIONAL_MEMORY
306
        jz      .case0
307
        cmp     r10d, EFI_ACPI_RECLAIM_MEMORY
308
        jz      .case1
309
        cmp     r10d, EFI_ACPI_MEMORY_NVS
310
        jz      .case2
311
        cmp     r10d, EFI_UNUSABLE_MEMORY
312
        jz      .case3
313
        cmp     r10d, EFI_PERSISTENT_MEMORY
314
        jz      .case4
315
        jmp     .default
316
 
317
  .case0:
318
        test    r14, EFI_MEMORY_WB
319
        jz      @f
320
        mov     eax, E820_RAM
321
        jmp     .done
322
    @@:
323
        mov     eax, E820_RESERVED
324
        jmp     .done
325
  .case1:
326
        mov     eax, E820_ACPI
327
        jmp     .done
328
  .case2:
329
        mov     eax, E820_NVS
330
        jmp     .done
331
  .case3:
332
        mov     eax, E820_UNUSABLE
333
        jmp     .done
334
  .case4:
335
        mov     eax, E820_PMEM
336
        jmp     .done
337
  .default:
338
        mov     eax, E820_RESERVED
339
        jmp     .done
340
 
341
  .done:
342
        mov     [rdi + e820entry.type], eax
343
 
7132 dunkaist 344
        mov     rax, BOOT_LO.memmap_block_cnt
7130 dunkaist 345
        inc     word[rax]
346
 
347
        pop     rdi rsi rdx rcx rbx rax
348
        ret
349
 
350
 
351
num2dec:
352
        push    rax rbx rcx rdx rsi rdi
353
 
354
        xor     ecx, ecx
355
        mov     ebx, 10
356
  .next_digit:
357
        xor     edx, edx
358
        div     ebx
359
        push    rdx
360
        inc     ecx
361
        test    eax, eax
362
        jnz     .next_digit
363
 
364
  .next_char:
365
        pop     rax
366
        add     eax, '0'
367
        stosw
368
        loop    .next_char
369
 
370
        pop     rdi rsi rdx rcx rbx rax
371
        ret
372
 
373
 
374
num2hex:
375
        push    rax rbx rcx rdx rsi rdi
376
 
377
        xchg    rdx, rax
378
        mov     ecx, 16
379
  .next_tetra:
380
        rol     rdx, 4
381
        movzx   eax, dl
382
        and     eax, 0x0f
383
        movzx   eax, byte[hex+eax]
384
        stosw
385
        loop    .next_tetra
386
 
387
        pop     rdi rsi rdx rcx rbx rax
388
        ret
389
 
390
hex db '0123456789ABCDEF'
391
 
392
clearbuf:
393
        push    rax rbx rcx rdx rsi rdi
394
        mov     eax, 0x0020
395
        mov     ecx, 79
396
        mov     rdi, msg
397
        rep stosw
398
        pop     rdi rsi rdx rcx rbx rax
399
        ret
400
 
401
section '.data' data readable writeable
402
 
403
GDTR:
404
        dw 4*8-1
405
        dq GDT
406
GDT:
407
        dw 0, 0, 0, 0
408
        dw 0FFFFh,0,9A00h,0CFh          ; 32-bit code
409
        dw 0FFFFh,0,9200h,0CFh          ; flat data
410
        dw 0FFFFh,0,9A00h,0AFh          ; 64-bit code
411
 
412
 
413
fb_base         dq 0
414
 
415
gopuuid         db EFI_GRAPHICS_OUTPUT_PROTOCOL_UUID
416
gop_buffer_size dq GOP_BUFFER_SIZE
417
gop_handle      dq 0
418
gop_interface   dq 0
419
gop_info_size   dq 0
420
gop_info        dq 0
421
 
422
memory_map_key  dq 0
423
descriptor_size dq 0
424
descriptor_ver  dq 0
425
memory_map_size dq MEMORY_MAP_SIZE
426
 
427
msg_success     du 'Success!',13,10,0
428
msg_error       du 'Error!',13,10,0
429
msg             du 79 dup ' ',13,10,0
430
 
431
memory_map      rb MEMORY_MAP_SIZE
432
gop_buffer      rb GOP_BUFFER_SIZE
433
 
434
 
435
kernel_bin_data_begin:
436
file '../kernel.bin'
437
kernel_bin_data_end:
438
 
439
kolibri_img_data_begin:
440
file '../../../data/kolibri.img'
441
kolibri_img_data_end:
442
 
443
align 16
444
data fixups
445
end data