aboutsummaryrefslogtreecommitdiffstats
path: root/tools/ioemu/target-i386-dm
diff options
context:
space:
mode:
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>2007-04-16 11:35:58 +0100
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>2007-04-16 11:35:58 +0100
commita05c7f41031a0ab44c8bfea241e74c7daad6d880 (patch)
tree948ae90f08d28200259d39355276f2aa616cd695 /tools/ioemu/target-i386-dm
parentc87744f312d460602373badbc2ae58d46b220f8c (diff)
downloadxen-a05c7f41031a0ab44c8bfea241e74c7daad6d880.tar.gz
xen-a05c7f41031a0ab44c8bfea241e74c7daad6d880.tar.bz2
xen-a05c7f41031a0ab44c8bfea241e74c7daad6d880.zip
hvm: Fix a bug in the mmio emulation of SUB instruction.
Signed-off-by: Dexuan Cui <dexuan.cui@intel.com>
Diffstat (limited to 'tools/ioemu/target-i386-dm')
-rw-r--r--tools/ioemu/target-i386-dm/helper2.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/tools/ioemu/target-i386-dm/helper2.c b/tools/ioemu/target-i386-dm/helper2.c
index 7beda011c6..513d925b73 100644
--- a/tools/ioemu/target-i386-dm/helper2.c
+++ b/tools/ioemu/target-i386-dm/helper2.c
@@ -408,6 +408,21 @@ void cpu_ioreq_add(CPUState *env, ioreq_t *req)
req->data = tmp1;
}
+void cpu_ioreq_sub(CPUState *env, ioreq_t *req)
+{
+ unsigned long tmp1, tmp2;
+
+ if (req->data_is_ptr != 0)
+ hw_error("expected scalar value");
+
+ read_physical(req->addr, req->size, &tmp1);
+ if (req->dir == IOREQ_WRITE) {
+ tmp2 = tmp1 - (unsigned long) req->data;
+ write_physical(req->addr, req->size, &tmp2);
+ }
+ req->data = tmp1;
+}
+
void cpu_ioreq_or(CPUState *env, ioreq_t *req)
{
unsigned long tmp1, tmp2;
@@ -496,6 +511,9 @@ void __handle_ioreq(CPUState *env, ioreq_t *req)
case IOREQ_TYPE_ADD:
cpu_ioreq_add(env, req);
break;
+ case IOREQ_TYPE_SUB:
+ cpu_ioreq_sub(env, req);
+ break;
case IOREQ_TYPE_OR:
cpu_ioreq_or(env, req);
break;