-// XXX - should create e820 memory map in post and just copy it here.
-static void
-handle_15e820(struct bregs *regs)
-{
- if (regs->edx != 0x534D4150) {
- set_code_fail(regs, RET_EUNSUPPORTED);
- return;
- }
-
- u32 extended_memory_size = inb_cmos(CMOS_MEM_EXTMEM2_HIGH);
- extended_memory_size <<= 8;
- extended_memory_size |= inb_cmos(CMOS_MEM_EXTMEM2_LOW);
- extended_memory_size *= 64;
- // greater than EFF00000???
- if (extended_memory_size > 0x3bc000)
- // everything after this is reserved memory until we get to 0x100000000
- extended_memory_size = 0x3bc000;
- extended_memory_size *= 1024;
- extended_memory_size += (16L * 1024 * 1024);
-
- if (extended_memory_size <= (16L * 1024 * 1024)) {
- extended_memory_size = inb_cmos(CMOS_MEM_EXTMEM_HIGH);
- extended_memory_size <<= 8;
- extended_memory_size |= inb_cmos(CMOS_MEM_EXTMEM_LOW);
- extended_memory_size *= 1024;
- }
-
- switch (regs->bx) {
- case 0:
- set_e820_range(regs, 0x0000000L, 0x0009fc00L, E820_RAM, 0);
- break;
- case 1:
- set_e820_range(regs, 0x0009fc00L, 0x000a0000L, E820_RESERVED, 0);
- break;
- case 2:
- set_e820_range(regs, 0x000e8000L, 0x00100000L, E820_RESERVED, 0);
- break;
- case 3:
- set_e820_range(regs, 0x00100000L,
- extended_memory_size - ACPI_DATA_SIZE, E820_RAM, 0);
- break;
- case 4:
- set_e820_range(regs,
- extended_memory_size - ACPI_DATA_SIZE,
- extended_memory_size, E820_ACPI, 0);
- break;
- case 5:
- /* 256KB BIOS area at the end of 4 GB */
- set_e820_range(regs, 0xfffc0000L, 0x00000000L, E820_RESERVED, 1);
- break;
- default: /* AX=E820, DX=534D4150, BX unrecognized */
- set_code_fail(regs, RET_EUNSUPPORTED);
- }
-}
-