From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ben Thomas Subject: [PATCH] i/o space ADD support Date: Mon, 30 Oct 2006 16:21:14 -0500 Message-ID: <45466CCA.3050706@virtualiron.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------050808080805080804090403" Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org This is a multi-part message in MIME format. --------------050808080805080804090403 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Add support for ADD in I/O spaces Signed-off-by: Kevin Tronkowski (ktronkowski@virtualiron.com) Ben Thomas (bthomas@virtualiron.com) --------------050808080805080804090403 Content-Type: text/x-patch; name="mmio_add.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="mmio_add.patch" diff -r b3d94f4ddffe tools/ioemu/target-i386-dm/helper2.c --- a/tools/ioemu/target-i386-dm/helper2.c Sat Oct 28 12:30:38 2006 +0100 +++ b/tools/ioemu/target-i386-dm/helper2.c Mon Oct 30 16:06:57 2006 -0500 @@ -393,6 +393,21 @@ void cpu_ioreq_and(CPUState *env, ioreq_ 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; @@ -437,6 +452,9 @@ void __handle_ioreq(CPUState *env, ioreq break; 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); diff -r b3d94f4ddffe xen/arch/x86/hvm/intercept.c --- a/xen/arch/x86/hvm/intercept.c Sat Oct 28 12:30:38 2006 +0100 +++ b/xen/arch/x86/hvm/intercept.c Mon Oct 30 16:06:57 2006 -0500 @@ -109,6 +109,15 @@ static inline void hvm_mmio_access(struc 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 ) { diff -r b3d94f4ddffe xen/arch/x86/hvm/io.c --- a/xen/arch/x86/hvm/io.c Sat Oct 28 12:30:38 2006 +0100 +++ b/xen/arch/x86/hvm/io.c Mon Oct 30 16:06:57 2006 -0500 @@ -532,6 +532,21 @@ static void hvm_mmio_assist(struct cpu_u 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 diff -r b3d94f4ddffe xen/arch/x86/hvm/platform.c --- a/xen/arch/x86/hvm/platform.c Sat Oct 28 12:30:38 2006 +0100 +++ b/xen/arch/x86/hvm/platform.c Mon Oct 30 16:06:57 2006 -0500 @@ -370,6 +370,13 @@ static int hvm_decode(int realmode, unsi /* 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; @@ -1038,6 +1045,10 @@ void handle_mmio(unsigned long gpa) case INSTR_AND: 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: diff -r b3d94f4ddffe xen/include/asm-x86/hvm/io.h --- a/xen/include/asm-x86/hvm/io.h Sat Oct 28 12:30:38 2006 +0100 +++ b/xen/include/asm-x86/hvm/io.h Mon Oct 30 16:06:58 2006 -0500 @@ -64,6 +64,7 @@ #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 */ diff -r b3d94f4ddffe xen/include/public/hvm/ioreq.h --- a/xen/include/public/hvm/ioreq.h Sat Oct 28 12:30:38 2006 +0100 +++ b/xen/include/public/hvm/ioreq.h Mon Oct 30 16:06:58 2006 -0500 @@ -34,6 +34,7 @@ #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 --------------050808080805080804090403 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --------------050808080805080804090403--