WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] fix x86 mmio decoder

To: <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH] fix x86 mmio decoder
From: "Jan Beulich" <jbeulich@xxxxxxxxxx>
Date: Fri, 24 Nov 2006 16:14:22 +0000
Delivery-date: Fri, 24 Nov 2006 08:12:43 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
This removes a superfluous (and confusing) special case in xchg and
fixes word-size source operand movzx.

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>

Index: 2006-11-17/xen/arch/x86/hvm/platform.c
===================================================================
--- 2006-11-17.orig/xen/arch/x86/hvm/platform.c 2006-11-24 15:03:15.000000000 
+0100
+++ 2006-11-17/xen/arch/x86/hvm/platform.c      2006-11-24 15:15:01.000000000 
+0100
@@ -506,13 +506,16 @@ static int mmio_decode(int realmode, unsi
         GET_OP_SIZE_FOR_NONEBYTE(*op_size);
         return reg_mem(*op_size, opcode, mmio_op, rex);
 
-    case 0x87:  /* xchg {r/m16|r/m32}, {m/r16|m/r32} */
+    case 0x86:  /* xchg m8, r8 */
+        mmio_op->instr = INSTR_XCHG;
+        *op_size = BYTE;
+        GET_OP_SIZE_FOR_BYTE(size_reg);
+        return reg_mem(size_reg, opcode, mmio_op, rex);
+
+    case 0x87:  /* xchg m16/32, r16/32 */
         mmio_op->instr = INSTR_XCHG;
         GET_OP_SIZE_FOR_NONEBYTE(*op_size);
-        if ( ((*(opcode+1)) & 0xc7) == 5 )
-            return reg_mem(*op_size, opcode, mmio_op, rex);
-        else
-            return mem_reg(*op_size, opcode, mmio_op, rex);
+        return reg_mem(*op_size, opcode, mmio_op, rex);
 
     case 0x88: /* mov r8, m8 */
         mmio_op->instr = INSTR_MOV;
@@ -655,14 +658,11 @@ static int hvm_decode(int realmode, unsi
         mmio_op->operand[1] = mk_operand(*op_size, index, 0, REGISTER);
         return DECODE_success;
 
-    case 0xB7: /* movzx m16/m32, r32/r64 */
+    case 0xB7: /* movzx m16, r32/r64 */
         mmio_op->instr = INSTR_MOVZX;
         GET_OP_SIZE_FOR_NONEBYTE(*op_size);
         index = get_index(opcode + 1, rex);
-        if ( rex & 0x8 )
-            mmio_op->operand[0] = mk_operand(LONG, 0, 0, MEMORY);
-        else
-            mmio_op->operand[0] = mk_operand(WORD, 0, 0, MEMORY);
+        mmio_op->operand[0] = mk_operand(WORD, 0, 0, MEMORY);
         mmio_op->operand[1] = mk_operand(*op_size, index, 0, REGISTER);
         return DECODE_success;
 


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [PATCH] fix x86 mmio decoder, Jan Beulich <=