[prev in list] [next in list] [prev in thread] [next in thread] 

List:       bochs-cvs
Subject:    [Bochs-cvs] CVS: bochs/cpu fetchdecode64.cc, 1.98, 1.99 proc_ctrl.cc,
From:       Stanislav Shwartsman <sshwarts () users ! sourceforge ! net>
Date:       2006-06-26 21:07:46
Message-ID: E1FuyJ8-0007Yy-KW () sc8-pr-cvs3 ! sourceforge ! net
[Download RAW message or body]

Update of /cvsroot/bochs/bochs/cpu
In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv28967

Modified Files:
	fetchdecode64.cc proc_ctrl.cc 
Log Message:
Fixed DR registers handling in x86-64 mode


Index: fetchdecode64.cc
===================================================================
RCS file: /cvsroot/bochs/bochs/cpu/fetchdecode64.cc,v
retrieving revision 1.98
retrieving revision 1.99
diff -u -d -r1.98 -r1.99
--- fetchdecode64.cc	9 Jun 2006 22:29:07 -0000	1.98
+++ fetchdecode64.cc	26 Jun 2006 21:07:44 -0000	1.99
@@ -848,9 +848,9 @@
   /* 0F 1E */ { 0, &BX_CPU_C::BxError },
   /* 0F 1F */ { BxAnother, &BX_CPU_C::NOP },      // multi-byte NOP
   /* 0F 20 */ { BxAnother, &BX_CPU_C::MOV_RqCq },
-  /* 0F 21 */ { BxAnother, &BX_CPU_C::MOV_RdDd },
+  /* 0F 21 */ { BxAnother, &BX_CPU_C::MOV_RqDq },
   /* 0F 22 */ { BxAnother, &BX_CPU_C::MOV_CqRq },
-  /* 0F 23 */ { BxAnother, &BX_CPU_C::MOV_DdRd },
+  /* 0F 23 */ { BxAnother, &BX_CPU_C::MOV_DqRq },
   /* 0F 24 */ { 0, &BX_CPU_C::BxError },
   /* 0F 25 */ { 0, &BX_CPU_C::BxError },
   /* 0F 26 */ { 0, &BX_CPU_C::BxError },
@@ -1377,9 +1377,9 @@
   /* 0F 1E */ { 0, &BX_CPU_C::BxError },
   /* 0F 1F */ { BxAnother, &BX_CPU_C::NOP },      // multi-byte NOP
   /* 0F 20 */ { BxAnother, &BX_CPU_C::MOV_RqCq },
-  /* 0F 21 */ { BxAnother, &BX_CPU_C::MOV_RdDd },
+  /* 0F 21 */ { BxAnother, &BX_CPU_C::MOV_RqDq },
   /* 0F 22 */ { BxAnother, &BX_CPU_C::MOV_CqRq },
-  /* 0F 23 */ { BxAnother, &BX_CPU_C::MOV_DdRd },
+  /* 0F 23 */ { BxAnother, &BX_CPU_C::MOV_DqRq },
   /* 0F 24 */ { 0, &BX_CPU_C::BxError },
   /* 0F 25 */ { 0, &BX_CPU_C::BxError },
   /* 0F 26 */ { 0, &BX_CPU_C::BxError },

Index: proc_ctrl.cc
===================================================================
RCS file: /cvsroot/bochs/bochs/cpu/proc_ctrl.cc,v
retrieving revision 1.154
retrieving revision 1.155
diff -u -d -r1.154 -r1.155
--- proc_ctrl.cc	14 Jun 2006 16:44:33 -0000	1.154
+++ proc_ctrl.cc	26 Jun 2006 21:07:44 -0000	1.155
@@ -208,7 +208,7 @@
    * regardless of the encoding of the MOD field in the MODRM byte.   
    */
   if (!i->modC0())
-    BX_INFO(("MOV_DdRd(): rm field not a register!"));
+    BX_PANIC(("MOV_DdRd(): rm field not a register!"));
 
   invalidate_prefetch_q();
 
@@ -337,7 +337,7 @@
    * regardless of the encoding of the MOD field in the MODRM byte.   
    */
   if (!i->modC0())
-    BX_INFO(("MOV_RdDd(): rm field not a register!"));
+    BX_PANIC(("MOV_RdDd(): rm field not a register!"));
 
   /* #GP(0) if CPL is not 0 */
   if (protected_mode() && (CPL!=0)) {
@@ -402,12 +402,7 @@
 #if BX_SUPPORT_X86_64
 void BX_CPU_C::MOV_DqRq(bxInstruction_c *i)
 {
-  Bit64u val_64;
-
-  if (v8086_mode()) {
-    BX_INFO(("MOV_DqRq: v8086 mode causes #GP(0)"));
-    exception(BX_GP_EXCEPTION, 0, 0);
-  }
+  BX_ASSERT(protected_mode());
 
   /* NOTES:
    *   64bit operands always used
@@ -419,20 +414,19 @@
    * regardless of the encoding of the MOD field in the MODRM byte.   
    */
   if (!i->modC0())
-    BX_INFO(("MOV_DqRq(): rm field not a register!"));
+    BX_PANIC(("MOV_DqRq(): rm field not a register!"));
 
   invalidate_prefetch_q();
 
   /* #GP(0) if CPL is not 0 */
-  if (protected_mode() && CPL!=0) {
-    BX_INFO(("MOV_DqRq: #GP(0) if CPL is not 0"));
+  if (CPL != 0) {
+    BX_ERROR(("MOV_DqRq: #GP(0) if CPL is not 0"));
     exception(BX_GP_EXCEPTION, 0, 0);
   }
 
-  val_64 = BX_READ_64BIT_REG(i->rm());
+  Bit64u val_64 = BX_READ_64BIT_REG(i->rm());
   if (bx_dbg.dreg)
-    BX_INFO(("MOV_DqRq: DR[%u]=%08xh unhandled",
-      (unsigned) i->nnn(), (unsigned) val_64));
+    BX_INFO(("MOV_DqRq: DR[%u]=%08xh unhandled", i->nnn(), (unsigned) val_64));
 
   switch (i->nnn()) {
     case 0: // DR0
@@ -526,20 +520,17 @@
 {
   Bit64u val_64;
 
-  if (v8086_mode()) {
-    BX_INFO(("MOV_RqDq: v8086 mode causes #GP(0)"));
-    exception(BX_GP_EXCEPTION, 0, 0);
-  }
+  BX_ASSERT(protected_mode());
 
   /* This instruction is always treated as a register-to-register,
    * regardless of the encoding of the MOD field in the MODRM byte.   
    */
   if (!i->modC0())
-    BX_INFO(("MOV_RqDq(): rm field not a register!"));
+    BX_PANIC(("MOV_RqDq(): rm field not a register!"));
 
   /* #GP(0) if CPL is not 0 */
-  if (protected_mode() && (CPL!=0)) {
-    BX_INFO(("MOV_RqDq: #GP(0) if CPL is not 0"));
+  if (CPL != 0) {
+    BX_ERROR(("MOV_RqDq: #GP(0) if CPL is not 0"));
     exception(BX_GP_EXCEPTION, 0, 0);
   }
 
@@ -614,7 +605,7 @@
    * regardless of the encoding of the MOD field in the MODRM byte.   
    */
   if (!i->modC0())
-    BX_INFO(("MOV_CdRd(): rm field not a register!"));
+    BX_PANIC(("MOV_CdRd(): rm field not a register!"));
 
   invalidate_prefetch_q();
 
@@ -681,7 +672,7 @@
    * regardless of the encoding of the MOD field in the MODRM byte.   
    */
   if (!i->modC0())
-    BX_INFO(("MOV_RdCd(): rm field not a register!"));
+    BX_PANIC(("MOV_RdCd(): rm field not a register!"));
 
   /* #GP(0) if CPL is not 0 */
   if (protected_mode() && CPL!=0) {
@@ -728,11 +719,7 @@
   // mov general register data to control register
   Bit64u val_64;
 
-  if (v8086_mode())
-  {
-    BX_INFO(("MOV_CqRq: v8086 mode causes #GP(0)"));
-    exception(BX_GP_EXCEPTION, 0, 0);
-  }
+  BX_ASSERT(protected_mode());
 
   /* NOTES:
    *   64bit operands always used
@@ -744,13 +731,13 @@
    * regardless of the encoding of the MOD field in the MODRM byte.   
    */
   if (!i->modC0())
-    BX_INFO(("MOV_CqRq(): rm field not a register!"));
+    BX_PANIC(("MOV_CqRq(): rm field not a register!"));
 
   invalidate_prefetch_q();
 
   /* #GP(0) if CPL is not 0 */
-  if (protected_mode() && CPL!=0) {
-    BX_INFO(("MOV_CqRq: #GP(0) if CPL is not 0"));
+  if (CPL!=0) {
+    BX_ERROR(("MOV_CqRq: #GP(0) if CPL is not 0"));
     exception(BX_GP_EXCEPTION, 0, 0);
   }
 
@@ -804,10 +791,7 @@
   // mov control register data to register
   Bit64u val_64;
 
-  if (v8086_mode()) {
-    BX_INFO(("MOV_RqCq: v8086 mode causes #GP(0)"));
-    exception(BX_GP_EXCEPTION, 0, 0);
-  }
+  BX_ASSERT(protected_mode());
 
   /* NOTES:
    *   64bit operands always used
@@ -819,11 +803,11 @@
    * regardless of the encoding of the MOD field in the MODRM byte.   
    */
   if (!i->modC0())
-    BX_INFO(("MOV_RqCq(): rm field not a register!"));
+    BX_PANIC(("MOV_RqCq(): rm field not a register!"));
 
   /* #GP(0) if CPL is not 0 */
-  if (protected_mode() && CPL!=0) {
-    BX_INFO(("MOV_RqCq: #GP(0) if CPL is not 0"));
+  if (CPL!=0) {
+    BX_ERROR(("MOV_RqCq: #GP(0) if CPL is not 0"));
     exception(BX_GP_EXCEPTION, 0, 0);
   }
 


Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Bochs-cvs mailing list
Bochs-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bochs-cvs
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic