[intel-platform-dev] [Fwd: xvm-gate commit: 6637632 FC6 HVM Guest can not boot up]
Mark Johnson
Mark.Johnson at Sun.COM
Thu Jan 3 15:35:12 PST 2008
Thanks Nitin!
MRJ
-------- Original Message --------
Subject: xvm-gate commit: 6637632 FC6 HVM Guest can not boot up
Date: Thu, 03 Jan 2008 15:30:49 -0800 (PST)
From: Mark Johnson <mrj at elpaso.sfbay.sun.com>
To: David.Marker at Sun.COM, john.beck at Sun.COM, matrix-eng at Sun.COM
changeset: 11:114085f2805a
tag: tip
user: Mark Johnson <mark.johnson at sun.com>
date: Tue Dec 18 15:13:14 2007 -0800
files: intel-realmode-fixes
description:
6637632 FC6 HVM Guest can not boot up
Contributed by Nitin Kamble (nitin.a.kamble at intel.com)
diff -r 8c7e4c17de06 -r 114085f2805a intel-realmode-fixes
--- a/intel-realmode-fixes Mon Dec 10 13:01:11 2007 -0800
+++ b/intel-realmode-fixes Tue Dec 18 15:13:14 2007 -0800
@@ -97,19 +97,17 @@ diff --git a/tools/firmware/vmxassist/vm
switch (cr) {
case 0:
oldctx.cr0 = getreg32(regs, modrm) | (CR0_PE | CR0_NE);
-@@ -806,60 +834,193 @@ pop(struct regs *regs, unsigned prefix,
+@@ -806,60 +834,146 @@ pop(struct regs *regs, unsigned prefix,
write16(addr, pop16(regs));
TRACE((regs, regs->eip - eip, "pop *0x%x", addr));
break;
-
- /* other pop opcodes ... */
-- }
--
+ default: /* other pop opcodes ... */
+ return (1);
-+ }
-+
-+ return 1;
+ }
+
+ return 1;
+}
+
+static void
@@ -129,53 +127,6 @@ diff --git a/tools/firmware/vmxassist/vm
+ TRACE((regs, regs->eip - eip, "push%s %s%s (val 0x%x)",
+ (prefix & DATA32) ? "l" : "",
+ (prefix & DATA32) ? "e" : "", rnames[opc & 0xF], data));
-+}
-+
-+static int
-+mov_from_seg(struct regs *regs, unsigned prefix, unsigned opc)
-+{
-+ unsigned eip = regs->eip - 1;
-+ unsigned modrm = fetch8(regs);
-+ unsigned r = modrm & 3; /* dest reg is in r/m field */
-+ unsigned data;
-+
-+ if ((modrm & 0xC0) != 0xC0) /* reg destinations only. memory unimpl */
-+ return 0;
-+
-+ switch ((modrm & 0x38) >> 3) { /* source reg is in reg field */
-+ case 0: /* es */
-+ data = regs->ves;
-+ break;
-+
-+ case 1: /* cs */
-+ data = regs->cs;
-+ break;
-+
-+ case 2: /* ss */
-+ data = regs->uss;
-+ break;
-+
-+ case 3: /* ds */
-+ data = regs->vds;
-+ break;
-+
-+ case 4: /* fs */
-+ data = regs->vfs;
-+ break;
-+
-+ case 5: /* gs */
-+ data = regs->vgs;
-+ break;
-+
-+ default:
-+ return 0;
-+ }
-+
-+ TRACE((regs, regs->eip - eip, "mov %%%s %%%s (val 0x%x)\n",
-+ srnames[(modrm & 0x38) >> 3], rnames[r], data));
-+
-+ setreg16(regs, r, data);
- return 1;
}
static int
@@ -333,7 +284,7 @@ diff --git a/tools/firmware/vmxassist/vm
return 0;
}
-@@ -867,9 +1028,11 @@ mov_to_seg(struct regs *regs, unsigned p
+@@ -867,9 +981,11 @@ mov_to_seg(struct regs *regs, unsigned p
* Emulate a segment load in protected mode
*/
static int
@@ -348,7 +299,7 @@ diff --git a/tools/firmware/vmxassist/vm
unsigned long long entry;
/* protected mode: use seg as index into gdt */
-@@ -881,12 +1044,14 @@ load_seg(unsigned long sel, uint32_t *ba
+@@ -881,12 +997,14 @@ load_seg(unsigned long sel, uint32_t *ba
return 1;
}
@@ -367,7 +318,7 @@ diff --git a/tools/firmware/vmxassist/vm
/* Check the P bit first */
if (!((entry >> (15+32)) & 0x1) && sel != 0)
-@@ -921,7 +1086,8 @@ load_seg(unsigned long sel, uint32_t *ba
+@@ -921,7 +1039,8 @@ load_seg(unsigned long sel, uint32_t *ba
* the descriptor was invalid.
*/
static void
@@ -377,7 +328,7 @@ diff --git a/tools/firmware/vmxassist/vm
{
if (!load_seg(sel, base, limit, arbytes))
load_seg(0, base, limit, arbytes);
-@@ -944,8 +1110,11 @@ protected_mode(struct regs *regs)
+@@ -944,8 +1063,11 @@ protected_mode(struct regs *regs)
/* reload all segment registers */
if (!load_seg(regs->cs, &oldctx.cs_base,
@@ -390,7 +341,7 @@ diff --git a/tools/firmware/vmxassist/vm
oldctx.cs_sel = regs->cs;
load_or_clear_seg(oldctx.es_sel, &oldctx.es_base,
-@@ -961,7 +1130,7 @@ protected_mode(struct regs *regs)
+@@ -961,7 +1083,7 @@ protected_mode(struct regs *regs)
/* initialize jump environment to warp back to protected mode */
regs->uss = DATA_SELECTOR;
@@ -399,7 +350,7 @@ diff --git a/tools/firmware/vmxassist/vm
regs->cs = CODE_SELECTOR;
regs->eip = (unsigned) switch_to_protected_mode;
-@@ -1080,7 +1249,7 @@ jmpl(struct regs *regs, int prefix)
+@@ -1080,7 +1202,7 @@ jmpl(struct regs *regs, int prefix)
regs->cs = cs;
regs->eip = eip;
@@ -408,7 +359,7 @@ diff --git a/tools/firmware/vmxassist/vm
set_mode(regs, VM86_PROTECTED);
else if (mode == VM86_PROTECTED_TO_REAL)/* jump to real mode */
set_mode(regs, VM86_REAL);
-@@ -1106,12 +1275,12 @@ jmpl_indirect(struct regs *regs, int pre
+@@ -1106,12 +1228,12 @@ jmpl_indirect(struct regs *regs, int pre
regs->cs = cs;
regs->eip = eip;
@@ -423,7 +374,7 @@ diff --git a/tools/firmware/vmxassist/vm
}
static void
-@@ -1132,7 +1301,7 @@ retl(struct regs *regs, int prefix)
+@@ -1132,7 +1254,7 @@ retl(struct regs *regs, int prefix)
regs->cs = cs;
regs->eip = eip;
@@ -432,7 +383,7 @@ diff --git a/tools/firmware/vmxassist/vm
set_mode(regs, VM86_PROTECTED);
else if (mode == VM86_PROTECTED_TO_REAL)/* jump to real mode */
set_mode(regs, VM86_REAL);
-@@ -1374,6 +1543,10 @@ opcode(struct regs *regs)
+@@ -1374,6 +1496,10 @@ opcode(struct regs *regs)
prefix |= SEG_DS;
continue;
@@ -443,21 +394,16 @@ diff --git a/tools/firmware/vmxassist/vm
case 0x64:
TRACE((regs, regs->eip - eip, "%%fs:"));
prefix |= SEG_FS;
-@@ -1430,7 +1603,12 @@ opcode(struct regs *regs)
+@@ -1430,7 +1556,7 @@ opcode(struct regs *regs)
goto invalid;
return OPC_EMULATED;
- case 0x8E: /* mov r16, sreg */
-+ case 0x8C: /* mov sreg, r/m16 */
-+ if (!mov_from_seg(regs, prefix, opc))
-+ goto invalid;
-+ return OPC_EMULATED;
-+
+ case 0x8E: /* mov r/m16, sreg */
if (!mov_to_seg(regs, prefix, opc))
goto invalid;
return OPC_EMULATED;
-@@ -1468,7 +1646,8 @@ opcode(struct regs *regs)
+@@ -1468,7 +1594,8 @@ opcode(struct regs *regs)
{
int addr, data;
int seg = segment(prefix, regs, regs->vds);
@@ -467,7 +413,7 @@ diff --git a/tools/firmware/vmxassist/vm
if (prefix & DATA32) {
addr = address(regs, seg, offset);
-@@ -1479,7 +1658,8 @@ opcode(struct regs *regs)
+@@ -1479,7 +1606,8 @@ opcode(struct regs *regs)
data = read16(addr);
setreg16(regs, 0, data);
}
@@ -477,7 +423,7 @@ diff --git a/tools/firmware/vmxassist/vm
}
return OPC_EMULATED;
-@@ -1493,7 +1673,8 @@ opcode(struct regs *regs)
+@@ -1493,7 +1621,8 @@ opcode(struct regs *regs)
data = fetch16(regs);
setreg16(regs, 3, data);
}
@@ -487,7 +433,7 @@ diff --git a/tools/firmware/vmxassist/vm
}
return OPC_EMULATED;
-@@ -1508,7 +1689,7 @@ opcode(struct regs *regs)
+@@ -1508,7 +1637,7 @@ opcode(struct regs *regs)
if ((mode == VM86_REAL_TO_PROTECTED) ||
(mode == VM86_PROTECTED_TO_REAL)) {
retl(regs, prefix);
@@ -496,7 +442,7 @@ diff --git a/tools/firmware/vmxassist/vm
}
goto invalid;
-@@ -1546,7 +1727,7 @@ opcode(struct regs *regs)
+@@ -1546,7 +1675,7 @@ opcode(struct regs *regs)
if ((mode == VM86_REAL_TO_PROTECTED) ||
(mode == VM86_PROTECTED_TO_REAL)) {
jmpl(regs, prefix);
@@ -505,7 +451,7 @@ diff --git a/tools/firmware/vmxassist/vm
}
goto invalid;
-@@ -1680,8 +1861,10 @@ trap(int trapno, int errno, struct regs
+@@ -1680,8 +1809,10 @@ trap(int trapno, int errno, struct regs
default:
invalid:
More information about the intel-platform-dev
mailing list