diff options
author | Neel Natu <neel@FreeBSD.org> | 2015-05-04 04:27:23 +0000 |
---|---|---|
committer | Neel Natu <neel@FreeBSD.org> | 2015-05-04 04:27:23 +0000 |
commit | 6a273d5ef7c73b3cbf7ed0379c36f8eec21a858a (patch) | |
tree | cb7702b7b4fce529b38b1ce5309753d57f15ec02 | |
parent | fc4d77c3cef44cc33821bb44b379188a745d55b5 (diff) |
Emulate the 'CMP r/m8, imm8' instruction encountered when booting a Windows
Vista guest.
Reported by: Leon Dang (ldang@nahannisys.com)
MFC after: 1 week
Notes
Notes:
svn path=/head/; revision=282407
-rw-r--r-- | sys/amd64/vmm/vmm_instruction_emul.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/sys/amd64/vmm/vmm_instruction_emul.c b/sys/amd64/vmm/vmm_instruction_emul.c index 71723654d54f..c83f3e0ba7e9 100644 --- a/sys/amd64/vmm/vmm_instruction_emul.c +++ b/sys/amd64/vmm/vmm_instruction_emul.c @@ -178,14 +178,20 @@ static const struct vie_op one_byte_opcodes[256] = { .op_byte = 0x23, .op_type = VIE_OP_TYPE_AND, }, + [0x80] = { + /* Group 1 extended opcode */ + .op_byte = 0x80, + .op_type = VIE_OP_TYPE_GROUP1, + .op_flags = VIE_OP_F_IMM8, + }, [0x81] = { - /* XXX Group 1 extended opcode */ + /* Group 1 extended opcode */ .op_byte = 0x81, .op_type = VIE_OP_TYPE_GROUP1, .op_flags = VIE_OP_F_IMM, }, [0x83] = { - /* XXX Group 1 extended opcode */ + /* Group 1 extended opcode */ .op_byte = 0x83, .op_type = VIE_OP_TYPE_GROUP1, .op_flags = VIE_OP_F_IMM8, @@ -1066,9 +1072,13 @@ emulate_cmp(void *vm, int vcpuid, uint64_t gpa, struct vie *vie, rflags2 = getcc(size, op1, op2); break; + case 0x80: case 0x81: case 0x83: /* + * 80 /7 cmp r/m8, imm8 + * REX + 80 /7 cmp r/m8, imm8 + * * 81 /7 cmp r/m16, imm16 * 81 /7 cmp r/m32, imm32 * REX.W + 81 /7 cmp r/m64, imm32 sign-extended to 64 @@ -1084,6 +1094,8 @@ emulate_cmp(void *vm, int vcpuid, uint64_t gpa, struct vie *vie, * the status flags. * */ + if (vie->op.op_byte == 0x80) + size = 1; /* get the first operand */ error = memread(vm, vcpuid, gpa, &op1, size, arg); |