forked from KolibriOS/kolibrios
uefi4kos: Fix memmap conversion from uefi to e820 format.
git-svn-id: svn://kolibrios.org@8220 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
4982b912eb
commit
6a975ff76a
@ -425,8 +425,7 @@ main:
|
|||||||
ccall [eax+EFI_BOOT_SERVICES.AllocatePages], \
|
ccall [eax+EFI_BOOT_SERVICES.AllocatePages], \
|
||||||
EFI_ALLOCATE_MAX_ADDRESS, EFI_RESERVED_MEMORY_TYPE, 1, \
|
EFI_ALLOCATE_MAX_ADDRESS, EFI_RESERVED_MEMORY_TYPE, 1, \
|
||||||
devicesdat_data
|
devicesdat_data
|
||||||
test eax, eax
|
call halt_on_error
|
||||||
jnz .error
|
|
||||||
|
|
||||||
mov eax, [esi+EFI_SYSTEM_TABLE.ConOut]
|
mov eax, [esi+EFI_SYSTEM_TABLE.ConOut]
|
||||||
ccall [eax+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], eax, \
|
ccall [eax+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], eax, \
|
||||||
@ -457,17 +456,7 @@ main:
|
|||||||
ccall [eax+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], eax, msg
|
ccall [eax+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], eax, msg
|
||||||
|
|
||||||
mov eax, [status]
|
mov eax, [status]
|
||||||
test eax, eax
|
call halt_on_error
|
||||||
jz @f
|
|
||||||
call clearbuf
|
|
||||||
mov edi, msg
|
|
||||||
call num2hex
|
|
||||||
mov eax, [esi+EFI_SYSTEM_TABLE.ConOut]
|
|
||||||
ccall [eax+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], eax, msg_error
|
|
||||||
mov eax, [esi+EFI_SYSTEM_TABLE.ConOut]
|
|
||||||
ccall [eax+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], eax, msg
|
|
||||||
jmp $
|
|
||||||
@@:
|
|
||||||
|
|
||||||
mov eax, [esi+EFI_SYSTEM_TABLE.ConOut]
|
mov eax, [esi+EFI_SYSTEM_TABLE.ConOut]
|
||||||
ccall [eax+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], eax, \
|
ccall [eax+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], eax, \
|
||||||
@ -506,36 +495,7 @@ main:
|
|||||||
jmp .next_gop_handle
|
jmp .next_gop_handle
|
||||||
@@:
|
@@:
|
||||||
|
|
||||||
mov eax, [esi+EFI_SYSTEM_TABLE.ConOut]
|
call find_rsdp
|
||||||
ccall [eax+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], eax, \
|
|
||||||
msg_look_for_rsdp
|
|
||||||
|
|
||||||
mov ebx, [efi_table]
|
|
||||||
mov edi, [ebx+EFI_SYSTEM_TABLE.ConfigurationTable]
|
|
||||||
mov ecx, [ebx+EFI_SYSTEM_TABLE.NumberOfTableEntries]
|
|
||||||
.next_table:
|
|
||||||
dec ecx
|
|
||||||
js .all_tables_done
|
|
||||||
; EFI_ACPI_TABLE_GUID
|
|
||||||
cmp dword[edi+EFI_CONFIGURATION_TABLE.VendorGUID+0x0], 0x8868e871
|
|
||||||
jnz .not_acpi20
|
|
||||||
cmp dword[edi+EFI_CONFIGURATION_TABLE.VendorGUID+0x4], 0x11d3e4f1
|
|
||||||
jnz .not_acpi20
|
|
||||||
cmp dword[edi+EFI_CONFIGURATION_TABLE.VendorGUID+0x8], 0x800022bc
|
|
||||||
jnz .not_acpi20
|
|
||||||
cmp dword[edi+EFI_CONFIGURATION_TABLE.VendorGUID+0xc], 0x81883cc7
|
|
||||||
jnz .not_acpi20
|
|
||||||
mov eax, [edi+EFI_CONFIGURATION_TABLE.VendorTable]
|
|
||||||
mov edx, BOOT_LO.acpi_rsdp
|
|
||||||
mov [edx], eax
|
|
||||||
mov eax, [esi+EFI_SYSTEM_TABLE.ConOut]
|
|
||||||
ccall [eax+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], eax, \
|
|
||||||
msg_rsdp_found
|
|
||||||
jmp .all_tables_done
|
|
||||||
.not_acpi20:
|
|
||||||
add edi, sizeof.EFI_CONFIGURATION_TABLE
|
|
||||||
jmp .next_table
|
|
||||||
.all_tables_done:
|
|
||||||
|
|
||||||
mov eax, [esi+EFI_SYSTEM_TABLE.ConOut]
|
mov eax, [esi+EFI_SYSTEM_TABLE.ConOut]
|
||||||
ccall [eax+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], eax, \
|
ccall [eax+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], eax, \
|
||||||
@ -575,17 +535,7 @@ main:
|
|||||||
movzx ecx, [cfg_opt_value_vmode]
|
movzx ecx, [cfg_opt_value_vmode]
|
||||||
mov eax, [gop_interface]
|
mov eax, [gop_interface]
|
||||||
ccall [eax+EFI_GRAPHICS_OUTPUT_PROTOCOL.SetMode], eax, ecx
|
ccall [eax+EFI_GRAPHICS_OUTPUT_PROTOCOL.SetMode], eax, ecx
|
||||||
test eax, eax
|
call halt_on_error
|
||||||
jz @f
|
|
||||||
call clearbuf
|
|
||||||
mov edi, msg
|
|
||||||
call num2hex
|
|
||||||
mov eax, [esi+EFI_SYSTEM_TABLE.ConOut]
|
|
||||||
ccall [eax+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], eax, msg
|
|
||||||
mov eax, [esi+EFI_SYSTEM_TABLE.ConOut]
|
|
||||||
ccall [eax+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], eax, msg_error
|
|
||||||
jmp $
|
|
||||||
@@:
|
|
||||||
|
|
||||||
mov ecx, [gop_interface]
|
mov ecx, [gop_interface]
|
||||||
mov edx, [ecx+EFI_GRAPHICS_OUTPUT_PROTOCOL.Mode]
|
mov edx, [ecx+EFI_GRAPHICS_OUTPUT_PROTOCOL.Mode]
|
||||||
@ -615,44 +565,6 @@ main:
|
|||||||
mov byte[edx+BOOT_LO.pci_data+3], 0x02
|
mov byte[edx+BOOT_LO.pci_data+3], 0x02
|
||||||
mov dword[edx+BOOT_LO.pci_data+4], 0xe3
|
mov dword[edx+BOOT_LO.pci_data+4], 0xe3
|
||||||
|
|
||||||
|
|
||||||
mov eax, [efi_table]
|
|
||||||
mov eax, [eax+EFI_SYSTEM_TABLE.BootServices]
|
|
||||||
ccall [eax+EFI_BOOT_SERVICES.AllocatePages], \
|
|
||||||
EFI_ALLOCATE_ANY_PAGES, EFI_RESERVED_MEMORY_TYPE, \
|
|
||||||
MEMORY_MAP_SIZE/0x1000, memory_map
|
|
||||||
test eax, eax
|
|
||||||
jnz .error
|
|
||||||
|
|
||||||
mov eax, [efi_table]
|
|
||||||
mov eax, [eax+EFI_SYSTEM_TABLE.BootServices]
|
|
||||||
ccall [eax+EFI_BOOT_SERVICES.GetMemoryMap], memory_map_size, \
|
|
||||||
[memory_map], memory_map_key, descriptor_size, descriptor_ver
|
|
||||||
test eax, eax
|
|
||||||
jnz .error
|
|
||||||
|
|
||||||
mov edi, BOOT_LO.memmap_block_cnt
|
|
||||||
mov dword[edi], 0
|
|
||||||
mov edi, BOOT_LO.memmap_blocks
|
|
||||||
mov eax, [memory_map_size]
|
|
||||||
xor edx, edx
|
|
||||||
mov ecx, [descriptor_size]
|
|
||||||
div ecx
|
|
||||||
mov ecx, eax
|
|
||||||
cmp ecx, MAX_MEMMAP_BLOCKS
|
|
||||||
jbe @f
|
|
||||||
mov ecx, MAX_MEMMAP_BLOCKS
|
|
||||||
@@:
|
|
||||||
xor eax, eax
|
|
||||||
mov [eax+BOOT_LO.memmap_block_cnt], 0
|
|
||||||
mov esi, [memory_map]
|
|
||||||
.next_descr:
|
|
||||||
call add_uefi_memmap
|
|
||||||
add esi, [descriptor_size]
|
|
||||||
add edi, sizeof.e820entry
|
|
||||||
dec ecx
|
|
||||||
jnz .next_descr
|
|
||||||
|
|
||||||
; kernel
|
; kernel
|
||||||
; eficall BootServices, AllocatePages, EFI_RESERVED_MEMORY_TYPE, \
|
; eficall BootServices, AllocatePages, EFI_RESERVED_MEMORY_TYPE, \
|
||||||
; 450000/0x1000, EFI_ALLOCATE_ADDRESS
|
; 450000/0x1000, EFI_ALLOCATE_ADDRESS
|
||||||
@ -661,13 +573,14 @@ main:
|
|||||||
; eficall BootServices, AllocatePages, EFI_RESERVED_MEMORY_TYPE, \
|
; eficall BootServices, AllocatePages, EFI_RESERVED_MEMORY_TYPE, \
|
||||||
; 2880*512/0x1000, EFI_ALLOCATE_ADDRESS
|
; 2880*512/0x1000, EFI_ALLOCATE_ADDRESS
|
||||||
|
|
||||||
|
call calc_memmap
|
||||||
|
; call dump_memmap
|
||||||
|
|
||||||
mov eax, [efi_table]
|
mov eax, [efi_table]
|
||||||
mov eax, [eax+EFI_SYSTEM_TABLE.BootServices]
|
mov eax, [eax+EFI_SYSTEM_TABLE.BootServices]
|
||||||
ccall [eax+EFI_BOOT_SERVICES.ExitBootServices], [efi_handle], \
|
ccall [eax+EFI_BOOT_SERVICES.ExitBootServices], [efi_handle], \
|
||||||
[memory_map_key]
|
[memory_map_key]
|
||||||
test eax, eax
|
call halt_on_error
|
||||||
jnz .error
|
|
||||||
|
|
||||||
|
|
||||||
cli
|
cli
|
||||||
|
|
||||||
@ -744,75 +657,136 @@ main:
|
|||||||
msg_error
|
msg_error
|
||||||
jmp $
|
jmp $
|
||||||
|
|
||||||
|
halt_on_error:
|
||||||
|
test eax, eax
|
||||||
|
jz @f
|
||||||
|
call clearbuf
|
||||||
|
mov edi, msg
|
||||||
|
call num2hex
|
||||||
|
mov eax, [esi+EFI_SYSTEM_TABLE.ConOut]
|
||||||
|
ccall [eax+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], eax, \
|
||||||
|
msg_error
|
||||||
|
mov eax, [esi+EFI_SYSTEM_TABLE.ConOut]
|
||||||
|
ccall [eax+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], eax, msg
|
||||||
|
jmp $
|
||||||
|
@@:
|
||||||
|
ret
|
||||||
|
|
||||||
|
proc find_rsdp
|
||||||
|
mov eax, [esi+EFI_SYSTEM_TABLE.ConOut]
|
||||||
|
ccall [eax+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], eax, \
|
||||||
|
msg_look_for_rsdp
|
||||||
|
|
||||||
|
mov edi, [esi+EFI_SYSTEM_TABLE.ConfigurationTable]
|
||||||
|
mov ecx, [esi+EFI_SYSTEM_TABLE.NumberOfTableEntries]
|
||||||
|
.next_table:
|
||||||
|
dec ecx
|
||||||
|
js .all_tables_done
|
||||||
|
; EFI_ACPI_TABLE_GUID
|
||||||
|
cmp dword[edi+EFI_CONFIGURATION_TABLE.VendorGUID+0x0], 0x8868e871
|
||||||
|
jnz .not_acpi20
|
||||||
|
cmp dword[edi+EFI_CONFIGURATION_TABLE.VendorGUID+0x4], 0x11d3e4f1
|
||||||
|
jnz .not_acpi20
|
||||||
|
cmp dword[edi+EFI_CONFIGURATION_TABLE.VendorGUID+0x8], 0x800022bc
|
||||||
|
jnz .not_acpi20
|
||||||
|
cmp dword[edi+EFI_CONFIGURATION_TABLE.VendorGUID+0xc], 0x81883cc7
|
||||||
|
jnz .not_acpi20
|
||||||
|
mov eax, [edi+EFI_CONFIGURATION_TABLE.VendorTable]
|
||||||
|
mov edx, BOOT_LO.acpi_rsdp
|
||||||
|
mov [edx], eax
|
||||||
|
mov eax, [esi+EFI_SYSTEM_TABLE.ConOut]
|
||||||
|
ccall [eax+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString], eax, \
|
||||||
|
msg_rsdp_found
|
||||||
|
jmp .all_tables_done
|
||||||
|
.not_acpi20:
|
||||||
|
add edi, sizeof.EFI_CONFIGURATION_TABLE
|
||||||
|
jmp .next_table
|
||||||
|
.all_tables_done:
|
||||||
|
ret
|
||||||
|
endp
|
||||||
|
|
||||||
|
proc calc_memmap
|
||||||
|
mov eax, [esi+EFI_SYSTEM_TABLE.BootServices]
|
||||||
|
ccall [eax+EFI_BOOT_SERVICES.AllocatePages], EFI_ALLOCATE_ANY_PAGES, \
|
||||||
|
EFI_RESERVED_MEMORY_TYPE, MEMORY_MAP_SIZE/0x1000, memory_map
|
||||||
|
call halt_on_error
|
||||||
|
|
||||||
|
mov eax, [esi+EFI_SYSTEM_TABLE.BootServices]
|
||||||
|
ccall [eax+EFI_BOOT_SERVICES.GetMemoryMap], memory_map_size, \
|
||||||
|
[memory_map], memory_map_key, descriptor_size, descriptor_ver
|
||||||
|
call halt_on_error
|
||||||
|
|
||||||
|
push esi
|
||||||
|
mov edi, BOOT_LO.memmap_blocks
|
||||||
|
mov dword[edi-4], 0 ; memmap_block_cnt
|
||||||
|
mov esi, [memory_map]
|
||||||
|
mov ebx, esi
|
||||||
|
add ebx, [memory_map_size]
|
||||||
|
.next_descr:
|
||||||
|
call add_uefi_memmap
|
||||||
|
add esi, [descriptor_size]
|
||||||
|
cmp esi, ebx
|
||||||
|
jb .next_descr
|
||||||
|
pop esi
|
||||||
|
ret
|
||||||
|
endp
|
||||||
|
|
||||||
; linux/arch/x86/platform/efi/efi.c
|
; linux/arch/x86/platform/efi/efi.c
|
||||||
; do_add_efi_memmap
|
; do_add_efi_memmap
|
||||||
proc add_uefi_memmap
|
proc add_uefi_memmap
|
||||||
locals
|
cmp [BOOT_LO.memmap_block_cnt], MAX_MEMMAP_BLOCKS
|
||||||
pew dd ?
|
jz .done
|
||||||
endl
|
|
||||||
pushad
|
|
||||||
|
|
||||||
mov edx, [esi+EFI_MEMORY_DESCRIPTOR.Type]
|
mov eax, [esi+EFI_MEMORY_DESCRIPTOR.PhysicalStart.lo]
|
||||||
|
mov edx, [esi+EFI_MEMORY_DESCRIPTOR.PhysicalStart.hi]
|
||||||
|
mov [edi+e820entry.addr.lo], eax
|
||||||
|
mov [edi+e820entry.addr.hi], edx
|
||||||
|
|
||||||
mov eax, [esi+EFI_MEMORY_DESCRIPTOR.PhysicalStart.lo] ; FIXME hi
|
mov eax, [esi+EFI_MEMORY_DESCRIPTOR.NumberOfPages.lo]
|
||||||
mov [edi+e820entry.addr], eax
|
mov edx, [esi+EFI_MEMORY_DESCRIPTOR.NumberOfPages.hi]
|
||||||
|
shld edx, eax, 12
|
||||||
mov eax, [esi+EFI_MEMORY_DESCRIPTOR.NumberOfPages]
|
|
||||||
shl eax, 12
|
shl eax, 12
|
||||||
mov [edi+e820entry.size], eax
|
mov [edi+e820entry.size.lo], eax
|
||||||
|
mov [edi+e820entry.size.hi], edx
|
||||||
|
|
||||||
|
mov ecx, [esi+EFI_MEMORY_DESCRIPTOR.Type]
|
||||||
cmp edx, EFI_LOADER_CODE
|
cmp ecx, EFI_LOADER_CODE
|
||||||
jz .case0
|
jz .mem_ram_if_wb
|
||||||
cmp edx, EFI_LOADER_DATA
|
cmp ecx, EFI_LOADER_DATA
|
||||||
jz .case0
|
jz .mem_ram_if_wb
|
||||||
cmp edx, EFI_BOOT_SERVICES_CODE
|
cmp ecx, EFI_BOOT_SERVICES_CODE
|
||||||
jz .case0
|
jz .mem_ram_if_wb
|
||||||
cmp edx, EFI_BOOT_SERVICES_DATA
|
cmp ecx, EFI_BOOT_SERVICES_DATA
|
||||||
jz .case0
|
jz .mem_ram_if_wb
|
||||||
cmp edx, EFI_CONVENTIONAL_MEMORY
|
cmp ecx, EFI_CONVENTIONAL_MEMORY
|
||||||
jz .case0
|
jz .mem_ram_if_wb
|
||||||
cmp edx, EFI_ACPI_RECLAIM_MEMORY
|
cmp ecx, EFI_ACPI_RECLAIM_MEMORY
|
||||||
jz .case1
|
|
||||||
cmp edx, EFI_ACPI_MEMORY_NVS
|
|
||||||
jz .case2
|
|
||||||
cmp edx, EFI_UNUSABLE_MEMORY
|
|
||||||
jz .case3
|
|
||||||
cmp edx, EFI_PERSISTENT_MEMORY
|
|
||||||
jz .case4
|
|
||||||
jmp .default
|
|
||||||
|
|
||||||
.case0:
|
|
||||||
test [esi+EFI_MEMORY_DESCRIPTOR.Attribute.lo], EFI_MEMORY_WB
|
|
||||||
jz @f
|
|
||||||
mov eax, E820_RAM
|
|
||||||
jmp .done
|
|
||||||
@@:
|
|
||||||
mov eax, E820_RESERVED
|
|
||||||
jmp .done
|
|
||||||
.case1:
|
|
||||||
mov eax, E820_ACPI
|
mov eax, E820_ACPI
|
||||||
jmp .done
|
jz .type_done
|
||||||
.case2:
|
cmp ecx, EFI_ACPI_MEMORY_NVS
|
||||||
mov eax, E820_NVS
|
mov eax, E820_NVS
|
||||||
jmp .done
|
jz .type_done
|
||||||
.case3:
|
cmp ecx, EFI_UNUSABLE_MEMORY
|
||||||
mov eax, E820_UNUSABLE
|
mov eax, E820_UNUSABLE
|
||||||
jmp .done
|
jz .type_done
|
||||||
.case4:
|
cmp ecx, EFI_PERSISTENT_MEMORY
|
||||||
mov eax, E820_PMEM
|
mov eax, E820_PMEM
|
||||||
jmp .done
|
jz .type_done
|
||||||
.default:
|
jmp .reserved
|
||||||
|
.mem_ram_if_wb:
|
||||||
|
test [esi+EFI_MEMORY_DESCRIPTOR.Attribute.lo], EFI_MEMORY_WB
|
||||||
|
mov eax, E820_RAM
|
||||||
|
jnz .type_done
|
||||||
|
.reserved:
|
||||||
mov eax, E820_RESERVED
|
mov eax, E820_RESERVED
|
||||||
jmp .done
|
.type_done:
|
||||||
|
|
||||||
.done:
|
|
||||||
mov [edi+e820entry.type], eax
|
mov [edi+e820entry.type], eax
|
||||||
|
cmp eax, E820_RAM
|
||||||
mov eax, BOOT_LO.memmap_block_cnt
|
jnz @f
|
||||||
inc word[eax]
|
inc [BOOT_LO.memmap_block_cnt]
|
||||||
|
add edi, sizeof.e820entry
|
||||||
popad
|
@@:
|
||||||
|
.done:
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
|
@ -712,9 +712,6 @@ main:
|
|||||||
call ask_for_params
|
call ask_for_params
|
||||||
@@:
|
@@:
|
||||||
|
|
||||||
; call calc_memmap
|
|
||||||
; call dump_memmap
|
|
||||||
|
|
||||||
movzx ecx, [cfg_opt_value_vmode]
|
movzx ecx, [cfg_opt_value_vmode]
|
||||||
eficall [gop_interface], EFI_GRAPHICS_OUTPUT_PROTOCOL.SetMode, \
|
eficall [gop_interface], EFI_GRAPHICS_OUTPUT_PROTOCOL.SetMode, \
|
||||||
[gop_interface], rcx
|
[gop_interface], rcx
|
||||||
@ -770,6 +767,7 @@ main:
|
|||||||
; 2880*512/0x1000, EFI_ALLOCATE_ADDRESS
|
; 2880*512/0x1000, EFI_ALLOCATE_ADDRESS
|
||||||
|
|
||||||
call calc_memmap
|
call calc_memmap
|
||||||
|
; call dump_memmap
|
||||||
|
|
||||||
mov rbx, [efi_table]
|
mov rbx, [efi_table]
|
||||||
mov rbx, [rbx+EFI_SYSTEM_TABLE.BootServices]
|
mov rbx, [rbx+EFI_SYSTEM_TABLE.BootServices]
|
||||||
@ -861,7 +859,6 @@ use64
|
|||||||
|
|
||||||
|
|
||||||
halt_on_error:
|
halt_on_error:
|
||||||
push rax rbx rcx rdx rsi rdi
|
|
||||||
test eax, eax
|
test eax, eax
|
||||||
jz @f
|
jz @f
|
||||||
call clearbuf
|
call clearbuf
|
||||||
@ -876,7 +873,6 @@ halt_on_error:
|
|||||||
eficall rbx, EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString, rbx, msg
|
eficall rbx, EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString, rbx, msg
|
||||||
jmp $
|
jmp $
|
||||||
@@:
|
@@:
|
||||||
pop rdi rsi rdx rcx rbx rax
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
find_rsdp:
|
find_rsdp:
|
||||||
@ -922,27 +918,16 @@ calc_memmap:
|
|||||||
[memory_map], memory_map_key, descriptor_size, descriptor_ver
|
[memory_map], memory_map_key, descriptor_size, descriptor_ver
|
||||||
call halt_on_error
|
call halt_on_error
|
||||||
|
|
||||||
mov rdi, BOOT_LO.memmap_block_cnt
|
|
||||||
mov dword[rdi], 0
|
|
||||||
mov rdi, BOOT_LO.memmap_blocks
|
mov rdi, BOOT_LO.memmap_blocks
|
||||||
mov rax, [memory_map_size]
|
mov dword[rdi-4], 0 ; memmap_block_cnt
|
||||||
xor edx, edx
|
|
||||||
mov rcx, [descriptor_size]
|
|
||||||
div ecx
|
|
||||||
mov ecx, eax
|
|
||||||
cmp ecx, MAX_MEMMAP_BLOCKS
|
|
||||||
jbe @f
|
|
||||||
mov ecx, MAX_MEMMAP_BLOCKS
|
|
||||||
@@:
|
|
||||||
xor eax, eax
|
|
||||||
mov [rax+BOOT_LO.memmap_block_cnt], 0
|
|
||||||
mov rsi, [memory_map]
|
mov rsi, [memory_map]
|
||||||
|
mov rbx, rsi
|
||||||
|
add rbx, [memory_map_size]
|
||||||
.next_descr:
|
.next_descr:
|
||||||
call add_uefi_memmap
|
call add_uefi_memmap
|
||||||
add rsi, [descriptor_size]
|
add rsi, [descriptor_size]
|
||||||
add rdi, sizeof.e820entry
|
cmp rsi, rbx
|
||||||
dec ecx
|
jb .next_descr
|
||||||
jnz .next_descr
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
dump_memmap:
|
dump_memmap:
|
||||||
@ -997,70 +982,56 @@ dump_memmap:
|
|||||||
; linux/arch/x86/platform/efi/efi.c
|
; linux/arch/x86/platform/efi/efi.c
|
||||||
; do_add_efi_memmap
|
; do_add_efi_memmap
|
||||||
add_uefi_memmap:
|
add_uefi_memmap:
|
||||||
push rax rbx rcx rdx rsi rdi
|
xor eax, eax
|
||||||
|
cmp [rax+BOOT_LO.memmap_block_cnt], MAX_MEMMAP_BLOCKS
|
||||||
|
jz .done
|
||||||
|
|
||||||
mov r10d, [rsi+EFI_MEMORY_DESCRIPTOR.Type]
|
mov rax, [rsi+EFI_MEMORY_DESCRIPTOR.PhysicalStart]
|
||||||
mov r11, [rsi+EFI_MEMORY_DESCRIPTOR.PhysicalStart]
|
mov [rdi+e820entry.addr], rax
|
||||||
mov r13, [rsi+EFI_MEMORY_DESCRIPTOR.NumberOfPages]
|
|
||||||
mov r14, [rsi+EFI_MEMORY_DESCRIPTOR.Attribute]
|
|
||||||
|
|
||||||
mov [rdi+e820entry.addr], r11
|
mov rax, [rsi+EFI_MEMORY_DESCRIPTOR.NumberOfPages]
|
||||||
mov rax, r13
|
|
||||||
shl rax, 12
|
shl rax, 12
|
||||||
mov [rdi+e820entry.size], rax
|
mov [rdi+e820entry.size], rax
|
||||||
|
|
||||||
|
mov ecx, [rsi+EFI_MEMORY_DESCRIPTOR.Type]
|
||||||
cmp r10d, EFI_LOADER_CODE
|
cmp ecx, EFI_LOADER_CODE
|
||||||
jz .case0
|
jz .mem_ram_if_wb
|
||||||
cmp r10d, EFI_LOADER_DATA
|
cmp ecx, EFI_LOADER_DATA
|
||||||
jz .case0
|
jz .mem_ram_if_wb
|
||||||
cmp r10d, EFI_BOOT_SERVICES_CODE
|
cmp ecx, EFI_BOOT_SERVICES_CODE
|
||||||
jz .case0
|
jz .mem_ram_if_wb
|
||||||
cmp r10d, EFI_BOOT_SERVICES_DATA
|
cmp ecx, EFI_BOOT_SERVICES_DATA
|
||||||
jz .case0
|
jz .mem_ram_if_wb
|
||||||
cmp r10d, EFI_CONVENTIONAL_MEMORY
|
cmp ecx, EFI_CONVENTIONAL_MEMORY
|
||||||
jz .case0
|
jz .mem_ram_if_wb
|
||||||
cmp r10d, EFI_ACPI_RECLAIM_MEMORY
|
cmp ecx, EFI_ACPI_RECLAIM_MEMORY
|
||||||
jz .case1
|
|
||||||
cmp r10d, EFI_ACPI_MEMORY_NVS
|
|
||||||
jz .case2
|
|
||||||
cmp r10d, EFI_UNUSABLE_MEMORY
|
|
||||||
jz .case3
|
|
||||||
cmp r10d, EFI_PERSISTENT_MEMORY
|
|
||||||
jz .case4
|
|
||||||
jmp .default
|
|
||||||
|
|
||||||
.case0:
|
|
||||||
test r14, EFI_MEMORY_WB
|
|
||||||
jz @f
|
|
||||||
mov eax, E820_RAM
|
|
||||||
jmp .done
|
|
||||||
@@:
|
|
||||||
mov eax, E820_RESERVED
|
|
||||||
jmp .done
|
|
||||||
.case1:
|
|
||||||
mov eax, E820_ACPI
|
mov eax, E820_ACPI
|
||||||
jmp .done
|
jz .type_done
|
||||||
.case2:
|
cmp ecx, EFI_ACPI_MEMORY_NVS
|
||||||
mov eax, E820_NVS
|
mov eax, E820_NVS
|
||||||
jmp .done
|
jz .type_done
|
||||||
.case3:
|
cmp ecx, EFI_UNUSABLE_MEMORY
|
||||||
mov eax, E820_UNUSABLE
|
mov eax, E820_UNUSABLE
|
||||||
jmp .done
|
jz .type_done
|
||||||
.case4:
|
cmp ecx, EFI_PERSISTENT_MEMORY
|
||||||
mov eax, E820_PMEM
|
mov eax, E820_PMEM
|
||||||
jmp .done
|
jz .type_done
|
||||||
.default:
|
jmp .reserved
|
||||||
|
.mem_ram_if_wb:
|
||||||
|
test [rsi+EFI_MEMORY_DESCRIPTOR.Attribute], dword EFI_MEMORY_WB
|
||||||
|
mov eax, E820_RAM
|
||||||
|
jnz .type_done
|
||||||
|
.reserved:
|
||||||
mov eax, E820_RESERVED
|
mov eax, E820_RESERVED
|
||||||
jmp .done
|
.type_done:
|
||||||
|
|
||||||
.done:
|
|
||||||
mov [rdi+e820entry.type], eax
|
mov [rdi+e820entry.type], eax
|
||||||
|
cmp eax, E820_RAM
|
||||||
mov rax, BOOT_LO.memmap_block_cnt
|
jnz @f
|
||||||
inc word[rax]
|
xor eax, eax
|
||||||
|
inc [rax+BOOT_LO.memmap_block_cnt]
|
||||||
pop rdi rsi rdx rcx rbx rax
|
add rdi, sizeof.e820entry
|
||||||
|
@@:
|
||||||
|
.done:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user