xserver: Branch 'master'

Adam Jackson ajax at kemper.freedesktop.org
Mon Jun 23 11:14:33 PDT 2008


 hw/xfree86/x86emu/ops2.c |   63 +++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 55 insertions(+), 8 deletions(-)

New commits:
commit c8d066a15142678041c1d82ccf530dcdb2ea74ca
Author: Adam Jackson <ajax at redhat.com>
Date:   Mon Jun 23 13:59:48 2008 -0400

    Implement bswap in x86emu.
    
    Yes, this is a 486+ instruction and thus not strictly legal in vm86
    mode, but enough BIOSes use it (looking at you VIA) that we might as
    well implement it.

diff --git a/hw/xfree86/x86emu/ops2.c b/hw/xfree86/x86emu/ops2.c
index 324de8a..a1eda76 100644
--- a/hw/xfree86/x86emu/ops2.c
+++ b/hw/xfree86/x86emu/ops2.c
@@ -40,6 +40,12 @@
 
 #include "x86emu/x86emui.h"
 
+#undef bswap_32
+#define bswap_32(x) (((x & 0xff000000) >> 24) | \
+		     ((x & 0x00ff0000) >> 8) | \
+		     ((x & 0x0000ff00) << 8) | \
+		     ((x & 0x000000ff) << 24))
+
 /*----------------------------- Implementation ----------------------------*/
 
 /****************************************************************************
@@ -2571,6 +2577,47 @@ static void x86emuOp2_movsx_word_R_RM(u8 X86EMU_UNUSED(op2))
     END_OF_INSTR();
 }
 
+/* Handles opcodes 0xc8-0xcf */
+static void x86emuOp2_bswap(u8 X86EMU_UNUSED(op2))
+{
+    START_OF_INSTR();
+    DECODE_PRINTF("BSWAP\n");
+    TRACE_AND_STEP();
+
+    switch (op2) {
+	case 0xc8:
+	    M.x86.R_EAX = bswap_32(M.x86.R_EAX);
+	    break;
+	case 0xc9:
+	    M.x86.R_ECX = bswap_32(M.x86.R_ECX);
+	    break;
+	case 0xca:
+	    M.x86.R_EDX = bswap_32(M.x86.R_EDX);
+	    break;
+	case 0xcb:
+	    M.x86.R_EBX = bswap_32(M.x86.R_EBX);
+	    break;
+	case 0xcc:
+	    M.x86.R_ESP = bswap_32(M.x86.R_ESP);
+	    break;
+	case 0xcd:
+	    M.x86.R_EBP = bswap_32(M.x86.R_EBP);
+	    break;
+	case 0xce:
+	    M.x86.R_ESI = bswap_32(M.x86.R_ESI);
+	    break;
+	case 0xcf:
+	    M.x86.R_EDI = bswap_32(M.x86.R_EDI);
+	    break;
+	default:
+	    /* can't happen */
+	    break;
+    }
+
+    DECODE_CLEAR_SEGOVR();
+    END_OF_INSTR();
+}
+
 /***************************************************************************
  * Double byte operation code table:
  **************************************************************************/
@@ -2788,14 +2835,14 @@ void (*x86emu_optab2[256])(u8) =
 /*  0xc5 */ x86emuOp2_illegal_op,
 /*  0xc6 */ x86emuOp2_illegal_op,
 /*  0xc7 */ x86emuOp2_illegal_op,
-/*  0xc8 */ x86emuOp2_illegal_op,  /* TODO: bswap */
-/*  0xc9 */ x86emuOp2_illegal_op,  /* TODO: bswap */
-/*  0xca */ x86emuOp2_illegal_op,  /* TODO: bswap */
-/*  0xcb */ x86emuOp2_illegal_op,  /* TODO: bswap */
-/*  0xcc */ x86emuOp2_illegal_op,  /* TODO: bswap */
-/*  0xcd */ x86emuOp2_illegal_op,  /* TODO: bswap */
-/*  0xce */ x86emuOp2_illegal_op,  /* TODO: bswap */
-/*  0xcf */ x86emuOp2_illegal_op,  /* TODO: bswap */
+/*  0xc8 */ x86emuOp2_bswap,
+/*  0xc9 */ x86emuOp2_bswap,
+/*  0xca */ x86emuOp2_bswap,
+/*  0xcb */ x86emuOp2_bswap,
+/*  0xcc */ x86emuOp2_bswap,
+/*  0xcd */ x86emuOp2_bswap,
+/*  0xce */ x86emuOp2_bswap,
+/*  0xcf */ x86emuOp2_bswap,
 
 /*  0xd0 */ x86emuOp2_illegal_op,
 /*  0xd1 */ x86emuOp2_illegal_op,


More information about the xorg-commit mailing list