All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] i/o space ADD support
@ 2006-10-30 21:21 Ben Thomas
  0 siblings, 0 replies; only message in thread
From: Ben Thomas @ 2006-10-30 21:21 UTC (permalink / raw)
  To: xen-devel

[-- Attachment #1: Type: text/plain, Size: 153 bytes --]

Add support for ADD in I/O spaces



Signed-off-by: Kevin Tronkowski (ktronkowski@virtualiron.com)
                Ben Thomas (bthomas@virtualiron.com)


[-- Attachment #2: mmio_add.patch --]
[-- Type: text/x-patch, Size: 4486 bytes --]

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

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2006-10-30 21:21 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-10-30 21:21 [PATCH] i/o space ADD support Ben Thomas

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.