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
;
46 memset(&ireg
, 0, sizeof ireg
);
48 ireg
.eax
.w
[0] = 0xe820;
49 ireg
.edx
.l
= 0x534d4150;
50 ireg
.ecx
.l
= sizeof(struct e820_data
);
51 ireg
.edi
.w
[0] = OFFS(__com32
.cs_bounce
);
52 ireg
.es
= SEG(__com32
.cs_bounce
);
54 memset(&ed
, 0, sizeof ed
);
58 memcpy(__com32
.cs_bounce
, &ed
, sizeof ed
);
60 __intcall(0x15, &ireg
, &oreg
);
61 if (oreg
.eflags
.l
& EFLAGS_CF
||
62 oreg
.eax
.l
!= 0x534d4150 || oreg
.ecx
.l
< 20)
65 memcpy(&ed
, __com32
.cs_bounce
, sizeof ed
);
67 if (oreg
.ecx
.l
>= 24) {
68 /* ebx base length end type */
69 printf("%8x %016llx %016llx %016llx %d [%x]",
70 ireg
.ebx
.l
, ed
.base
, ed
.len
, ed
.base
+ ed
.len
, ed
.type
,
73 /* ebx base length end */
74 printf("%8x %016llx %016llx %016llx %d [-]",
75 ireg
.ebx
.l
, ed
.base
, ed
.len
, ed
.base
+ ed
.len
, ed
.type
);
80 if (type
< sizeof(e820_types
) / sizeof(e820_types
[0]))
81 printf(" %s", e820_types
[type
]);
85 ireg
.ebx
.l
= oreg
.ebx
.l
;
89 static void dump_legacy(void)
91 com32sys_t ireg
, oreg
;
92 uint16_t dosram
= *(uint16_t *) 0x413;
95 } *const ivt
= (void *)0;
97 memset(&ireg
, 0, sizeof ireg
);
99 __intcall(0x12, &ireg
, &oreg
);
102 ("INT 15h = %04x:%04x DOS RAM: %dK (0x%05x) INT 12h: %dK (0x%05x)\n",
103 ivt
[0x15].seg
, ivt
[0x15].offs
, dosram
, dosram
<< 10, oreg
.eax
.w
[0],
104 oreg
.eax
.w
[0] << 10);
106 ireg
.eax
.b
[1] = 0x88;
107 __intcall(0x15, &ireg
, &oreg
);
109 printf("INT 15 88: 0x%04x (%uK) ", oreg
.eax
.w
[0], oreg
.eax
.w
[0]);
111 ireg
.eax
.w
[0] = 0xe801;
112 __intcall(0x15, &ireg
, &oreg
);
114 printf("INT 15 E801: 0x%04x (%uK) 0x%04x (%uK)\n",
115 oreg
.ecx
.w
[0], oreg
.ecx
.w
[0], oreg
.edx
.w
[0], oreg
.edx
.w
[0] << 6);
120 openconsole(&dev_null_r
, &dev_stdcon_w
);