[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