|   | 
      | 
  
  
      | 
      | 
  
 
     | 
    | 
  
  
     | 
    | 
  
  
    |   | 
      | 
  
  
    | 
         
xen-devel
[Xen-devel] [PATCH] x86-64/hvm: pio result storing
 
Don't clear upper 32 bits on 8- and 16-bit PIO reads.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
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@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
 |   
 
| <Prev in Thread] | 
Current Thread | 
[Next in Thread> |  
- [Xen-devel] [PATCH] x86-64/hvm: pio result storing,
Jan Beulich <=
  
 |  
  
 | 
    | 
  
  
    |   | 
    |