StupidOS/boot/loader/memory.inc

145 lines
2.5 KiB
PHP

;; File: memory.inc
;; Detect available memory
;;
;; Constants: Address type
;;
;; See <AddressRange.Type>
;;
;; ADDRESS_RANGE_MEMORY - Available and usable RAM.
;; ADDRESS_RANGE_RESERVED - Reserved or in use.
ADDRESS_RANGE_MEMORY = 1
ADDRESS_RANGE_RESERVED = 2
;; Struct: AddressRange
struc E820AddressRange
{
;; Variable: BaseAddrLow
;; Low 32 Bits of Base Address
.BaseAddrLow dd ?
;; Variable: BaseAddrHigh
;; High 32 Bits of Base Address
.BaseAddrHigh dd ?
;; Variable: LengthLow
;; Low 32 Bits of Length in Bytes
.LengthLow dd ?
;; Variable: LengthHigh
;; High 32 Bits of Length in Bytes
.LengthHigh dd ?
;; Variable: Type
;; Address type of this range. <Address type>
.Type dd ?
}
;; Function: memory_e820_get_mmap_entry
;;
;; In:
;; EAX - Function code
;; EBX - Continuation
;; ES:DI - Buffer Pointer
;; ECX - Buffer size
;; EDX - Signature 'SMAP'
;;
;; Out:
;; CF - Carry Flag
;; EAX - Signature 'SMAP'
;; ES:DI - Buffer Pointer
;; ECX - Buffer Size
;; EBX - Continuation
memory_e820_get_map:
xor ebx, ebx
@@:
clc
xor eax, eax
mov es, ax
mov di, pE280AddrRange
mov ecx, 20
mov eax, 0xE820
mov edx, 0x534D4150
int 0x15
jc .error
cmp eax, 0x534D4150
jne .error
or ebx, ebx
jz .end
cmp [pE280AddrRange.Type], 0x1
jne @b
mov ecx, [pE280AddrRange.BaseAddrHigh]
or ecx, ecx
jnz @b
mov ecx, [pE280AddrRange.LengthHigh]
or ecx, ecx
jnz @b
mov edx, [pE280AddrRange.LengthLow]
mov eax, [pE280AddrRange.BaseAddrLow]
call boot_info_add_memmap
jmp @b
.error:
stc
.end:
ret
;; Function: memory_get_for_large_conf
;;
;; In:
;; AX - Function code E801h
;;
;; Out:
;; CF - Non-Carry - indicates no error
;; AX - Extended 1
;; BX - Extended 2
;; CX - Configured 1
;; DX - Configured 2
memory_get_for_large_conf:
clc
mov ax, 0xE801
int 0x15
jc @f
movzx edx, ax
mov eax, 0x100000 ; 1MB
call boot_info_add_memmap
mov eax, 0x1000000 ; 16MB
movzx edx, bx
shl edx, 16 ; * 64KB
call boot_info_add_memmap
@@:
ret
;; Function: memory_get_extended_memory_size
;;
;; In:
;; AH - Function code 88h
;;
;; Out:
;; CF - Non-Carry - indicates no error
;; AX - Number of contiguous KB above 1MB
memory_get_map:
call memory_e820_get_map
jnc .end
call memory_get_for_large_conf
jnc .end
clc
mov ah, 0x88
int 0x15
jc .end
movzx edx, ax
mov eax, 0x100000
call boot_info_add_memmap
.end:
ret
pE280AddrRange E820AddressRange