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

List:       bochs-cvs
Subject:    [Bochs-cvs] CVS: bochs/cpu cpu.h, 1.372, 1.373 fetchdecode.cc, 1.138,
From:       Stanislav Shwartsman <sshwarts () users ! sourceforge ! net>
Date:       2007-11-22 17:33:08
Message-ID: E1IvFvI-0000DB-QN () 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-serv433

Modified Files:
	cpu.h fetchdecode.cc fetchdecode64.cc stack32.cc stack64.cc 
Log Message:
Split ENTER_IwBw function according to os32. Fixed ENTER/LEAVE in 64-bit mode


Index: cpu.h
===================================================================
RCS file: /cvsroot/bochs/bochs/cpu/cpu.h,v
retrieving revision 1.372
retrieving revision 1.373
diff -u -d -r1.372 -r1.373
--- cpu.h	21 Nov 2007 22:36:01 -0000	1.372
+++ cpu.h	22 Nov 2007 17:33:05 -0000	1.373
@@ -1404,6 +1404,8 @@
   BX_SMF void DAS(bxInstruction_c *);
   BX_SMF void AAA(bxInstruction_c *);
   BX_SMF void AAS(bxInstruction_c *);
+  BX_SMF void AAM(bxInstruction_c *);
+  BX_SMF void AAD(bxInstruction_c *);
 
   BX_SMF void PUSHAD32(bxInstruction_c *);
   BX_SMF void PUSHAD16(bxInstruction_c *);
@@ -1460,9 +1462,10 @@
   BX_SMF void MOV_GwEwR(bxInstruction_c *);
 
   BX_SMF void MOV_EwSw(bxInstruction_c *);
+  BX_SMF void MOV_SwEw(bxInstruction_c *);
+
   BX_SMF void LEA_GdM(bxInstruction_c *);
   BX_SMF void LEA_GwM(bxInstruction_c *);
-  BX_SMF void MOV_SwEw(bxInstruction_c *);
 
   BX_SMF void CBW(bxInstruction_c *);
   BX_SMF void CWD(bxInstruction_c *);
@@ -1528,7 +1531,8 @@
 
   BX_SMF void RETnear32(bxInstruction_c *);
   BX_SMF void RETnear16(bxInstruction_c *);
-  BX_SMF void ENTER_IwIb(bxInstruction_c *);
+  BX_SMF void ENTER16_IwIb(bxInstruction_c *);
+  BX_SMF void ENTER32_IwIb(bxInstruction_c *);
   BX_SMF void LEAVE(bxInstruction_c *);
   BX_SMF void RETfar32(bxInstruction_c *);
   BX_SMF void RETfar16(bxInstruction_c *);
@@ -1540,8 +1544,6 @@
   BX_SMF void IRET32(bxInstruction_c *);
   BX_SMF void IRET16(bxInstruction_c *);
 
-  BX_SMF void AAM(bxInstruction_c *);
-  BX_SMF void AAD(bxInstruction_c *);
   BX_SMF void SALC(bxInstruction_c *);
   BX_SMF void XLAT(bxInstruction_c *);
 

Index: fetchdecode.cc
===================================================================
RCS file: /cvsroot/bochs/bochs/cpu/fetchdecode.cc,v
retrieving revision 1.138
retrieving revision 1.139
diff -u -d -r1.138 -r1.139
--- fetchdecode.cc	21 Nov 2007 22:36:01 -0000	1.138
+++ fetchdecode.cc	22 Nov 2007 17:33:05 -0000	1.139
@@ -384,7 +384,7 @@
   /* C5 /wr */ { 0, &BX_CPU_C::BxError }, // LDS
   /* C6 /wr */ { BxImmediate_Ib, &BX_CPU_C::MOV_EbIbR },
   /* C7 /wr */ { BxImmediate_Iv, &BX_CPU_C::MOV_EwIwR },
-  /* C8 /wr */ { BxImmediate_IwIb, &BX_CPU_C::ENTER_IwIb },
+  /* C8 /wr */ { BxImmediate_IwIb, &BX_CPU_C::ENTER16_IwIb },
   /* C9 /wr */ { 0, &BX_CPU_C::LEAVE },
   /* CA /wr */ { BxImmediate_Iw, &BX_CPU_C::RETfar16_Iw },
   /* CB /wr */ { 0, &BX_CPU_C::RETfar16 },
@@ -948,7 +948,7 @@
   /* C5 /dr */ { 0, &BX_CPU_C::BxError }, // LDS
   /* C6 /dr */ { BxImmediate_Ib, &BX_CPU_C::MOV_EbIbR },
   /* C7 /dr */ { BxImmediate_Iv, &BX_CPU_C::MOV_EdIdR },
-  /* C8 /dr */ { BxImmediate_IwIb, &BX_CPU_C::ENTER_IwIb },
+  /* C8 /dr */ { BxImmediate_IwIb, &BX_CPU_C::ENTER32_IwIb },
   /* C9 /dr */ { 0, &BX_CPU_C::LEAVE },
   /* CA /dr */ { BxImmediate_Iw, &BX_CPU_C::RETfar32_Iw },
   /* CB /dr */ { 0, &BX_CPU_C::RETfar32 },
@@ -1519,7 +1519,7 @@
   /* C5 /wm */ { 0, &BX_CPU_C::LDS_GwMp },
   /* C6 /wm */ { BxImmediate_Ib, &BX_CPU_C::MOV_EbIbM },
   /* C7 /wm */ { BxImmediate_Iv, &BX_CPU_C::MOV_EwIwM },
-  /* C8 /wm */ { BxImmediate_IwIb, &BX_CPU_C::ENTER_IwIb },
+  /* C8 /wm */ { BxImmediate_IwIb, &BX_CPU_C::ENTER16_IwIb },
   /* C9 /wm */ { 0, &BX_CPU_C::LEAVE },
   /* CA /wm */ { BxImmediate_Iw, &BX_CPU_C::RETfar16_Iw },
   /* CB /wm */ { 0, &BX_CPU_C::RETfar16 },
@@ -2083,7 +2083,7 @@
   /* C5 /dm */ { 0, &BX_CPU_C::LDS_GdMp },
   /* C6 /dm */ { BxImmediate_Ib, &BX_CPU_C::MOV_EbIbM },
   /* C7 /dm */ { BxImmediate_Iv, &BX_CPU_C::MOV_EdIdM },
-  /* C8 /dm */ { BxImmediate_IwIb, &BX_CPU_C::ENTER_IwIb },
+  /* C8 /dm */ { BxImmediate_IwIb, &BX_CPU_C::ENTER32_IwIb },
   /* C9 /dm */ { 0, &BX_CPU_C::LEAVE },
   /* CA /dm */ { BxImmediate_Iw, &BX_CPU_C::RETfar32_Iw },
   /* CB /dm */ { 0, &BX_CPU_C::RETfar32 },

Index: fetchdecode64.cc
===================================================================
RCS file: /cvsroot/bochs/bochs/cpu/fetchdecode64.cc,v
retrieving revision 1.145
retrieving revision 1.146
diff -u -d -r1.145 -r1.146
--- fetchdecode64.cc	21 Nov 2007 22:36:01 -0000	1.145
+++ fetchdecode64.cc	22 Nov 2007 17:33:06 -0000	1.146
@@ -373,8 +373,8 @@
   /* C5 /wr */ { 0, &BX_CPU_C::BxError },
   /* C6 /wr */ { BxImmediate_Ib, &BX_CPU_C::MOV_EbIbR },
   /* C7 /wr */ { BxImmediate_Iv, &BX_CPU_C::MOV_EwIwR },
-  /* C8 /wr */ { BxImmediate_IwIb, &BX_CPU_C::ENTER_IwIb },
-  /* C9 /wr */ { 0, &BX_CPU_C::LEAVE },
+  /* C8 /wr */ { BxImmediate_IwIb, &BX_CPU_C::ENTER64_IwIb },
+  /* C9 /wr */ { 0, &BX_CPU_C::LEAVE64 },
   /* CA /wr */ { BxImmediate_Iw, &BX_CPU_C::RETfar16_Iw },
   /* CB /wr */ { 0, &BX_CPU_C::RETfar16 },
   /* CC /wr */ { 0, &BX_CPU_C::INT3 },
@@ -1966,7 +1966,7 @@
   /* C5 /wm */ { 0, &BX_CPU_C::BxError },
   /* C6 /wm */ { BxImmediate_Ib, &BX_CPU_C::MOV_EbIbM },
   /* C7 /wm */ { BxImmediate_Iv, &BX_CPU_C::MOV_EwIwM },
-  /* C8 /wm */ { BxImmediate_IwIb, &BX_CPU_C::ENTER_IwIb },
+  /* C8 /wm */ { BxImmediate_IwIb, &BX_CPU_C::ENTER16_IwIb },
   /* C9 /wm */ { 0, &BX_CPU_C::LEAVE },
   /* CA /wm */ { BxImmediate_Iw, &BX_CPU_C::RETfar16_Iw },
   /* CB /wm */ { 0, &BX_CPU_C::RETfar16 },

Index: stack32.cc
===================================================================
RCS file: /cvsroot/bochs/bochs/cpu/stack32.cc,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -d -r1.39 -r1.40
--- stack32.cc	20 Nov 2007 17:15:33 -0000	1.39
+++ stack32.cc	22 Nov 2007 17:33:06 -0000	1.40
@@ -246,7 +246,7 @@
 }
 
 #if BX_CPU_LEVEL >= 2
-void BX_CPU_C::ENTER_IwIb(bxInstruction_c *i)
+void BX_CPU_C::ENTER16_IwIb(bxInstruction_c *i)
 {
   unsigned ss32 = BX_CPU_THIS_PTR sregs[BX_SEG_REG_SS].cache.u.segment.d_b;
 
@@ -255,11 +255,7 @@
   level &= 0x1F;
 
   Bit32u ebp; // Use temp copy in case of exception.
-
-  if (i->os32L())
-    push_32(EBP);
-  else
-    push_16(BP);
+  push_16(BP);
 
   Bit32u frame_ptr32 = ESP;
 
@@ -273,42 +269,72 @@
   if (level > 0) {
     /* do level-1 times */
     while (--level) {
-      if (i->os32L()) {
-        Bit32u temp32;
+      Bit16u temp16;
 
-        if (ss32) {
-          ebp -= 4;
-          read_virtual_dword(BX_SEG_REG_SS, ebp, &temp32);
-        }
-        else { /* 16bit stacksize */
-          ebp -= 4; ebp &= 0xffff;
-          read_virtual_dword(BX_SEG_REG_SS, ebp, &temp32);
-        }
-        push_32(temp32);
+      if (ss32) {
+        ebp -= 2;
+        read_virtual_word(BX_SEG_REG_SS, ebp, &temp16);
       }
-      else { /* 16bit opsize */
-        Bit16u temp16;
-
-        if (ss32) {
-          ebp -= 2;
-          read_virtual_word(BX_SEG_REG_SS, ebp, &temp16);
-        }
-        else { /* 16bit stacksize */
-          ebp -= 2; ebp &= 0xffff;
-          read_virtual_word(BX_SEG_REG_SS, ebp, &temp16);
-        }
-        push_16(temp16);
+      else { /* 16bit stacksize */
+        ebp -= 2; ebp &= 0xffff;
+        read_virtual_word(BX_SEG_REG_SS, ebp, &temp16);
       }
-    } /* while (--level) */
+      push_16(temp16);
+    }
 
     /* push(frame pointer) */
-    if (i->os32L()) {
-      push_32(frame_ptr32);
-    }
-    else { /* 16bit opsize */
-      push_16((Bit16u)frame_ptr32);
+    push_16((Bit16u)frame_ptr32);
+  }
+
+  if (ss32) {
+    EBP = frame_ptr32;
+    ESP -= imm16;
+  }
+  else {
+    BP = (Bit16u) frame_ptr32;
+    SP -= imm16;
+  }
+}
+
+void BX_CPU_C::ENTER32_IwIb(bxInstruction_c *i)
+{
+  unsigned ss32 = BX_CPU_THIS_PTR sregs[BX_SEG_REG_SS].cache.u.segment.d_b;
+
+  Bit16u imm16 = i->Iw();
+  Bit8u level = i->Ib2();
+  level &= 0x1F;
+
+  Bit32u ebp; // Use temp copy in case of exception.
+  push_32(EBP);
+
+  Bit32u frame_ptr32 = ESP;
+
+  if (ss32) {
+    ebp = EBP;
+  }
+  else {
+    ebp = BP;
+  }
+
+  if (level > 0) {
+    /* do level-1 times */
+    while (--level) {
+      Bit32u temp32;
+
+      if (ss32) {
+        ebp -= 4;
+        read_virtual_dword(BX_SEG_REG_SS, ebp, &temp32);
+      }
+      else { /* 16bit stacksize */
+        ebp -= 4; ebp &= 0xffff;
+        read_virtual_dword(BX_SEG_REG_SS, ebp, &temp32);
+      }
+      push_32(temp32);
     }
-  } /* if (level > 0) ... */
+
+    /* push(frame pointer) */
+    push_32(frame_ptr32);
+  }
 
   if (ss32) {
     EBP = frame_ptr32;

Index: stack64.cc
===================================================================
RCS file: /cvsroot/bochs/bochs/cpu/stack64.cc,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -d -r1.26 -r1.27
--- stack64.cc	20 Nov 2007 17:15:33 -0000	1.26
+++ stack64.cc	22 Nov 2007 17:33:06 -0000	1.27
@@ -118,12 +118,6 @@
   level &= 0x1F;
   Bit64u bytes_to_push = 8 + level*8 + i->Iw();
 
-  if (! can_push(&BX_CPU_THIS_PTR sregs[BX_SEG_REG_SS].cache, RSP, bytes_to_push))
-  {
-    BX_ERROR(("ENTER: not enough room on stack!"));
-    exception(BX_SS_EXCEPTION, 0, 0);
-  }
-
   push_64(RBP);
 
   Bit64u frame_ptr64 = RSP;


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
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