From: Ben Thomas <bthomas@virtualiron.com>
To: xen-devel@lists.xensource.com
Subject: [PATCH] i/o space ADD support
Date: Mon, 30 Oct 2006 16:21:14 -0500 [thread overview]
Message-ID: <45466CCA.3050706@virtualiron.com> (raw)
[-- 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
reply other threads:[~2006-10-30 21:21 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=45466CCA.3050706@virtualiron.com \
--to=bthomas@virtualiron.com \
--cc=xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.