2020-03-27 03:59:11 +03:00
|
|
|
#include <lib/e820.h>
|
|
|
|
#include <lib/real.h>
|
|
|
|
#include <lib/blib.h>
|
|
|
|
|
|
|
|
struct e820_entry_t e820_map[E820_MAX_ENTRIES];
|
|
|
|
|
|
|
|
static const char *e820_type(uint32_t type) {
|
|
|
|
switch (type) {
|
|
|
|
case 1:
|
|
|
|
return "Usable RAM";
|
|
|
|
case 2:
|
|
|
|
return "Reserved";
|
|
|
|
case 3:
|
|
|
|
return "ACPI reclaimable";
|
|
|
|
case 4:
|
|
|
|
return "ACPI NVS";
|
|
|
|
case 5:
|
|
|
|
return "Bad memory";
|
|
|
|
default:
|
|
|
|
return "???";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-27 04:10:22 +03:00
|
|
|
int init_e820(void) {
|
2020-03-27 03:59:11 +03:00
|
|
|
struct rm_regs r = {0};
|
|
|
|
|
2020-03-27 04:10:22 +03:00
|
|
|
int entry_count;
|
|
|
|
for (int i = 0; i < E820_MAX_ENTRIES; i++) {
|
2020-03-27 03:59:11 +03:00
|
|
|
r.eax = 0xe820;
|
|
|
|
r.ecx = 24;
|
|
|
|
r.edx = 0x534d4150;
|
|
|
|
r.edi = (uint32_t)&e820_map[i];
|
|
|
|
rm_int(0x15, &r, &r);
|
|
|
|
|
|
|
|
if (r.eflags & EFLAGS_CF) {
|
2020-03-27 04:10:22 +03:00
|
|
|
entry_count = i;
|
2020-03-27 03:59:11 +03:00
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!r.ebx) {
|
2020-03-27 04:10:22 +03:00
|
|
|
entry_count = ++i;
|
2020-03-27 03:59:11 +03:00
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
print("e820: Too many entries!\n");
|
2020-03-27 04:10:22 +03:00
|
|
|
for (;;);
|
2020-03-27 03:59:11 +03:00
|
|
|
|
|
|
|
done:
|
2020-03-27 04:10:22 +03:00
|
|
|
for (int i = 0; i < entry_count; i++) {
|
2020-03-27 03:59:11 +03:00
|
|
|
print("e820: [%X -> %X] : %X <%s>\n",
|
|
|
|
e820_map[i].base,
|
|
|
|
e820_map[i].base + e820_map[i].length,
|
|
|
|
e820_map[i].length,
|
|
|
|
e820_type(e820_map[i].type));
|
|
|
|
}
|
2020-03-27 04:10:22 +03:00
|
|
|
|
|
|
|
return entry_count;
|
2020-03-27 03:59:11 +03:00
|
|
|
}
|