Date: Sat, 4 Aug 2012 23:51:21 +0000 (UTC) From: Neel Natu <neel@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r239044 - projects/bhyve/usr.sbin/bhyve Message-ID: <201208042351.q74NpLRh011938@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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; } -
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201208042351.q74NpLRh011938>