-# this is not boot loader code. It's called later on by the main
-# kernel code in 32bit protected mode. It's placed here because
-# it needs to be in base memory as it returns and runs in real mode.
+ # sets the carry flag on failure
+detect_memory:
+ mov $buffer, %edi
+ xor %ebx, %ebx
+ mov $0x534d4150, %edx
+
+memdet_looptop:
+ mov $0xe820, %eax
+ mov $24, %ecx
+ int $0x15
+ jc memdet_fail
+ cmp $0x534d4150, %eax
+ jnz memdet_fail
+
+ mov buffer, %eax
+ mov $boot_mem_map, %esi
+ mov boot_mem_map_size, %ebp
+ # again, that's [ebp * 8 + esi]
+ mov %eax, (%esi,%ebp,8)
+
+ # only care for type 1 (usable ram), otherwise ignore
+ cmpl $1, 16(%edi)
+ jnz memdet_skip
+
+ # skip areas with 0 size (also clamp size to 4gb)
+ # test high 32bits
+ cmpl $0, 12(%edi)
+ jz memdet_highzero
+ # high part is non-zero, make low part ffffffff
+ xor %eax, %eax
+ not %eax
+ jmp 0f
+
+memdet_highzero:
+ # if both high and low parts are zero, ignore
+ mov 8(%edi), %eax
+ cmpl $0, %eax
+ jz memdet_skip
+
+0: mov %eax, 4(%esi,%ebp,8)
+ incl boot_mem_map_size