socsvn commit: r246300 - in soc2012/syuu/bhyve-bios: etc/mtree lib/libbiosemul lib/libudis86 usr.sbin/bhyve

syuu at FreeBSD.org syuu at FreeBSD.org
Sun Jan 6 14:16:58 UTC 2013


Author: syuu
Date: Sun Jan  6 14:13:53 2013
New Revision: 246300
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=246300

Log:
  revert instruction level tracer

Deleted:
  soc2012/syuu/bhyve-bios/lib/libudis86/
Modified:
  soc2012/syuu/bhyve-bios/etc/mtree/BSD.include.dist
  soc2012/syuu/bhyve-bios/lib/libbiosemul/biosemul.c
  soc2012/syuu/bhyve-bios/lib/libbiosemul/biosemul.h
  soc2012/syuu/bhyve-bios/lib/libbiosemul/callback.c
  soc2012/syuu/bhyve-bios/lib/libbiosemul/cpu.c
  soc2012/syuu/bhyve-bios/lib/libbiosemul/port.c
  soc2012/syuu/bhyve-bios/lib/libbiosemul/register.h
  soc2012/syuu/bhyve-bios/usr.sbin/bhyve/Makefile
  soc2012/syuu/bhyve-bios/usr.sbin/bhyve/fbsdrun.c

Modified: soc2012/syuu/bhyve-bios/etc/mtree/BSD.include.dist
==============================================================================
--- soc2012/syuu/bhyve-bios/etc/mtree/BSD.include.dist	Sun Jan  6 07:14:04 2013	(r246299)
+++ soc2012/syuu/bhyve-bios/etc/mtree/BSD.include.dist	Sun Jan  6 14:13:53 2013	(r246300)
@@ -321,8 +321,6 @@
     ..
     sys
     ..
-    udis86
-    ..
     ufs
         ffs
         ..

Modified: soc2012/syuu/bhyve-bios/lib/libbiosemul/biosemul.c
==============================================================================
--- soc2012/syuu/bhyve-bios/lib/libbiosemul/biosemul.c	Sun Jan  6 07:14:04 2013	(r246299)
+++ soc2012/syuu/bhyve-bios/lib/libbiosemul/biosemul.c	Sun Jan  6 14:13:53 2013	(r246300)
@@ -57,7 +57,6 @@
 #endif
 #include <machine/vmm.h>
 #include <vmmapi.h>
-#include <assert.h>
 
 #include "doscmd.h"
 #include "tty.h"
@@ -121,10 +120,9 @@
 #define HDISK_FILE "/home/syuu/test.img"
 
 regcontext_t *saved_regcontext;
-int trace_mode;
 
 /* lobotomise */
-void biosemul_init(struct vmctx *ctx, int vcpu, char *lomem, int trace)
+void biosemul_init(struct vmctx *ctx, int vcpu, char *lomem)
 {
     lomem_addr = lomem;
     ivec = (u_int32_t *)lomem_addr;
@@ -157,18 +155,6 @@
 #if 0
     gettimeofday(&boot_time, 0);
 #endif
-
-	trace_mode = trace;
-	if (trace_mode) {
-		uint64_t rflags;
-		int error;
-
-		error = vm_get_register(ctx, 0, VM_REG_GUEST_RFLAGS, &rflags);
-		assert(error == 0);
-		rflags |= 0x100; /* Trap Flag */
-		error = vm_set_register(ctx, 0, VM_REG_GUEST_RFLAGS, rflags);
-		assert(error == 0);
-	}
 }
 
 #if 0
@@ -849,9 +835,6 @@
 
 	if ((error = vm_get_register(ctx, vcpu, VM_REG_GUEST_RFLAGS, &regs->r.efl.r_rx)) != 0)
 		goto done;
-
-	if ((error = vm_get_register(ctx, vcpu, VM_REG_GUEST_CR0, &regs->r.cr0.r_rx)) != 0)
-		goto done;
 done:
 	return (error);
 }
@@ -862,106 +845,144 @@
 	int error = 0;
 
 	if ((orig->r.gs.r_rx != modified->r.gs.r_rx) &&
-//	    fprintf(stderr, "%s gs:%lx\n", __func__, modified->r.gs.r_rx) &&
+	    fprintf(stderr, "%s gs:%lx\n", __func__, modified->r.gs.r_rx) &&
 	    (error = vm_set_register(ctx, vcpu, VM_REG_GUEST_GS, modified->r.gs.r_rx)) != 0)
 		goto done;
 
 	if ((orig->r.fs.r_rx != modified->r.fs.r_rx) &&
-//	    fprintf(stderr, "%s fs:%lx\n", __func__, modified->r.fs.r_rx) &&
+	    fprintf(stderr, "%s fs:%lx\n", __func__, modified->r.fs.r_rx) &&
 	   (error = vm_set_register(ctx, vcpu, VM_REG_GUEST_FS, modified->r.fs.r_rx)) != 0)
 		goto done;
 
 	if ((orig->r.es.r_rx != modified->r.es.r_rx) &&
-//	    fprintf(stderr, "%s es:%lx\n", __func__, modified->r.es.r_rx) &&
+	    fprintf(stderr, "%s es:%lx\n", __func__, modified->r.es.r_rx) &&
 	   (error = vm_set_register(ctx, vcpu, VM_REG_GUEST_ES, modified->r.es.r_rx)) != 0)
 		goto done;
 
 	if ((orig->r.ds.r_rx != modified->r.ds.r_rx) &&
-//	    fprintf(stderr, "%s ds:%lx\n", __func__, modified->r.ds.r_rx) &&
+	    fprintf(stderr, "%s ds:%lx\n", __func__, modified->r.ds.r_rx) &&
 	   (error = vm_set_register(ctx, vcpu, VM_REG_GUEST_DS, modified->r.es.r_rx)) != 0)
 		goto done;
 
 	if ((orig->r.edi.r_rx != modified->r.edi.r_rx) &&
-//	    fprintf(stderr, "%s edi:%lx\n", __func__, modified->r.edi.r_rx) &&
+	    fprintf(stderr, "%s edi:%lx\n", __func__, modified->r.edi.r_rx) &&
 	   (error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RDI, modified->r.edi.r_rx)) != 0)
 		goto done;
 
 	if ((orig->r.esi.r_rx != modified->r.esi.r_rx) &&
-//	    fprintf(stderr, "%s esi:%lx\n", __func__, modified->r.esi.r_rx) &&
+	    fprintf(stderr, "%s esi:%lx\n", __func__, modified->r.esi.r_rx) &&
 	   (error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RSI, modified->r.esi.r_rx)) != 0)
 		goto done;
 
 	if ((orig->r.ebp.r_rx != modified->r.ebp.r_rx) &&
-//	    fprintf(stderr, "%s ebp:%lx\n", __func__, modified->r.ebp.r_rx) &&
+	    fprintf(stderr, "%s ebp:%lx\n", __func__, modified->r.ebp.r_rx) &&
 	   (error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RBP, modified->r.ebp.r_rx)) != 0)
 		goto done;
 
 	if ((orig->r.ebx.r_rx != modified->r.ebx.r_rx) &&
-//	    fprintf(stderr, "%s ebx:%lx\n", __func__, modified->r.ebx.r_rx) &&
+	    fprintf(stderr, "%s ebx:%lx\n", __func__, modified->r.ebx.r_rx) &&
 	   (error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RBX, modified->r.ebx.r_rx)) != 0)
 		goto done;
 
 	if ((orig->r.edx.r_rx != modified->r.edx.r_rx) &&
-//	    fprintf(stderr, "%s edx:%lx\n", __func__, modified->r.edx.r_rx) &&
+	    fprintf(stderr, "%s edx:%lx\n", __func__, modified->r.edx.r_rx) &&
 	   (error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RDX, modified->r.edx.r_rx)) != 0)
 		goto done;
 
 	if ((orig->r.ecx.r_rx != modified->r.ecx.r_rx) &&
-//	    fprintf(stderr, "%s ecx:%lx\n", __func__, modified->r.ecx.r_rx) &&
+	    fprintf(stderr, "%s ecx:%lx\n", __func__, modified->r.ecx.r_rx) &&
 	   (error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RCX, modified->r.ecx.r_rx)) != 0)
 		goto done;
 
 	if ((orig->r.eax.r_rx != modified->r.eax.r_rx) &&
-//	    fprintf(stderr, "%s eax:%lx\n", __func__, modified->r.eax.r_rx) &&
+	    fprintf(stderr, "%s eax:%lx\n", __func__, modified->r.eax.r_rx) &&
 	   (error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RAX, modified->r.eax.r_rx)) != 0)
 		goto done;
 
 	if ((orig->r.esp.r_rx != modified->r.esp.r_rx) &&
-//	    fprintf(stderr, "%s esp:%lx\n", __func__, modified->r.esp.r_rx) &&
+	    fprintf(stderr, "%s esp:%lx\n", __func__, modified->r.esp.r_rx) &&
 	   (error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RSP, modified->r.esp.r_rx)) != 0)
 		goto done;
 
 	if ((orig->r.ss.r_rx != modified->r.ss.r_rx) &&
-//	    fprintf(stderr, "%s ss:%lx\n", __func__, modified->r.ss.r_rx) &&
+	    fprintf(stderr, "%s ss:%lx\n", __func__, modified->r.ss.r_rx) &&
 	   (error = vm_set_register(ctx, vcpu, VM_REG_GUEST_SS, modified->r.ss.r_rx)) != 0)
 		goto done;
 
 	if ((orig->r.eip.r_rx != modified->r.eip.r_rx) &&
-//	    fprintf(stderr, "%s eip:%lx\n", __func__, modified->r.eip.r_rx) &&
+	    fprintf(stderr, "%s eip:%lx\n", __func__, modified->r.eip.r_rx) &&
 	   (error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RIP, modified->r.eip.r_rx)) != 0)
 		goto done;
 
 	if ((orig->r.cs.r_rx != modified->r.cs.r_rx) &&
-//	    fprintf(stderr, "%s cs:%lx\n", __func__, modified->r.cs.r_rx) &&
+	    fprintf(stderr, "%s cs:%lx\n", __func__, modified->r.cs.r_rx) &&
 	   (error = vm_set_register(ctx, vcpu, VM_REG_GUEST_CS, modified->r.cs.r_rx)) != 0)
 		goto done;
 
 	if ((orig->r.efl.r_rx != modified->r.efl.r_rx) &&
-//	    fprintf(stderr, "%s eflags:%lx\n", __func__, modified->r.efl.r_rx) &&
+	    fprintf(stderr, "%s eflags:%lx\n", __func__, modified->r.efl.r_rx) &&
 	   (error = vm_set_register(ctx, vcpu, VM_REG_GUEST_RFLAGS, modified->r.efl.r_rx)) != 0)
 		goto done;
 done:
-
+	
 	return (error);
 }
 
-extern u_int32_t vec01;
+extern void int13(regcontext_t *REGS);
+
 int
-biosemul_call(struct vmctx *ctx, int vcpu)
+biosemul_call(struct vmctx *ctx, int vcpu, int intno)
 {
 	int ret = 0;
 	regcontext_t orig, modified;
 	regcontext_t *REGS = &modified;
-	callback_t func;
 
 	get_all_regs(ctx, vcpu, &orig);
+	{
+		u_int16_t *sp, eip, cs, efl;
+	
+		sp = (uint16_t *)(lomem_addr + orig.r.esp.r_rx);
+		eip = *sp;
+		cs = *(--sp);
+		efl = *(--sp);
+		fprintf(stderr, "%s eip:%x cs:%x efl:%x\n", 
+			__func__, eip, cs, efl);
+	}
 	modified = orig;
-	func = find_callback(MAKEVEC(R_CS, R_IP));
+	fprintf(stderr, "%s orig RAX=%lx EAX=%x AX=%x AL=%x AH=%x\n",
+		__func__, 
+		orig.r.eax.r_rx,
+		orig.r.eax.r_dw.r_ex,
+		orig.r.eax.r_w.r_x,
+		orig.r.eax.r_b.r_l,
+		orig.r.eax.r_b.r_h);
+	fprintf(stderr, "%s orig RBX=%lx EBX=%x BX=%x BL=%x BH=%x\n",
+		__func__, 
+		orig.r.ebx.r_rx,
+		orig.r.ebx.r_dw.r_ex,
+		orig.r.ebx.r_w.r_x,
+		orig.r.ebx.r_b.r_l,
+		orig.r.ebx.r_b.r_h);
+	fprintf(stderr, "%s modified RAX=%lx EAX=%x AX=%x AL=%x AH=%x\n",
+		__func__, 
+		modified.r.eax.r_rx,
+		modified.r.eax.r_dw.r_ex,
+		modified.r.eax.r_w.r_x,
+		modified.r.eax.r_b.r_l,
+		modified.r.eax.r_b.r_h);
+	fprintf(stderr, "%s modified RBX=%lx EBX=%x BX=%x BL=%x BH=%x\n",
+		__func__, 
+		modified.r.ebx.r_rx,
+		modified.r.ebx.r_dw.r_ex,
+		modified.r.ebx.r_w.r_x,
+		modified.r.ebx.r_b.r_l,
+		modified.r.ebx.r_b.r_h);
+	callback_t func = find_callback(MAKEVEC(R_CS, R_IP));
+	fprintf(stderr, "%s R_CS:%x R_IP:%x MAKEVEC(R_CS, R_IP):%x func:%p\n", 
+		__func__, R_CS, R_IP, MAKEVEC(R_CS, R_IP), func);
 	if (func)
 		func(&modified);
 
-	if (trace_mode && MAKEVEC(R_CS, R_IP) != vec01)
-		R_EFLAGS |= 0x100;
 	set_modified_regs(ctx, vcpu, &orig, &modified);
 
 	return (ret);
@@ -981,6 +1002,9 @@
 	modified = orig;
 	saved_regcontext = &modified;
 
+	fprintf(stderr, "%s in:%d port:%x bytes:%d eax:%x strict:%d\n",
+		__func__, in, port, bytes, *eax, strict);
+
 	if (in)
 		inb(&modified, port);
 	else

Modified: soc2012/syuu/bhyve-bios/lib/libbiosemul/biosemul.h
==============================================================================
--- soc2012/syuu/bhyve-bios/lib/libbiosemul/biosemul.h	Sun Jan  6 07:14:04 2013	(r246299)
+++ soc2012/syuu/bhyve-bios/lib/libbiosemul/biosemul.h	Sun Jan  6 14:13:53 2013	(r246300)
@@ -6,8 +6,8 @@
 #include <machine/vmm.h>
 #include <vmmapi.h>
 
-void biosemul_init(struct vmctx *ctx, int vcpu, char *lomem, int trace_mode);
-int biosemul_call(struct vmctx *ctx, int vcpu);
+void biosemul_init(struct vmctx *ctx, int vcpu, char *lomem);
+int biosemul_call(struct vmctx *ctx, int vcpu, int intno);
 bool biosemul_inout_registered(int in, int port);
 int biosemul_inout(struct vmctx *ctx, int vcpu, int in, int port, int bytes,
 	uint32_t *eax, int strict);

Modified: soc2012/syuu/bhyve-bios/lib/libbiosemul/callback.c
==============================================================================
--- soc2012/syuu/bhyve-bios/lib/libbiosemul/callback.c	Sun Jan  6 07:14:04 2013	(r246299)
+++ soc2012/syuu/bhyve-bios/lib/libbiosemul/callback.c	Sun Jan  6 14:13:53 2013	(r246300)
@@ -43,7 +43,6 @@
 /*
 ** Find a handler for (vec)
 */
-extern u_int32_t vec01;
 callback_t
 find_callback(u_int32_t vec)
 {
@@ -55,8 +54,7 @@
 	if (elm->vec == vec)
 	    break;
     if (elm) {
-	if (vec != vec01)
-		debug(D_TRAPS2, "callback %s\n", elm->name);
+	debug(D_TRAPS2, "callback %s\n", elm->name);
 	return (elm->func);
     } else
 	return ((callback_t)0);

Modified: soc2012/syuu/bhyve-bios/lib/libbiosemul/cpu.c
==============================================================================
--- soc2012/syuu/bhyve-bios/lib/libbiosemul/cpu.c	Sun Jan  6 07:14:04 2013	(r246299)
+++ soc2012/syuu/bhyve-bios/lib/libbiosemul/cpu.c	Sun Jan  6 14:13:53 2013	(r246300)
@@ -27,12 +27,7 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD: projects/doscmd/cpu.c,v 1.8 2002/05/10 10:37:57 tg Exp $");
 
-#include <sys/types.h>
-#include <machine/vmm.h>
-#include <machine/specialreg.h>
-#include <vmmapi.h>
 #include "doscmd.h"
-#include <udis86/udis86.h>
 #include "video.h"
 
 static u_int32_t	decode_modrm(u_int8_t *, u_int16_t,
@@ -56,50 +51,10 @@
     exit(1);
 }
 
-extern char		*lomem_addr;
-
 void
-int01(regcontext_t *REGS)
+int01(regcontext_t *REGS __unused)
 {
-	ud_t ud_obj;
-
-	ud_init(&ud_obj);
-	ud_set_syntax(&ud_obj, UD_SYN_ATT);
-	ud_set_vendor(&ud_obj, UD_VENDOR_INTEL);
-
-	if (R_CR0 & CR0_PE) {
-		u_int32_t *sp, eip, eflags;
-	
-		sp = (uint32_t *)(lomem_addr + R_ESP);
-		eip = *sp;
-		--sp; /* CS */
-		--sp; /* EFLAGS */
-		eflags = *sp;
-		*sp |= 0x100;
-		ud_set_mode(&ud_obj, 32);
-		ud_set_pc(&ud_obj, eip);
-		ud_set_input_buffer(&ud_obj, lomem_addr + eip, 16);
-	
-		fprintf(stderr, "[trace] 32bit eip:%x eflags:%x", eip, eflags);
-	}else{
-		u_int16_t *sp, eip, eflags;
-	
-		sp = (uint16_t *)(lomem_addr + R_ESP);
-		eip = *sp;
-		--sp; /* CS */
-		--sp; /* EFLAGS */
-		eflags = *sp;
-		*sp |= 0x100;
-		ud_set_mode(&ud_obj, 16);
-		ud_set_pc(&ud_obj, eip);
-		ud_set_input_buffer(&ud_obj, lomem_addr + eip, 16);
-	
-		fprintf(stderr, "[trace] 16bit eip:%x eflags:%x", eip, eflags);
-	}
-	ud_disassemble(&ud_obj);
-	fprintf(stderr, " insn:%s", ud_insn_asm(&ud_obj));
-	fprintf(stderr, " eax:%x ebx:%x ecx:%x edx:%x\n",
-			R_EAX, R_EBX, R_ECX, R_EDX);
+    debug(D_ALWAYS, "INT 1 with no handler! (single-step/debug)\n");
 }
 
 void
@@ -114,7 +69,6 @@
     debug(D_ALWAYS, "IRQ5 with no handler!\n");
 }
 
-u_int32_t vec01;
 void
 cpu_init(void)
 {
@@ -124,9 +78,9 @@
     ivec[0x00] = vec;
     register_callback(vec, int00, "int 00");
 
-    vec01 = insert_hardint_trampoline();
-    ivec[0x01] = vec01;
-    register_callback(vec01, int01, "int 01");
+    vec = insert_softint_trampoline();
+    ivec[0x01] = vec;
+    register_callback(vec, int01, "int 01");
 
     vec = insert_softint_trampoline();
     ivec[0x03] = vec;

Modified: soc2012/syuu/bhyve-bios/lib/libbiosemul/port.c
==============================================================================
--- soc2012/syuu/bhyve-bios/lib/libbiosemul/port.c	Sun Jan  6 07:14:04 2013	(r246299)
+++ soc2012/syuu/bhyve-bios/lib/libbiosemul/port.c	Sun Jan  6 14:13:53 2013	(r246300)
@@ -232,6 +232,8 @@
 void
 define_input_port_handler(int port, unsigned char (*p_inb)(int port))
 {
+	fprintf(stderr, "%s port:%d func:%p\n",
+		__func__, port, p_inb);
 	if ((port >= MINPORT) && (port < MAXPORT)) {
 		portsw[port].p_inb = p_inb;
 	} else
@@ -241,6 +243,8 @@
 void
 define_output_port_handler(int port, void (*p_outb)(int port, unsigned char byte))
 {
+	fprintf(stderr, "%s port:%d func:%p\n",
+		__func__, port, p_outb);
 	if ((port >= MINPORT) && (port < MAXPORT)) {
 		portsw[port].p_outb = p_outb;
 	} else

Modified: soc2012/syuu/bhyve-bios/lib/libbiosemul/register.h
==============================================================================
--- soc2012/syuu/bhyve-bios/lib/libbiosemul/register.h	Sun Jan  6 07:14:04 2013	(r246299)
+++ soc2012/syuu/bhyve-bios/lib/libbiosemul/register.h	Sun Jan  6 14:13:53 2013	(r246300)
@@ -84,7 +84,6 @@
     reg86_t	efl;
     reg86_t	esp;
     reg86_t	ss;
-    reg86_t	cr0;
 } registers_t;
 
 typedef union 
@@ -140,7 +139,6 @@
 #define R_GS		(REGS->r.gs.r_w.r_x)
 #define R_EFS		(REGS->r.fs.r_dw.r_ex)
 #define R_FS		(REGS->r.fs.r_w.r_x)
-#define R_CR0		(REGS->r.cr0.r_dw.r_ex)
 
 #endif
 

Modified: soc2012/syuu/bhyve-bios/usr.sbin/bhyve/Makefile
==============================================================================
--- soc2012/syuu/bhyve-bios/usr.sbin/bhyve/Makefile	Sun Jan  6 07:14:04 2013	(r246299)
+++ soc2012/syuu/bhyve-bios/usr.sbin/bhyve/Makefile	Sun Jan  6 14:13:53 2013	(r246300)
@@ -11,8 +11,8 @@
 
 NO_MAN=
 
-DPADD=	${LIBVMMAPI} ${LIBMD} ${LIBPTHREAD} ${LIBBIOSEMUL} ${LIBUDIS86}
-LDADD=	-lvmmapi -lmd -lpthread -lbiosemul -ludis86
+DPADD=	${LIBVMMAPI} ${LIBMD} ${LIBPTHREAD} ${LIBBIOSEMUL}
+LDADD=	-lvmmapi -lmd -lpthread -lbiosemul
 
 WARNS?=	2
 

Modified: soc2012/syuu/bhyve-bios/usr.sbin/bhyve/fbsdrun.c
==============================================================================
--- soc2012/syuu/bhyve-bios/usr.sbin/bhyve/fbsdrun.c	Sun Jan  6 07:14:04 2013	(r246299)
+++ soc2012/syuu/bhyve-bios/usr.sbin/bhyve/fbsdrun.c	Sun Jan  6 14:13:53 2013	(r246300)
@@ -102,7 +102,6 @@
 static int oem_tbl_size;
 
 static int bios_mode;
-static int trace_mode;
 
 static void vm_loop(struct vmctx *ctx, int vcpu, uint64_t rip);
 
@@ -131,7 +130,7 @@
 {
 
         fprintf(stderr,
-                "Usage: %s [-ehBHPbT][-g <gdb port>][-z <hz>][-s <pci>][-p pincpu]"
+                "Usage: %s [-ehBHPb][-g <gdb port>][-z <hz>][-s <pci>][-p pincpu]"
 		"[-n <pci>][-m lowmem][-M highmem] <vm>\n"
 		"       -g: gdb port (default is %d and 0 means don't open)\n"
 		"       -c: # cpus (default 1)\n"
@@ -149,8 +148,7 @@
 		"       -M: highmem in MB\n"
 		"       -x: mux vcpus to 1 hcpu\n"
 		"       -t: mux vcpu timeslice hz (default %d)\n"
-		"	-b: BIOS compatible mode\n"
-		"	-T: Trace mode\n",
+		"	-b: BIOS compatible mode\n",
 		progname, DEFAULT_GDB_PORT, DEFAULT_GUEST_HZ,
 		DEFAULT_GUEST_TSLICE);
 	exit(code);
@@ -442,15 +440,17 @@
 static int
 vmexit_hypercall(struct vmctx *ctx, struct vm_exit *vmexit, int *pvcpu)
 {
+	int intno = (vmexit->rip - 0x400) / 0x4;
+
 	if (!bios_mode) {
 		fprintf(stderr, "Failed to handle hypercall at 0x%lx\n", 
 			vmexit->rip);
 		return (VMEXIT_ABORT);
 	}
 
-	if (biosemul_call(ctx, *pvcpu) != 0) {
-		fprintf(stderr, "Failed to emulate INT at 0x%lx\n", 
-			vmexit->rip);
+	if (biosemul_call(ctx, *pvcpu, intno) != 0) {
+		fprintf(stderr, "Failed to emulate INT %x at 0x%lx\n", 
+			intno, vmexit->rip);
 		return (VMEXIT_ABORT);
 	}
 		
@@ -560,7 +560,7 @@
 	gdb_port = DEFAULT_GDB_PORT;
 	guest_ncpus = 1;
 
-	while ((c = getopt(argc, argv, "ehBHPxbTp:g:c:z:s:S:n:m:M:")) != -1) {
+	while ((c = getopt(argc, argv, "ehBHPxbp:g:c:z:s:S:n:m:M:")) != -1) {
 		switch (c) {
 		case 'B':
 			inject_bkpt = 1;
@@ -610,9 +610,6 @@
 		case 'b':
 			bios_mode = 1;
 			break;
-		case 'T':
-			trace_mode = 1;
-			break;
 		case 'h':
 			usage(0);			
 		default:
@@ -681,10 +678,7 @@
 
 	if (bios_mode != 0) {
 		vm_set_capability(ctx, BSP, VM_CAP_UNRESTRICTED_GUEST, 1);
-		biosemul_init(ctx, 0, lomem_addr, trace_mode);
-	} else if (trace_mode != 0) {
-		fprintf(stderr, "Trace mode only works with BIOS emulation mode\n");
-		return (-1);
+		biosemul_init(ctx, 0, lomem_addr);
 	}
 
 	init_inout();


More information about the svn-soc-all mailing list