summaryrefslogtreecommitdiffstats
path: root/contrib/syslinux-4.02/com32/sysdump/memmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/syslinux-4.02/com32/sysdump/memmap.c')
-rw-r--r--contrib/syslinux-4.02/com32/sysdump/memmap.c85
1 files changed, 85 insertions, 0 deletions
diff --git a/contrib/syslinux-4.02/com32/sysdump/memmap.c b/contrib/syslinux-4.02/com32/sysdump/memmap.c
new file mode 100644
index 0000000..251107d
--- /dev/null
+++ b/contrib/syslinux-4.02/com32/sysdump/memmap.c
@@ -0,0 +1,85 @@
+/*
+ * Dump memory map information
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <com32.h>
+#include "sysdump.h"
+#include "backend.h"
+
+#define E820_CHUNK 128
+struct e820_info {
+ uint32_t ebx;
+ uint32_t len;
+ uint8_t data[24];
+};
+
+static void dump_e820(struct 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 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);
+
+ ireg.eax.b[1] = 0x88;
+ __intcall(0x15, &ireg, &oreg);
+ cpio_writefile(be, "memmap/1588", &oreg, sizeof oreg);
+
+ ireg.eax.w[0] = 0xe801;
+ __intcall(0x15, &ireg, &oreg);
+ cpio_writefile(be, "memmap/15e801", &oreg, sizeof oreg);
+
+ dump_e820(be);
+}