Date: Sun, 06 Jan 2013 14:13:54 +0000 From: syuu@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r246300 - in soc2012/syuu/bhyve-bios: etc/mtree lib/libbiosemul lib/libudis86 usr.sbin/bhyve Message-ID: <20130106141657.4D8D8AB5@hub.freebsd.org>
next in thread | raw e-mail | index | archive | help
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, ®s->r.efl.r_rx)) != 0) goto done; - - if ((error = vm_get_register(ctx, vcpu, VM_REG_GUEST_CR0, ®s->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();
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20130106141657.4D8D8AB5>