]> git.dujemihanovic.xyz Git - nameless-os.git/blob - boot/x86/stage3/e820.s
247b3614cf83dcb8a754759ec4edd345e5193e0f
[nameless-os.git] / boot / x86 / stage3 / e820.s
1 ; Code for getting the BIOS E820 memory map
2
3 bits 16
4
5 ; Return: ECX - number of entries, DI - pointer to map
6 get_e820_map:
7 push eax
8 push ebx
9 push edx
10 push esi
11 push es
12
13 xor ax, ax
14 mov es, ax
15 push dword 1
16 sub sp, 20
17 xor si, si
18 xor ebx, ebx
19 mov edx, 0x534d4150
20 mov eax, 0xe820
21 mov ecx, 24
22 mov di, sp
23 int 0x15
24 jc .no_e820
25 cmp eax, 0x534d4150
26 jne .unexpected
27 inc si
28 .loop:
29 push dword 1
30 sub sp, 20
31 mov di, sp
32 mov eax, 0xe820
33 mov ecx, 24
34 int 0x15
35 jc .carry_done
36 inc si
37 cmp ebx, 0
38 je .done
39 jmp .loop
40 .carry_done:
41 add sp, 24
42 .done:
43 movzx ecx, si
44 movzx edi, sp
45 mov ax, 24
46 mul si
47 add sp, ax
48 pop es
49 pop esi
50 pop edx
51 pop ebx
52 pop eax
53 ret
54 .no_e820:
55 print no_e820
56 hlt
57 jmp $-1
58 .unexpected
59 print e820_unexpected
60 call print_dword
61 hlt
62 jmp $-1
63
64 no_e820: db "BIOS does not support E820, cannot proceed!", 0xd, 0xa, 0
65 e820_unexpected: db "Unexpected value in EAX after getting map entry: expected SMAP, got ", 0