[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