socsvn commit: r255257 - soc2013/zcore/head/sys/amd64/vmm
zcore at FreeBSD.org
zcore at FreeBSD.org
Sun Jul 28 09:07:09 UTC 2013
Author: zcore
Date: Sun Jul 28 09:07:08 2013
New Revision: 255257
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=255257
Log:
add "or" emulation
For example, orl $2, (%rdx)
Modified:
soc2013/zcore/head/sys/amd64/vmm/vmm_instruction_emul.c
Modified: soc2013/zcore/head/sys/amd64/vmm/vmm_instruction_emul.c
==============================================================================
--- soc2013/zcore/head/sys/amd64/vmm/vmm_instruction_emul.c Sun Jul 28 07:58:34 2013 (r255256)
+++ soc2013/zcore/head/sys/amd64/vmm/vmm_instruction_emul.c Sun Jul 28 09:07:08 2013 (r255257)
@@ -60,6 +60,7 @@
VIE_OP_TYPE_NONE = 0,
VIE_OP_TYPE_MOV,
VIE_OP_TYPE_AND,
+ VIE_OP_TYPE_OR,
VIE_OP_TYPE_LAST
};
@@ -94,7 +95,12 @@
.op_byte = 0x81,
.op_type = VIE_OP_TYPE_AND,
.op_flags = VIE_OP_F_IMM,
- }
+ },
+ [0x83] = {
+ .op_byte = 0x83,
+ .op_type = VIE_OP_TYPE_OR,
+ .op_flags = VIE_OP_F_IMM8,
+ },
};
/* struct vie.mod */
@@ -371,6 +377,52 @@
return (error);
}
+static int
+emulate_or(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
+ mem_region_read_t memread, mem_region_write_t memwrite, void *arg)
+{
+ int error, size;
+ uint64_t val1;
+
+ size = 4;
+ error = EINVAL;
+
+ switch (vie->op.op_byte) {
+ case 0x83:
+ /*
+ * OR reg (ModRM:reg) with immediate and store the
+ * result in reg
+ *
+ * 83/ OR r/m32, imm32
+ * REX.W + 83/ OR r/m64, imm32 sign-extended to 64
+ *
+ * Currently, only the OR operation of the 0x83 opcode
+ * is implemented (ModRM:reg = b100).
+ */
+ if ((vie->reg & 7) != 4)
+ break;
+
+ if (vie->rex_w)
+ size = 8;
+
+ /* get the first operand */
+ error = memread(vm, vcpuid, gpa, &val1, size, arg);
+ if (error)
+ break;
+
+ /*
+ * perform the operation with the pre-fetched immediate
+ * operand and write the result
+ */
+ val1 |= vie->immediate;
+ error = memwrite(vm, vcpuid, gpa, val1, size, arg);
+ break;
+ default:
+ break;
+ }
+ return (error);
+}
+
int
vmm_emulate_instruction(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
mem_region_read_t memread, mem_region_write_t memwrite,
@@ -390,6 +442,10 @@
error = emulate_and(vm, vcpuid, gpa, vie,
memread, memwrite, memarg);
break;
+ case VIE_OP_TYPE_OR:
+ error = emulate_or(vm, vcpuid, gpa, vie,
+ memread, memwrite, memarg);
+ break;
default:
error = EINVAL;
break;
More information about the svn-soc-all
mailing list