ignore memory ranges above 4gb
[bootcensus] / src / boot / boot2.s
index 572a4f0..719f37e 100644 (file)
@@ -615,16 +615,20 @@ e820_looptop:
        cmp $0x534d4150, %eax
        jnz e820_fail
 
+       # skip areas starting above 4GB as we won't be able to use them
+       cmpl $0, 4(%edi)
+       jnz e820_skip
+
+       # only care for type 1 (usable ram), otherwise ignore
+       cmpl $1, 16(%edi)
+       jnz e820_skip
+
        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 e820_skip
-
        # skip areas with 0 size (also clamp size to 4gb)
        # test high 32bits
        cmpl $0, 12(%edi)
@@ -685,15 +689,21 @@ detect_mem_e801:
        movzx %cx, %eax
        # first size is in KB, convert to bytes
        shl $10, %eax
-       mov %eax, 4(%esi)
-       cmp $0, %dx
+       jnc 0f
+       # overflow means it's >4GB, clamp to 4GB
+       mov $0xffffffff, %eax
+0:     mov %eax, 4(%esi)
        incl boot_mem_map_size
+       cmp $0, %dx
        jz e801_done
        movl $0x1000000, 8(%esi)
        movzx %dx, %eax
        # second size is in 64kb blocks, convert to bytes
        shl $16, %eax
-       mov %eax, 12(%esi)
+       jnc 0f
+       # overflow means it's >4GB, clamp to 4GB
+       mov $0xffffffff, %eax
+0:     mov %eax, 12(%esi)
        incl boot_mem_map_size
 e801_done:
        clc