/*
* Dump memory map information
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <com32.h>
#include "sysdump.h"
#define E820_CHUNK 128
struct e820_info {
uint32_t ebx;
uint32_t len;
uint8_t data[24];
};
static void dump_e820(struct upload_backend *be)
{
com32sys_t ireg, oreg;
struct e820_info *curr;
struct e820_info *buf, *p;
int nentry, nalloc;
curr = lmalloc(sizeof *curr);
buf = p = NULL;
nentry = nalloc = 0;
memset(&ireg, 0, sizeof ireg);
memset(&curr, 0, sizeof curr);
ireg.eax.l = 0xe820;
ireg.edx.l = 0x534d4150;
ireg.ecx.l = sizeof curr->data;
ireg.es = SEG(curr->data);
ireg.edi.w[0] = OFFS(curr->data);
do {
__intcall(0x15, &ireg, &oreg);
if ((oreg.eflags.l & EFLAGS_CF) ||
oreg.eax.l != 0x534d4150)
break;
if (nentry >= nalloc) {
nalloc += E820_CHUNK;
buf = realloc(buf, nalloc*sizeof *buf);
if (!buf)
return; /* FAILED */
}
memcpy(buf[nentry].data, curr->data, sizeof curr->data);
buf[nentry].ebx = ireg.ebx.l;
buf[nentry].len = oreg.ecx.l;
nentry++;
ireg.ebx.l = oreg.ebx.l;
} while (ireg.ebx.l);
if (nentry)
cpio_writefile(be, "memmap/15e820", buf, nentry*sizeof *buf);
free(buf);
lfree(curr);
}
void dump_memory_map(struct upload_backend *be)
{
com32sys_t ireg, oreg;
cpio_mkdir(be, "memmap");
memset(&ireg, 0, sizeof ireg);
__intcall(0x12, &ireg, &oreg);
cpio_writefile(be, "memmap/12", &oreg, sizeof oreg);
memset(&ireg, 0, sizeof ireg);
ireg.eax.b[1] = 0x88;
__intcall(0x15, &ireg, &oreg);
cpio_writefile(be, "memmap/1588", &oreg, sizeof oreg);
memset(&ireg, 0, sizeof ireg);
ireg.eax.w[0] = 0xe801;
__intcall(0x15, &ireg, &oreg);
cpio_writefile(be, "memmap/15e801", &oreg, sizeof oreg);
dump_e820(be);
}