From 0ff68a2aa29de4bfe752407ce3d01086c6309ece Mon Sep 17 00:00:00 2001 From: Stanislav Shwartsman Date: Sat, 10 Jan 2009 16:01:55 +0000 Subject: [PATCH] Fixed XSAVE decode in x86-64 mode --- bochs/cpu/fetchdecode.cc | 6 +- bochs/cpu/fetchdecode.h | 145 +++++++++++++++++-------------------- bochs/cpu/fetchdecode64.cc | 8 +- 3 files changed, 75 insertions(+), 84 deletions(-) diff --git a/bochs/cpu/fetchdecode.cc b/bochs/cpu/fetchdecode.cc index 38cadfc27..34ed567b7 100644 --- a/bochs/cpu/fetchdecode.cc +++ b/bochs/cpu/fetchdecode.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: fetchdecode.cc,v 1.218 2008-10-06 17:50:06 sshwarts Exp $ +// $Id: fetchdecode.cc,v 1.219 2009-01-10 16:01:55 sshwarts Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2001 MandrakeSoft S.A. @@ -466,7 +466,7 @@ static const BxOpcodeInfo_t BxOpcodeInfo32R[512*2] = { /* FF /wr */ { BxGroup5, BX_IA_ERROR, BxOpcodeInfoG5wR }, /* 0F 00 /wr */ { BxGroup6, BX_IA_ERROR, BxOpcodeInfoG6 }, - /* 0F 01 /wr */ { BxGroup7, BX_IA_ERROR, BxOpcodeInfoG7R }, + /* 0F 01 /wr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfoG7R }, /* 0F 02 /wr */ { 0, BX_IA_LAR_GvEw }, /* 0F 03 /wr */ { 0, BX_IA_LSL_GvEw }, /* 0F 04 /wr */ { 0, BX_IA_ERROR }, @@ -1029,7 +1029,7 @@ static const BxOpcodeInfo_t BxOpcodeInfo32R[512*2] = { /* FF /dr */ { BxGroup5, BX_IA_ERROR, BxOpcodeInfoG5dR }, /* 0F 00 /dr */ { BxGroup6, BX_IA_ERROR, BxOpcodeInfoG6 }, - /* 0F 01 /dr */ { BxGroup7, BX_IA_ERROR, BxOpcodeInfoG7R }, + /* 0F 01 /dr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfoG7R }, /* 0F 02 /dr */ { 0, BX_IA_LAR_GvEw }, /* 0F 03 /dr */ { 0, BX_IA_LSL_GvEw }, /* 0F 04 /dr */ { 0, BX_IA_ERROR }, diff --git a/bochs/cpu/fetchdecode.h b/bochs/cpu/fetchdecode.h index d3c143f43..e27f29c87 100755 --- a/bochs/cpu/fetchdecode.h +++ b/bochs/cpu/fetchdecode.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: fetchdecode.h,v 1.77 2008-09-16 18:28:53 sshwarts Exp $ +// $Id: fetchdecode.h,v 1.78 2009-01-10 16:01:55 sshwarts Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (c) 2005 Stanislav Shwartsman @@ -3290,62 +3290,76 @@ static const BxOpcodeInfo_t BxOpcodeInfoG6[8] = { /* Group 7 */ /* ******* */ -// ---------------------------------------------------- -// MOD REG RM | non 64 bit mode | 64 bit mode -// ---------------------------------------------------- -// MOD <> 11 7 --- | INVLPG | INVLPG -// MOD == 11 7 0 | #UD | SWAPGS -// MOD == 11 7 1 | RDTSCP | RDTSCP -// MOD == 11 7 2-7 | #UD | #UD - -static const BxOpcodeInfo_t opcodesGroupRmMONITOR[8] = { - /* 0 */ { 0, BX_IA_MONITOR }, - /* 1 */ { BxTraceEnd, BX_IA_MWAIT }, - /* 2 */ { 0, BX_IA_ERROR }, - /* 3 */ { 0, BX_IA_ERROR }, - /* 4 */ { 0, BX_IA_ERROR }, - /* 5 */ { 0, BX_IA_ERROR }, - /* 6 */ { 0, BX_IA_ERROR }, - /* 7 */ { 0, BX_IA_ERROR } -}; - -static const BxOpcodeInfo_t opcodesGroupRmXGETSET[8] = { - /* 0 */ { 0, BX_IA_XGETBV }, - /* 1 */ { 0, BX_IA_XSETBV }, - /* 2 */ { 0, BX_IA_ERROR }, - /* 3 */ { 0, BX_IA_ERROR }, - /* 4 */ { 0, BX_IA_ERROR }, - /* 5 */ { 0, BX_IA_ERROR }, - /* 6 */ { 0, BX_IA_ERROR }, - /* 7 */ { 0, BX_IA_ERROR } -}; - +static const BxOpcodeInfo_t BxOpcodeInfoG7R[64] = { + /* 0F 01 C0 */ { 0, BX_IA_ERROR }, + /* 0F 01 C1 */ { 0, BX_IA_ERROR }, + /* 0F 01 C2 */ { 0, BX_IA_ERROR }, + /* 0F 01 C3 */ { 0, BX_IA_ERROR }, + /* 0F 01 C4 */ { 0, BX_IA_ERROR }, + /* 0F 01 C5 */ { 0, BX_IA_ERROR }, + /* 0F 01 C6 */ { 0, BX_IA_ERROR }, + /* 0F 01 C7 */ { 0, BX_IA_ERROR }, + /* 0F 01 C8 */ { 0, BX_IA_MONITOR }, + /* 0F 01 C9 */ { BxTraceEnd, BX_IA_MWAIT }, + /* 0F 01 CA */ { 0, BX_IA_ERROR }, + /* 0F 01 CB */ { 0, BX_IA_ERROR }, + /* 0F 01 CC */ { 0, BX_IA_ERROR }, + /* 0F 01 CD */ { 0, BX_IA_ERROR }, + /* 0F 01 CE */ { 0, BX_IA_ERROR }, + /* 0F 01 CF */ { 0, BX_IA_ERROR }, + /* 0F 01 D0 */ { 0, BX_IA_XGETBV }, + /* 0F 01 D1 */ { 0, BX_IA_XSETBV }, + /* 0F 01 D2 */ { 0, BX_IA_ERROR }, + /* 0F 01 D3 */ { 0, BX_IA_ERROR }, + /* 0F 01 D4 */ { 0, BX_IA_ERROR }, + /* 0F 01 D5 */ { 0, BX_IA_ERROR }, + /* 0F 01 D6 */ { 0, BX_IA_ERROR }, + /* 0F 01 D7 */ { 0, BX_IA_ERROR }, + /* 0F 01 D8 */ { 0, BX_IA_ERROR }, + /* 0F 01 D9 */ { 0, BX_IA_ERROR }, + /* 0F 01 DA */ { 0, BX_IA_ERROR }, + /* 0F 01 DB */ { 0, BX_IA_ERROR }, + /* 0F 01 DC */ { 0, BX_IA_ERROR }, + /* 0F 01 DD */ { 0, BX_IA_ERROR }, + /* 0F 01 DE */ { 0, BX_IA_ERROR }, + /* 0F 01 DF */ { 0, BX_IA_ERROR }, + /* 0F 01 E0 */ { 0, BX_IA_SMSW_EwR }, + /* 0F 01 E1 */ { 0, BX_IA_SMSW_EwR }, + /* 0F 01 E2 */ { 0, BX_IA_SMSW_EwR }, + /* 0F 01 E3 */ { 0, BX_IA_SMSW_EwR }, + /* 0F 01 E4 */ { 0, BX_IA_SMSW_EwR }, + /* 0F 01 E5 */ { 0, BX_IA_SMSW_EwR }, + /* 0F 01 E6 */ { 0, BX_IA_SMSW_EwR }, + /* 0F 01 E7 */ { 0, BX_IA_SMSW_EwR }, + /* 0F 01 E8 */ { 0, BX_IA_ERROR }, + /* 0F 01 E9 */ { 0, BX_IA_ERROR }, + /* 0F 01 EA */ { 0, BX_IA_ERROR }, + /* 0F 01 EB */ { 0, BX_IA_ERROR }, + /* 0F 01 EC */ { 0, BX_IA_ERROR }, + /* 0F 01 ED */ { 0, BX_IA_ERROR }, + /* 0F 01 EE */ { 0, BX_IA_ERROR }, + /* 0F 01 EF */ { 0, BX_IA_ERROR }, + /* 0F 01 F0 */ { BxTraceEnd, BX_IA_LMSW_Ew }, + /* 0F 01 F1 */ { BxTraceEnd, BX_IA_LMSW_Ew }, + /* 0F 01 F2 */ { BxTraceEnd, BX_IA_LMSW_Ew }, + /* 0F 01 F3 */ { BxTraceEnd, BX_IA_LMSW_Ew }, + /* 0F 01 F4 */ { BxTraceEnd, BX_IA_LMSW_Ew }, + /* 0F 01 F5 */ { BxTraceEnd, BX_IA_LMSW_Ew }, + /* 0F 01 F6 */ { BxTraceEnd, BX_IA_LMSW_Ew }, + /* 0F 01 F7 */ { BxTraceEnd, BX_IA_LMSW_Ew }, #if BX_SUPPORT_X86_64 -static const BxOpcodeInfo_t opcodesGroupRmINVLPG[8] = { - /* 0 */ { 0, BX_IA_ERROR }, - /* 1 */ { 0, BX_IA_RDTSCP }, - /* 2 */ { 0, BX_IA_ERROR }, - /* 3 */ { 0, BX_IA_ERROR }, - /* 4 */ { 0, BX_IA_ERROR }, - /* 5 */ { 0, BX_IA_ERROR }, - /* 6 */ { 0, BX_IA_ERROR }, - /* 7 */ { 0, BX_IA_ERROR } -}; -#endif - -static const BxOpcodeInfo_t BxOpcodeInfoG7R[8] = { - /* 0 */ { 0, BX_IA_ERROR }, - /* 1 */ { BxRMGroup, BX_IA_ERROR, opcodesGroupRmMONITOR }, - /* 2 */ { BxRMGroup, BX_IA_ERROR, opcodesGroupRmXGETSET }, - /* 3 */ { 0, BX_IA_ERROR }, - /* 4 */ { 0, BX_IA_SMSW_EwR }, - /* 5 */ { 0, BX_IA_ERROR }, - /* 6 */ { BxTraceEnd, BX_IA_LMSW_Ew }, -#if BX_SUPPORT_X86_64 - /* 7 */ { BxRMGroup, BX_IA_ERROR, opcodesGroupRmINVLPG } + /* 0F 01 F8 */ { 0, BX_IA_SWAPGS }, + /* 0F 01 F9 */ { 0, BX_IA_RDTSCP }, #else - /* 7 */ { 0, BX_IA_ERROR } + /* 0F 01 F8 */ { 0, BX_IA_ERROR }, + /* 0F 01 F9 */ { 0, BX_IA_ERROR }, #endif + /* 0F 01 FA */ { 0, BX_IA_ERROR }, + /* 0F 01 FB */ { 0, BX_IA_ERROR }, + /* 0F 01 FC */ { 0, BX_IA_ERROR }, + /* 0F 01 FD */ { 0, BX_IA_ERROR }, + /* 0F 01 FE */ { 0, BX_IA_ERROR }, + /* 0F 01 FF */ { 0, BX_IA_ERROR } }; static const BxOpcodeInfo_t BxOpcodeInfoG7M[8] = { @@ -3361,28 +3375,6 @@ static const BxOpcodeInfo_t BxOpcodeInfoG7M[8] = { }; #if BX_SUPPORT_X86_64 -static const BxOpcodeInfo_t opcodesGroup64RmINVLPG[8] = { - /* 0 */ { 0, BX_IA_SWAPGS }, - /* 1 */ { 0, BX_IA_RDTSCP }, - /* 2 */ { 0, BX_IA_ERROR }, - /* 3 */ { 0, BX_IA_ERROR }, - /* 4 */ { 0, BX_IA_ERROR }, - /* 5 */ { 0, BX_IA_ERROR }, - /* 6 */ { 0, BX_IA_ERROR }, - /* 7 */ { 0, BX_IA_ERROR } -}; - -static const BxOpcodeInfo_t BxOpcodeInfo64G7R[8] = { - /* 0 */ { 0, BX_IA_ERROR }, - /* 1 */ { BxRMGroup, BX_IA_ERROR, opcodesGroupRmMONITOR }, - /* 2 */ { 0, BX_IA_ERROR }, - /* 3 */ { 0, BX_IA_ERROR }, - /* 4 */ { 0, BX_IA_SMSW_EwR }, - /* 5 */ { 0, BX_IA_ERROR }, - /* 6 */ { BxTraceEnd, BX_IA_LMSW_Ew }, - /* 7 */ { BxRMGroup, BX_IA_ERROR, opcodesGroup64RmINVLPG } -}; - static const BxOpcodeInfo_t BxOpcodeInfo64G7M[8] = { /* 0 */ { 0, BX_IA_SGDT64_Ms }, /* 1 */ { 0, BX_IA_SIDT64_Ms }, @@ -3395,7 +3387,6 @@ static const BxOpcodeInfo_t BxOpcodeInfo64G7M[8] = { }; #endif - /* ******* */ /* Group 8 */ /* ******* */ diff --git a/bochs/cpu/fetchdecode64.cc b/bochs/cpu/fetchdecode64.cc index 6ad765989..567d58235 100644 --- a/bochs/cpu/fetchdecode64.cc +++ b/bochs/cpu/fetchdecode64.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: fetchdecode64.cc,v 1.220 2008-09-16 19:20:02 sshwarts Exp $ +// $Id: fetchdecode64.cc,v 1.221 2009-01-10 16:01:55 sshwarts Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2001 MandrakeSoft S.A. @@ -439,7 +439,7 @@ static const BxOpcodeInfo_t BxOpcodeInfo64R[512*3] = { /* FF /wr */ { BxGroup5, BX_IA_ERROR, BxOpcodeInfo64G5wR }, /* 0F 00 /wr */ { BxGroup6, BX_IA_ERROR, BxOpcodeInfoG6 }, - /* 0F 01 /wr */ { BxGroup7, BX_IA_ERROR, BxOpcodeInfo64G7R }, + /* 0F 01 /wr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfoG7R }, /* 0F 02 /wr */ { 0, BX_IA_LAR_GvEw }, /* 0F 03 /wr */ { 0, BX_IA_LSL_GvEw }, /* 0F 04 /wr */ { 0, BX_IA_ERROR }, @@ -966,7 +966,7 @@ static const BxOpcodeInfo_t BxOpcodeInfo64R[512*3] = { /* FF /dr */ { BxGroup5, BX_IA_ERROR, BxOpcodeInfo64G5dR }, /* 0F 00 /dr */ { BxGroup6, BX_IA_ERROR, BxOpcodeInfoG6 }, - /* 0F 01 /dr */ { BxGroup7, BX_IA_ERROR, BxOpcodeInfo64G7R }, + /* 0F 01 /dr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfoG7R }, /* 0F 02 /dr */ { 0, BX_IA_LAR_GvEw }, /* 0F 03 /dr */ { 0, BX_IA_LSL_GvEw }, /* 0F 04 /dr */ { 0, BX_IA_ERROR }, @@ -1493,7 +1493,7 @@ static const BxOpcodeInfo_t BxOpcodeInfo64R[512*3] = { /* FF /qr */ { BxGroup5, BX_IA_ERROR, BxOpcodeInfo64G5qR }, /* 0F 00 /qr */ { BxGroup6, BX_IA_ERROR, BxOpcodeInfoG6 }, - /* 0F 01 /qr */ { BxGroup7, BX_IA_ERROR, BxOpcodeInfo64G7R }, + /* 0F 01 /qr */ { BxFPEscape, BX_IA_ERROR, BxOpcodeInfoG7R }, /* 0F 02 /qr */ { 0, BX_IA_LAR_GvEw }, /* 0F 03 /qr */ { 0, BX_IA_LSL_GvEw }, /* 0F 04 /qr */ { 0, BX_IA_ERROR },