Subversion Repositories Kolibri OS

Rev

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