From owner-svn-src-projects@FreeBSD.ORG Sat Aug 4 23:51:21 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id DE3DA106564A; Sat, 4 Aug 2012 23:51:21 +0000 (UTC) (envelope-from neel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id CA3658FC0C; Sat, 4 Aug 2012 23:51:21 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q74NpLMj011940; Sat, 4 Aug 2012 23:51:21 GMT (envelope-from neel@svn.freebsd.org) Received: (from neel@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q74NpLRh011938; Sat, 4 Aug 2012 23:51:21 GMT (envelope-from neel@svn.freebsd.org) Message-Id: <201208042351.q74NpLRh011938@svn.freebsd.org> From: Neel Natu Date: Sat, 4 Aug 2012 23:51:21 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r239044 - projects/bhyve/usr.sbin/bhyve X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 04 Aug 2012 23:51:22 -0000 Author: neel Date: Sat Aug 4 23:51:21 2012 New Revision: 239044 URL: http://svn.freebsd.org/changeset/base/239044 Log: The displacement field in the decoded instruction should be treated as a 8-bit or 32-bit signed integer. Simplify the handling of indirect addressing with displacement by unconditionally adding the 'instruction->disp' to the target address. This is alright since 'instruction->disp' is non-zero only for the addressing modes that specify a displacement. Obtained from: NetApp Modified: projects/bhyve/usr.sbin/bhyve/instruction_emul.c Modified: projects/bhyve/usr.sbin/bhyve/instruction_emul.c ============================================================================== --- projects/bhyve/usr.sbin/bhyve/instruction_emul.c Sat Aug 4 22:48:04 2012 (r239043) +++ projects/bhyve/usr.sbin/bhyve/instruction_emul.c Sat Aug 4 23:51:21 2012 (r239044) @@ -135,7 +135,7 @@ struct decoded_instruction uint8_t *opcode; uint8_t *modrm; uint8_t *sib; - uint8_t *displacement; + uint8_t *displacement; uint8_t *immediate; uint8_t opcode_flags; @@ -337,9 +337,9 @@ decode_extension_operands(struct decoded if (decoded->displacement) { if (decoded->addressing_mode == MOD_INDIRECT_DISP8) { - decoded->disp = (int32_t)*decoded->displacement; + decoded->disp = *((int8_t *)decoded->displacement); } else if (decoded->addressing_mode == MOD_INDIRECT_DISP32) { - decoded->disp = *((int32_t*)decoded->displacement); + decoded->disp = *((int32_t *)decoded->displacement); } } @@ -432,14 +432,6 @@ get_operand(struct vmctx *vm, int vcpu, *operand = reg; return (0); case MOD_INDIRECT: - target = gla2gpa(reg, guest_cr3); - emulated_memory = find_region(target); - if (emulated_memory) { - return emulated_memory->memread(vm, vcpu, target, - 4, operand, - emulated_memory->arg); - } - return (-1); case MOD_INDIRECT_DISP8: case MOD_INDIRECT_DISP32: target = gla2gpa(reg, guest_cr3); @@ -450,7 +442,7 @@ get_operand(struct vmctx *vm, int vcpu, 4, operand, emulated_memory->arg); } - return (-1); + return (-1); default: return (-1); } @@ -473,19 +465,22 @@ perform_write(struct vmctx *vm, int vcpu } else if (instruction->opcode_flags & TO_REG) { reg = instruction->reg; addressing_mode = MOD_DIRECT; - } else + } else return (-1); regname = get_vm_reg_name(reg); error = vm_get_register(vm, vcpu, regname, ®); - if (error) + if (error) return (error); switch(addressing_mode) { case MOD_DIRECT: return vm_set_register(vm, vcpu, regname, operand); case MOD_INDIRECT: + case MOD_INDIRECT_DISP8: + case MOD_INDIRECT_DISP32: target = gla2gpa(reg, guest_cr3); + target += instruction->disp; emulated_memory = find_region(target); if (emulated_memory) { return emulated_memory->memwrite(vm, vcpu, target, @@ -506,7 +501,7 @@ emulate_decoded_instruction(struct vmctx int error; error = get_operand(vm, vcpu, cr3, instruction, &operand); - if (error) + if (error) return (error); return perform_write(vm, vcpu, cr3, instruction, operand); @@ -519,17 +514,17 @@ emulate_instruction(struct vmctx *vm, in int error; void *instruction = gla2hla(rip, cr3); - if ((error = decode_instruction(instruction, &instr)) != 0) + if ((error = decode_instruction(instruction, &instr)) != 0) return (error); - + return emulate_decoded_instruction(vm, vcpu, cr3, &instr); } struct memory_region * -register_emulated_memory(uintptr_t start, size_t len, emulated_read_func_t memread, +register_emulated_memory(uintptr_t start, size_t len, emulated_read_func_t memread, emulated_write_func_t memwrite, void *arg) { - if (registered_regions > MAX_EMULATED_REGIONS) + if (registered_regions >= MAX_EMULATED_REGIONS) return (NULL); struct memory_region *region = &emulated_regions[registered_regions]; @@ -552,4 +547,3 @@ move_memory_region(struct memory_region region->start = start; region->end = start + len; } -