diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2008-02-20 14:36:45 +0000 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2008-02-20 14:36:45 +0000 |
commit | 3bb4f99d8cec90c3d7731d004333dd03998e2287 (patch) | |
tree | 106e622cfc9218e44d1c25a29c3409172a55acb0 /xen/arch/x86/hvm/intercept.c | |
parent | 10d08139c54258700129aebe4193b86efdd94f13 (diff) | |
download | xen-3bb4f99d8cec90c3d7731d004333dd03998e2287.tar.gz xen-3bb4f99d8cec90c3d7731d004333dd03998e2287.tar.bz2 xen-3bb4f99d8cec90c3d7731d004333dd03998e2287.zip |
x86 hvm: Replace old MMIO emulator with x86_emulate()-based harness.
Re-factor VMX real-mode emulation to use the same harness.
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
Diffstat (limited to 'xen/arch/x86/hvm/intercept.c')
-rw-r--r-- | xen/arch/x86/hvm/intercept.c | 62 |
1 files changed, 2 insertions, 60 deletions
diff --git a/xen/arch/x86/hvm/intercept.c b/xen/arch/x86/hvm/intercept.c index 76a6dc11a1..e09d2991a0 100644 --- a/xen/arch/x86/hvm/intercept.c +++ b/xen/arch/x86/hvm/intercept.c @@ -31,7 +31,6 @@ #include <xen/event.h> #include <asm/iommu.h> - extern struct hvm_mmio_handler hpet_mmio_handler; extern struct hvm_mmio_handler vlapic_mmio_handler; extern struct hvm_mmio_handler vioapic_mmio_handler; @@ -50,12 +49,11 @@ static inline void hvm_mmio_access(struct vcpu *v, hvm_mmio_read_t read_handler, hvm_mmio_write_t write_handler) { - unsigned int tmp1, tmp2; unsigned long data; - switch ( p->type ) { - case IOREQ_TYPE_COPY: + switch ( p->type ) { + case IOREQ_TYPE_COPY: if ( !p->data_is_ptr ) { if ( p->dir == IOREQ_READ ) p->data = read_handler(v, p->addr, p->size); @@ -87,62 +85,6 @@ static inline void hvm_mmio_access(struct vcpu *v, } } break; - } - - case IOREQ_TYPE_AND: - tmp1 = read_handler(v, p->addr, p->size); - if ( p->dir == IOREQ_WRITE ) { - tmp2 = tmp1 & (unsigned long) p->data; - write_handler(v, p->addr, p->size, tmp2); - } - p->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->data; - write_handler(v, p->addr, p->size, tmp2); - } - p->data = tmp1; - break; - - case IOREQ_TYPE_OR: - tmp1 = read_handler(v, p->addr, p->size); - if ( p->dir == IOREQ_WRITE ) { - tmp2 = tmp1 | (unsigned long) p->data; - write_handler(v, p->addr, p->size, tmp2); - } - p->data = tmp1; - break; - - case IOREQ_TYPE_XOR: - tmp1 = read_handler(v, p->addr, p->size); - if ( p->dir == IOREQ_WRITE ) { - tmp2 = tmp1 ^ (unsigned long) p->data; - write_handler(v, p->addr, p->size, tmp2); - } - p->data = tmp1; - break; - - case IOREQ_TYPE_XCHG: - /* - * Note that we don't need to be atomic here since VCPU is accessing - * its own local APIC. - */ - tmp1 = read_handler(v, p->addr, p->size); - write_handler(v, p->addr, p->size, (unsigned long) p->data); - p->data = tmp1; - break; - - case IOREQ_TYPE_SUB: - tmp1 = read_handler(v, p->addr, p->size); - if ( p->dir == IOREQ_WRITE ) { - tmp2 = tmp1 - (unsigned long) p->data; - write_handler(v, p->addr, p->size, tmp2); - } - p->data = tmp1; - break; default: printk("hvm_mmio_access: error ioreq type %x\n", p->type); |