aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorleendert@watson.ibm.com[kaf24] <leendert@watson.ibm.com[kaf24]>2005-06-28 07:51:17 +0000
committerleendert@watson.ibm.com[kaf24] <leendert@watson.ibm.com[kaf24]>2005-06-28 07:51:17 +0000
commitc81d4fc893ef036912481c25b4c9fd38de56a6a0 (patch)
tree9cf709fa98f28a4ad87ee66cc03bc8a7d3b2d4d7
parent882a8d10c5a40fd9ed9ccc0332d345232d8bfb0a (diff)
downloadxen-c81d4fc893ef036912481c25b4c9fd38de56a6a0.tar.gz
xen-c81d4fc893ef036912481c25b4c9fd38de56a6a0.tar.bz2
xen-c81d4fc893ef036912481c25b4c9fd38de56a6a0.zip
bitkeeper revision 1.1760.1.3 (42c10175tVLAVy7ULar9xcSazDReXw)
[PATCH] [PATCH] VMXassist print e820 table This patch integrates some of my debug environment back into the main stream and it prints the e820 map as it is seen by a VMX domain. Leendert Signed-Off-By: Leendert van Doorn <leendert@watson.ibm.com>
-rw-r--r--tools/firmware/rombios/rombios.c14
-rw-r--r--tools/firmware/vmxassist/setup.c27
-rw-r--r--tools/firmware/vmxassist/util.c30
-rw-r--r--tools/firmware/vmxassist/util.h19
-rw-r--r--tools/firmware/vmxassist/vm86.c2
5 files changed, 88 insertions, 4 deletions
diff --git a/tools/firmware/rombios/rombios.c b/tools/firmware/rombios/rombios.c
index c3605ac71e..b76766ae51 100644
--- a/tools/firmware/rombios/rombios.c
+++ b/tools/firmware/rombios/rombios.c
@@ -27,6 +27,7 @@
// ROM BIOS for use with Bochs/Plex x86 emulation environment
#define VMXASSIST
+#undef VMXTEST
// ROM BIOS compatability entry points:
// ===================================
@@ -4070,10 +4071,10 @@ ASM_END
switch(regs.u.r8.al)
{
case 0x20: // coded by osmaker aka K.J.
- if(regs.u.r32.edx == 0x534D4150)
+ if(regs.u.r32.edx == 0x534D4150) /* SMAP */
{
#ifdef VMXASSIST
- if ((regs.u.r16.bx / 0x14)* 0x14 == regs.u.r16.bx) {
+ if ((regs.u.r16.bx / 0x14) * 0x14 == regs.u.r16.bx) {
Bit16u e820_table_size = read_word(0xe000, 0x8) * 0x14;
if (regs.u.r16.bx + 0x14 <= e820_table_size) {
@@ -10353,8 +10354,17 @@ dummy_iret_handler:
HALT(__LINE__)
iret
+#ifdef VMXTEST
+.org 0xffe0
+ jmp 0xf000:post;
+#endif
+
.org 0xfff0 ; Power-up Entry Point
+#ifdef VMXTEST
+ jmp 0xd000:0x0003;
+#else
jmp 0xf000:post
+#endif
.org 0xfff5 ; ASCII Date ROM was built - 8 characters in MM/DD/YY
.ascii BIOS_BUILD_DATE
diff --git a/tools/firmware/vmxassist/setup.c b/tools/firmware/vmxassist/setup.c
index dceac64099..f572ae1698 100644
--- a/tools/firmware/vmxassist/setup.c
+++ b/tools/firmware/vmxassist/setup.c
@@ -46,7 +46,19 @@ struct dtr idtr = { sizeof(idt)-1, (unsigned long) &idt };
#ifdef TEST
unsigned pgd[NR_PGD] __attribute__ ((aligned(PGSIZE))) = { 0 };
-#endif
+
+struct e820entry e820map[] = {
+ { 0x0000000000000000ULL, 0x000000000009F800ULL, E820_RAM },
+ { 0x000000000009F800ULL, 0x0000000000000800ULL, E820_RESERVED },
+ { 0x00000000000A0000ULL, 0x0000000000020000ULL, E820_IO },
+ { 0x00000000000C0000ULL, 0x0000000000040000ULL, E820_RESERVED },
+ { 0x0000000000100000ULL, 0x0000000000000000ULL, E820_RAM },
+ { 0x0000000000000000ULL, 0x0000000000001000ULL, E820_SHARED },
+ { 0x0000000000000000ULL, 0x0000000000003000ULL, E820_NVS },
+ { 0x0000000000003000ULL, 0x000000000000A000ULL, E820_ACPI },
+ { 0x00000000FEC00000ULL, 0x0000000001400000ULL, E820_IO },
+};
+#endif /* TEST */
struct vmx_assist_context oldctx;
struct vmx_assist_context newctx;
@@ -72,7 +84,20 @@ banner(void)
(((get_cmos(0x31) << 8) | get_cmos(0x30)) + 0x400) << 10;
memory_size += 0x400 << 10; /* + 1MB */
+#ifdef TEST
+ /* Create an SMAP for our debug environment */
+ e820map[4].size = memory_size - e820map[4].addr - PGSIZE;
+ e820map[5].addr = memory_size - PGSIZE;
+ e820map[6].addr = memory_size;
+ e820map[7].addr += memory_size;
+
+ *LINUX_E820_MAP_NR = sizeof(e820map)/sizeof(e820map[0]);
+ memcpy(LINUX_E820_MAP, e820map, sizeof(e820map));
+#endif
+
printf("Memory size %ld MB\n", memory_size >> 20);
+ printf("E820 map:\n");
+ print_e820_map(LINUX_E820_MAP, *LINUX_E820_MAP_NR);
printf("\n");
}
diff --git a/tools/firmware/vmxassist/util.c b/tools/firmware/vmxassist/util.c
index 53b6addd35..068ac844b3 100644
--- a/tools/firmware/vmxassist/util.c
+++ b/tools/firmware/vmxassist/util.c
@@ -74,6 +74,36 @@ hexdump(unsigned char *data, int sz)
}
void
+print_e820_map(struct e820entry *map, int entries)
+{
+ struct e820entry *m;
+
+ if (entries > 32)
+ entries = 32;
+
+ for (m = map; m < &map[entries]; m++) {
+ printf("%08lx%08lx - %08lx%08lx ",
+ (unsigned long) (m->addr >> 32),
+ (unsigned long) (m->addr),
+ (unsigned long) ((m->addr+m->size) >> 32),
+ (unsigned long) ((m->addr+m->size)));
+
+ switch (m->type) {
+ case E820_RAM:
+ printf("(RAM)\n"); break;
+ case E820_RESERVED:
+ printf("(Reserved)\n"); break;
+ case E820_ACPI:
+ printf("(ACPI Data)\n"); break;
+ case E820_NVS:
+ printf("(ACPI NVS)\n"); break;
+ default:
+ printf("(Type %ld)\n", m->type); break;
+ }
+ }
+}
+
+void
dump_dtr(unsigned long base, unsigned long limit)
{
unsigned long long entry;
diff --git a/tools/firmware/vmxassist/util.h b/tools/firmware/vmxassist/util.h
index 06e030d571..37a539c7e5 100644
--- a/tools/firmware/vmxassist/util.h
+++ b/tools/firmware/vmxassist/util.h
@@ -23,6 +23,24 @@
#include <stdarg.h>
#include <vm86.h>
+
+#define LINUX_E820_MAP_NR ((unsigned char *)0x901E8)
+#define LINUX_E820_MAP ((struct e820entry *)0x902D0)
+
+#define E820_RAM 1
+#define E820_RESERVED 2
+#define E820_ACPI 3
+#define E820_NVS 4
+#define E820_IO 16
+#define E820_SHARED 17
+
+struct e820entry {
+ unsigned long long addr;
+ unsigned long long size;
+ unsigned long type;
+} __attribute__((packed));
+
+
#define offsetof(type, member) ((unsigned) &((type *)0)->member)
struct vmx_assist_context;
@@ -30,6 +48,7 @@ struct vmx_assist_context;
extern void hexdump(unsigned char *, int);
extern void dump_regs(struct regs *);
extern void dump_vmx_context(struct vmx_assist_context *);
+extern void print_e820_map(struct e820entry *, int);
extern void dump_dtr(unsigned long, unsigned long);
extern void *memcpy(void *, const void *, unsigned);
extern void *memset(void *, int, unsigned);
diff --git a/tools/firmware/vmxassist/vm86.c b/tools/firmware/vmxassist/vm86.c
index d6ac150683..e3fcaa5276 100644
--- a/tools/firmware/vmxassist/vm86.c
+++ b/tools/firmware/vmxassist/vm86.c
@@ -950,7 +950,7 @@ trap(int trapno, int errno, struct regs *regs)
default:
invalid:
- printf("Trap (%d) while in %s mode\n",
+ printf("Trap (0x%x) while in %s mode\n",
trapno, regs->eflags & EFLAGS_VM ? "real" : "protected");
if (trapno == 14)
printf("Page fault address 0x%x\n", get_cr2());