Don''t clear upper 32 bits on 8- and 16-bit PIO reads. Signed-off-by: Jan Beulich <jbeulich@novell.com> Index: 2007-04-27/xen/arch/x86/hvm/io.c ==================================================================--- 2007-04-27.orig/xen/arch/x86/hvm/io.c 2007-04-16 09:26:34.000000000 +0200 +++ 2007-04-27/xen/arch/x86/hvm/io.c 2007-05-09 18:00:08.000000000 +0200 @@ -418,11 +418,10 @@ static inline void set_eflags_PF(int siz static void hvm_pio_assist(struct cpu_user_regs *regs, ioreq_t *p, struct hvm_io_op *pio_opp) { - unsigned long old_eax; - int sign = p->df ? -1 : 1; - if ( p->data_is_ptr || (pio_opp->flags & OVERLAP) ) { + int sign = p->df ? -1 : 1; + if ( pio_opp->flags & REPZ ) regs->ecx -= p->count; @@ -459,14 +458,15 @@ static void hvm_pio_assist(struct cpu_us } else if ( p->dir == IOREQ_READ ) { - old_eax = regs->eax; + unsigned long old_eax = regs->eax; + switch ( p->size ) { case 1: - regs->eax = (old_eax & 0xffffff00) | (p->data & 0xff); + regs->eax = (old_eax & ~0xff) | (p->data & 0xff); break; case 2: - regs->eax = (old_eax & 0xffff0000) | (p->data & 0xffff); + regs->eax = (old_eax & ~0xffff) | (p->data & 0xffff); break; case 4: regs->eax = (p->data & 0xffffffff); _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel