req->u.data = tmp1;
}
+void cpu_ioreq_add(CPUState *env, ioreq_t *req)
+{
+ unsigned long tmp1, tmp2;
+
+ if (req->pdata_valid != 0)
+ hw_error("expected scalar value");
+
+ read_physical(req->addr, req->size, &tmp1);
+ if (req->dir == IOREQ_WRITE) {
+ tmp2 = tmp1 + (unsigned long) req->u.data;
+ write_physical(req->addr, req->size, &tmp2);
+ }
+ req->u.data = tmp1;
+}
+
void cpu_ioreq_or(CPUState *env, ioreq_t *req)
{
unsigned long tmp1, tmp2;
case IOREQ_TYPE_AND:
cpu_ioreq_and(env, req);
break;
+ case IOREQ_TYPE_ADD:
+ cpu_ioreq_add(env, req);
+ break;
case IOREQ_TYPE_OR:
cpu_ioreq_or(env, req);
break;
p->u.data = tmp1;
break;
+ case IOREQ_TYPE_ADD:
+ tmp1 = read_handler(v, p->addr, p->size);
+ if (p->dir == IOREQ_WRITE) {
+ tmp2 = tmp1 + (unsigned long) p->u.data;
+ write_handler(v, p->addr, p->size, tmp2);
+ }
+ p->u.data = tmp1;
+ break;
+
case IOREQ_TYPE_OR:
tmp1 = read_handler(v, p->addr, p->size);
if ( p->dir == IOREQ_WRITE ) {
set_reg_value(size, index, 0, regs, diff);
}
+ case INSTR_ADD:
+ if (src & REGISTER) {
+ index = operand_index(src);
+ value = get_reg_value(size, index, 0, regs);
+ diff = (unsigned long) p->u.data + value;
+ } else if (src & IMMEDIATE) {
+ value = mmio_opp->immediate;
+ diff = (unsigned long) p->u.data + value;
+ } else if (src & MEMORY) {
+ index = operand_index(dst);
+ value = get_reg_value(size, index, 0, regs);
+ diff = (unsigned long) p->u.data + value;
+ set_reg_value(size, index, 0, regs, diff);
+ }
+
/*
* The OF and CF flags are cleared; the SF, ZF, and PF
* flags are set according to the result. The state of
/* the operands order in comments conforms to AT&T convention */
switch ( *opcode ) {
+
+ case 0x00: /* add r8, m8 */
+ mmio_op->instr = INSTR_ADD;
+ *op_size = BYTE;
+ GET_OP_SIZE_FOR_BYTE(size_reg);
+ return reg_mem(size_reg, opcode, mmio_op, rex);
+
case 0x0A: /* or m8, r8 */
mmio_op->instr = INSTR_OR;
*op_size = BYTE;
mmio_operands(IOREQ_TYPE_AND, gpa, mmio_op, op_size);
break;
+ case INSTR_ADD:
+ mmio_operands(IOREQ_TYPE_ADD, gpa, mmio_op, op_size);
+ break;
+
case INSTR_XOR:
mmio_operands(IOREQ_TYPE_XOR, gpa, mmio_op, op_size);
break;
#define INSTR_BT 13
#define INSTR_XCHG 14
#define INSTR_SUB 15
+#define INSTR_ADD 16
#define MAX_INST_LEN 15 /* Maximum instruction length = 15 bytes */
#define IOREQ_TYPE_OR 3
#define IOREQ_TYPE_XOR 4
#define IOREQ_TYPE_XCHG 5
+#define IOREQ_TYPE_ADD 6
/*
* VMExit dispatcher should cooperate with instruction decoder to