diff options
author | kfraser@localhost.localdomain <kfraser@localhost.localdomain> | 2007-04-16 11:35:58 +0100 |
---|---|---|
committer | kfraser@localhost.localdomain <kfraser@localhost.localdomain> | 2007-04-16 11:35:58 +0100 |
commit | a05c7f41031a0ab44c8bfea241e74c7daad6d880 (patch) | |
tree | 948ae90f08d28200259d39355276f2aa616cd695 /tools/ioemu/target-i386-dm | |
parent | c87744f312d460602373badbc2ae58d46b220f8c (diff) | |
download | xen-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.c | 18 |
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; |