1 /* ----------------------------------------------------------------------- *
3 * Copyright 2008 H. Peter Anvin - All Rights Reserved
4 * Copyright 2009 Intel Corporation; author: H. Peter Anvin
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
9 * Boston MA 02110-1301, USA; either version 2 of the License, or
10 * (at your option) any later version; incorporated herein by reference.
12 * ----------------------------------------------------------------------- */
17 * Dump the memory map of the system
30 } __attribute__ ((packed
));
32 static const char *const e820_types
[] = {
40 static void dump_e820(void)
42 com32sys_t ireg
, oreg
;
47 low_ed
= lmalloc(sizeof ed
);
51 memset(&ireg
, 0, sizeof ireg
);
53 ireg
.eax
.w
[0] = 0xe820;
54 ireg
.edx
.l
= 0x534d4150;
55 ireg
.ecx
.l
= sizeof(struct e820_data
);
56 ireg
.edi
.w
[0] = OFFS(low_ed
);
57 ireg
.es
= SEG(low_ed
);
59 memset(&ed
, 0, sizeof ed
);
63 memcpy(low_ed
, &ed
, sizeof ed
);
65 __intcall(0x15, &ireg
, &oreg
);
66 if (oreg
.eflags
.l
& EFLAGS_CF
||
67 oreg
.eax
.l
!= 0x534d4150 || oreg
.ecx
.l
< 20)
70 memcpy(&ed
, low_ed
, sizeof ed
);
72 if (oreg
.ecx
.l
>= 24) {
73 /* ebx base length end type */
74 printf("%8x %016" PRIx64
"x %016" PRIx64
"x %016" PRIx64
"x %d [%x]",
75 ireg
.ebx
.l
, ed
.base
, ed
.len
, ed
.base
+ ed
.len
, ed
.type
,
78 /* ebx base length end */
79 printf("%8x %016" PRIx64
"x %016" PRIx64
"x %016" PRIx64
"x %d [-]",
80 ireg
.ebx
.l
, ed
.base
, ed
.len
, ed
.base
+ ed
.len
, ed
.type
);
85 if (type
< sizeof(e820_types
) / sizeof(e820_types
[0]))
86 printf(" %s", e820_types
[type
]);
90 ireg
.ebx
.l
= oreg
.ebx
.l
;
96 static void dump_legacy(void)
98 com32sys_t ireg
, oreg
;
99 uint16_t dosram
= *(uint16_t *) 0x413;
102 } *const ivt
= (void *)0;
104 memset(&ireg
, 0, sizeof ireg
);
106 __intcall(0x12, &ireg
, &oreg
);
109 ("INT 15h = %04x:%04x DOS RAM: %dK (0x%05x) INT 12h: %dK (0x%05x)\n",
110 ivt
[0x15].seg
, ivt
[0x15].offs
, dosram
, dosram
<< 10, oreg
.eax
.w
[0],
111 oreg
.eax
.w
[0] << 10);
113 memset(&ireg
, 0, sizeof ireg
);
114 ireg
.eax
.b
[1] = 0x88;
115 __intcall(0x15, &ireg
, &oreg
);
117 printf("INT 15 88: 0x%04x (%uK) ", oreg
.eax
.w
[0], oreg
.eax
.w
[0]);
119 memset(&ireg
, 0, sizeof ireg
);
120 ireg
.eax
.w
[0] = 0xe801;
121 __intcall(0x15, &ireg
, &oreg
);
123 printf("INT 15 E801: 0x%04x (%uK) 0x%04x (%uK)\n",
124 oreg
.ecx
.w
[0], oreg
.ecx
.w
[0], oreg
.edx
.w
[0], oreg
.edx
.w
[0] << 6);
127 int main(int argc __unused
, char **argv __unused
)