Add NIL register and simplify more BxResolve work
This commit is contained in:
parent
b745be68ef
commit
e48b398bee
@ -1,5 +1,5 @@
|
|||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// $Id: cpu.h,v 1.437 2008-03-25 16:46:39 sshwarts Exp $
|
// $Id: cpu.h,v 1.438 2008-03-29 09:34:32 sshwarts Exp $
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||||
@ -93,6 +93,10 @@
|
|||||||
#define BX_32BIT_REG_EIP BX_GENERAL_REGISTERS
|
#define BX_32BIT_REG_EIP BX_GENERAL_REGISTERS
|
||||||
#define BX_64BIT_REG_RIP BX_GENERAL_REGISTERS
|
#define BX_64BIT_REG_RIP BX_GENERAL_REGISTERS
|
||||||
|
|
||||||
|
#define BX_16BIT_REG_NIL (BX_GENERAL_REGISTERS+1)
|
||||||
|
#define BX_32BIT_REG_NIL (BX_GENERAL_REGISTERS+1)
|
||||||
|
#define BX_64BIT_REG_NIL (BX_GENERAL_REGISTERS+1)
|
||||||
|
|
||||||
#if defined(NEED_CPU_REG_SHORTCUTS)
|
#if defined(NEED_CPU_REG_SHORTCUTS)
|
||||||
|
|
||||||
/* WARNING:
|
/* WARNING:
|
||||||
@ -725,16 +729,18 @@ public: // for now...
|
|||||||
cpuid_function_t cpuid_ext_function[MAX_EXT_CPUID_FUNCTION];
|
cpuid_function_t cpuid_ext_function[MAX_EXT_CPUID_FUNCTION];
|
||||||
|
|
||||||
// General register set
|
// General register set
|
||||||
// eax: accumulator
|
// rax: accumulator
|
||||||
// ebx: base
|
// rbx: base
|
||||||
// ecx: count
|
// rcx: count
|
||||||
// edx: data
|
// rdx: data
|
||||||
// ebp: base pointer
|
// rbp: base pointer
|
||||||
// esi: source index
|
// rsi: source index
|
||||||
// edi: destination index
|
// rdi: destination index
|
||||||
// esp: stack pointer
|
// esp: stack pointer
|
||||||
// eip: instruction pointer
|
// r8..r15 x86-64 extended registers
|
||||||
bx_gen_reg_t gen_reg[BX_GENERAL_REGISTERS+1];
|
// rip: instruction pointer
|
||||||
|
// nil: null register
|
||||||
|
bx_gen_reg_t gen_reg[BX_GENERAL_REGISTERS+2];
|
||||||
|
|
||||||
/* 31|30|29|28| 27|26|25|24| 23|22|21|20| 19|18|17|16
|
/* 31|30|29|28| 27|26|25|24| 23|22|21|20| 19|18|17|16
|
||||||
* ==|==|=====| ==|==|==|==| ==|==|==|==| ==|==|==|==
|
* ==|==|=====| ==|==|==|==| ==|==|==|==| ==|==|==|==
|
||||||
@ -2757,17 +2763,13 @@ public: // for now...
|
|||||||
BX_SMF void BxResolve16Rm6(bxInstruction_c *) BX_CPP_AttrRegparmN(1);
|
BX_SMF void BxResolve16Rm6(bxInstruction_c *) BX_CPP_AttrRegparmN(1);
|
||||||
BX_SMF void BxResolve16Rm7(bxInstruction_c *) BX_CPP_AttrRegparmN(1);
|
BX_SMF void BxResolve16Rm7(bxInstruction_c *) BX_CPP_AttrRegparmN(1);
|
||||||
|
|
||||||
BX_SMF void BxResolve32Disp(bxInstruction_c *) BX_CPP_AttrRegparmN(1);
|
|
||||||
BX_SMF void BxResolve32Base(bxInstruction_c *) BX_CPP_AttrRegparmN(1);
|
BX_SMF void BxResolve32Base(bxInstruction_c *) BX_CPP_AttrRegparmN(1);
|
||||||
BX_SMF void BxResolve32BaseIndex(bxInstruction_c *) BX_CPP_AttrRegparmN(1);
|
BX_SMF void BxResolve32BaseIndex(bxInstruction_c *) BX_CPP_AttrRegparmN(1);
|
||||||
BX_SMF void BxResolve32DispIndex(bxInstruction_c *) BX_CPP_AttrRegparmN(1);
|
|
||||||
|
|
||||||
#if BX_SUPPORT_X86_64
|
#if BX_SUPPORT_X86_64
|
||||||
BX_SMF void BxResolve64Disp(bxInstruction_c *) BX_CPP_AttrRegparmN(1);
|
|
||||||
BX_SMF void BxResolve64Base(bxInstruction_c *) BX_CPP_AttrRegparmN(1);
|
BX_SMF void BxResolve64Base(bxInstruction_c *) BX_CPP_AttrRegparmN(1);
|
||||||
BX_SMF void BxResolve64BaseIndex(bxInstruction_c *) BX_CPP_AttrRegparmN(1);
|
BX_SMF void BxResolve64BaseIndex(bxInstruction_c *) BX_CPP_AttrRegparmN(1);
|
||||||
BX_SMF void BxResolve64DispIndex(bxInstruction_c *) BX_CPP_AttrRegparmN(1);
|
#endif
|
||||||
#endif // #if BX_SUPPORT_X86_64
|
|
||||||
// <TAG-CLASS-CPU-END>
|
// <TAG-CLASS-CPU-END>
|
||||||
|
|
||||||
#if BX_DEBUGGER
|
#if BX_DEBUGGER
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// $Id: fetchdecode.cc,v 1.172 2008-03-22 21:29:39 sshwarts Exp $
|
// $Id: fetchdecode.cc,v 1.173 2008-03-29 09:34:33 sshwarts Exp $
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||||
@ -2598,26 +2598,25 @@ fetch_b1:
|
|||||||
|
|
||||||
i->setModRM(b2);
|
i->setModRM(b2);
|
||||||
i->metaData.metaData1 = rm;
|
i->metaData.metaData1 = rm;
|
||||||
i->setSibBase(rm); // initialize with rm to use BxResolve32Base
|
|
||||||
i->metaData.metaData5 = nnn;
|
i->metaData.metaData5 = nnn;
|
||||||
|
|
||||||
// initialize displ32 with zero to include cases with no diplacement
|
|
||||||
i->modRMForm.displ32u = 0;
|
|
||||||
|
|
||||||
if (mod == 0xc0) { // mod == 11b
|
if (mod == 0xc0) { // mod == 11b
|
||||||
i->assertModC0();
|
i->assertModC0();
|
||||||
goto modrm_done;
|
goto modrm_done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
i->setSibBase(rm); // initialize with rm to use BxResolve32Base
|
||||||
|
// initialize displ32 with zero to include cases with no diplacement
|
||||||
|
i->modRMForm.displ32u = 0;
|
||||||
|
|
||||||
if (i->as32L()) {
|
if (i->as32L()) {
|
||||||
// 32-bit addressing modes; note that mod==11b handled above
|
// 32-bit addressing modes; note that mod==11b handled above
|
||||||
if (rm != 4) { // no s-i-b byte
|
if (rm != 4) { // no s-i-b byte
|
||||||
i->ResolveModrm = &BX_CPU_C::BxResolve32Base;
|
i->ResolveModrm = &BX_CPU_C::BxResolve32Base;
|
||||||
if (mod == 0x00) { // mod == 00b
|
if (mod == 0x00) { // mod == 00b
|
||||||
if (BX_NULL_SEG_REG(i->seg()))
|
if (BX_NULL_SEG_REG(i->seg())) i->setSeg(BX_SEG_REG_DS);
|
||||||
i->setSeg(BX_SEG_REG_DS);
|
|
||||||
if (rm == 5) {
|
if (rm == 5) {
|
||||||
i->ResolveModrm = &BX_CPU_C::BxResolve32Disp;
|
i->setSibBase(BX_64BIT_REG_NIL);
|
||||||
get_32bit_displ:
|
get_32bit_displ:
|
||||||
if ((ilen+3) < remain) {
|
if ((ilen+3) < remain) {
|
||||||
i->modRMForm.displ32u = FetchDWORD(iptr);
|
i->modRMForm.displ32u = FetchDWORD(iptr);
|
||||||
@ -2668,10 +2667,7 @@ get_8bit_displ:
|
|||||||
if (BX_NULL_SEG_REG(i->seg()))
|
if (BX_NULL_SEG_REG(i->seg()))
|
||||||
i->setSeg(sreg_mod0_base32[base]);
|
i->setSeg(sreg_mod0_base32[base]);
|
||||||
if (base == 0x05) {
|
if (base == 0x05) {
|
||||||
if (index == 4)
|
i->setSibBase(BX_64BIT_REG_NIL);
|
||||||
i->ResolveModrm = &BX_CPU_C::BxResolve32Disp;
|
|
||||||
else
|
|
||||||
i->ResolveModrm = &BX_CPU_C::BxResolve32DispIndex;
|
|
||||||
goto get_32bit_displ;
|
goto get_32bit_displ;
|
||||||
}
|
}
|
||||||
// mod==00b, rm==4, base!=5
|
// mod==00b, rm==4, base!=5
|
||||||
@ -2687,8 +2683,8 @@ get_8bit_displ:
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// 16-bit addressing modes, mod==11b handled above
|
// 16-bit addressing modes, mod==11b handled above
|
||||||
if (mod == 0x00) { // mod == 00b
|
|
||||||
i->ResolveModrm = Resolve16Rm[rm];
|
i->ResolveModrm = Resolve16Rm[rm];
|
||||||
|
if (mod == 0x00) { // mod == 00b
|
||||||
if (BX_NULL_SEG_REG(i->seg()))
|
if (BX_NULL_SEG_REG(i->seg()))
|
||||||
i->setSeg(sreg_mod00_rm16[rm]);
|
i->setSeg(sreg_mod00_rm16[rm]);
|
||||||
if (rm == 0x06) {
|
if (rm == 0x06) {
|
||||||
@ -2704,7 +2700,6 @@ get_16bit_displ:
|
|||||||
}
|
}
|
||||||
goto modrm_done;
|
goto modrm_done;
|
||||||
}
|
}
|
||||||
i->ResolveModrm = Resolve16Rm[rm];
|
|
||||||
if (BX_NULL_SEG_REG(i->seg()))
|
if (BX_NULL_SEG_REG(i->seg()))
|
||||||
i->setSeg(sreg_mod01or10_rm16[rm]);
|
i->setSeg(sreg_mod01or10_rm16[rm]);
|
||||||
if (mod == 0x40) { // mod == 01b
|
if (mod == 0x40) { // mod == 01b
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// $Id: fetchdecode64.cc,v 1.179 2008-03-22 21:29:39 sshwarts Exp $
|
// $Id: fetchdecode64.cc,v 1.180 2008-03-29 09:34:34 sshwarts Exp $
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||||
@ -3534,17 +3534,17 @@ fetch_b1:
|
|||||||
|
|
||||||
i->setModRM(b2);
|
i->setModRM(b2);
|
||||||
i->metaData.metaData1 = rm;
|
i->metaData.metaData1 = rm;
|
||||||
i->setSibBase(rm); // initialize with rm to use BxResolve32Base
|
|
||||||
i->metaData.metaData5 = nnn;
|
i->metaData.metaData5 = nnn;
|
||||||
|
|
||||||
// initialize displ32 with zero to include cases with no diplacement
|
|
||||||
i->modRMForm.displ32u = 0;
|
|
||||||
|
|
||||||
if (mod == 0xc0) { // mod == 11b
|
if (mod == 0xc0) { // mod == 11b
|
||||||
i->assertModC0();
|
i->assertModC0();
|
||||||
goto modrm_done;
|
goto modrm_done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
i->setSibBase(rm); // initialize with rm to use BxResolve32Base
|
||||||
|
// initialize displ32 with zero to include cases with no diplacement
|
||||||
|
i->modRMForm.displ32u = 0;
|
||||||
|
|
||||||
if (i->as64L()) {
|
if (i->as64L()) {
|
||||||
// 64-bit addressing modes; note that mod==11b handled above
|
// 64-bit addressing modes; note that mod==11b handled above
|
||||||
if ((rm & 0x7) != 4) { // no s-i-b byte
|
if ((rm & 0x7) != 4) { // no s-i-b byte
|
||||||
@ -3604,10 +3604,7 @@ get_8bit_displ:
|
|||||||
if (BX_NULL_SEG_REG(i->seg()))
|
if (BX_NULL_SEG_REG(i->seg()))
|
||||||
i->setSeg(sreg_mod0_base32[base]);
|
i->setSeg(sreg_mod0_base32[base]);
|
||||||
if ((base & 0x7) == 5) {
|
if ((base & 0x7) == 5) {
|
||||||
if (index == 4)
|
i->setSibBase(BX_64BIT_REG_NIL);
|
||||||
i->ResolveModrm = &BX_CPU_C::BxResolve64Disp;
|
|
||||||
else
|
|
||||||
i->ResolveModrm = &BX_CPU_C::BxResolve64DispIndex;
|
|
||||||
goto get_32bit_displ;
|
goto get_32bit_displ;
|
||||||
}
|
}
|
||||||
// mod==00b, rm==4, base!=5
|
// mod==00b, rm==4, base!=5
|
||||||
@ -3665,10 +3662,7 @@ get_8bit_displ:
|
|||||||
if (BX_NULL_SEG_REG(i->seg()))
|
if (BX_NULL_SEG_REG(i->seg()))
|
||||||
i->setSeg(sreg_mod0_base32[base]);
|
i->setSeg(sreg_mod0_base32[base]);
|
||||||
if ((base & 0x7) == 5) {
|
if ((base & 0x7) == 5) {
|
||||||
if (index == 4)
|
i->setSibBase(BX_32BIT_REG_NIL);
|
||||||
i->ResolveModrm = &BX_CPU_C::BxResolve32Disp;
|
|
||||||
else
|
|
||||||
i->ResolveModrm = &BX_CPU_C::BxResolve32DispIndex;
|
|
||||||
goto get_32bit_displ;
|
goto get_32bit_displ;
|
||||||
}
|
}
|
||||||
// mod==00b, rm==4, base!=5
|
// mod==00b, rm==4, base!=5
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// $Id: init.cc,v 1.156 2008-03-24 22:13:04 sshwarts Exp $
|
// $Id: init.cc,v 1.157 2008-03-29 09:34:35 sshwarts Exp $
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||||
@ -713,6 +713,9 @@ void BX_CPU_C::reset(unsigned source)
|
|||||||
ESP = 0;
|
ESP = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// initialize NIL register
|
||||||
|
BX_WRITE_32BIT_REGZ(BX_32BIT_REG_NIL, 0);
|
||||||
|
|
||||||
// status and control flags register set
|
// status and control flags register set
|
||||||
BX_CPU_THIS_PTR setEFlags(0x2); // Bit1 is always set
|
BX_CPU_THIS_PTR setEFlags(0x2); // Bit1 is always set
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// $Id: resolve32.cc,v 1.16 2008-01-29 17:13:09 sshwarts Exp $
|
// $Id: resolve32.cc,v 1.17 2008-03-29 09:34:35 sshwarts Exp $
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||||
@ -30,24 +30,12 @@
|
|||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#define LOG_THIS BX_CPU_THIS_PTR
|
#define LOG_THIS BX_CPU_THIS_PTR
|
||||||
|
|
||||||
void BX_CPP_AttrRegparmN(1)
|
|
||||||
BX_CPU_C::BxResolve32Disp(bxInstruction_c *i)
|
|
||||||
{
|
|
||||||
RMAddr(i) = i->displ32u();
|
|
||||||
}
|
|
||||||
|
|
||||||
void BX_CPP_AttrRegparmN(1)
|
void BX_CPP_AttrRegparmN(1)
|
||||||
BX_CPU_C::BxResolve32Base(bxInstruction_c *i)
|
BX_CPU_C::BxResolve32Base(bxInstruction_c *i)
|
||||||
{
|
{
|
||||||
RMAddr(i) = BX_READ_32BIT_REG(i->sibBase()) + i->displ32u();
|
RMAddr(i) = BX_READ_32BIT_REG(i->sibBase()) + i->displ32u();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BX_CPP_AttrRegparmN(1)
|
|
||||||
BX_CPU_C::BxResolve32DispIndex(bxInstruction_c *i)
|
|
||||||
{
|
|
||||||
RMAddr(i) = i->displ32u() + (BX_READ_32BIT_REG(i->sibIndex()) << i->sibScale());
|
|
||||||
}
|
|
||||||
|
|
||||||
void BX_CPP_AttrRegparmN(1)
|
void BX_CPP_AttrRegparmN(1)
|
||||||
BX_CPU_C::BxResolve32BaseIndex(bxInstruction_c *i)
|
BX_CPU_C::BxResolve32BaseIndex(bxInstruction_c *i)
|
||||||
{
|
{
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// $Id: resolve64.cc,v 1.18 2008-02-15 19:03:54 sshwarts Exp $
|
// $Id: resolve64.cc,v 1.19 2008-03-29 09:34:35 sshwarts Exp $
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||||
@ -32,18 +32,6 @@
|
|||||||
|
|
||||||
#if BX_SUPPORT_X86_64
|
#if BX_SUPPORT_X86_64
|
||||||
|
|
||||||
void BX_CPP_AttrRegparmN(1)
|
|
||||||
BX_CPU_C::BxResolve64DispIndex(bxInstruction_c *i)
|
|
||||||
{
|
|
||||||
RMAddr(i) = (BX_READ_64BIT_REG(i->sibIndex()) << i->sibScale()) + (Bit32s) i->displ32u();
|
|
||||||
}
|
|
||||||
|
|
||||||
void BX_CPP_AttrRegparmN(1)
|
|
||||||
BX_CPU_C::BxResolve64Disp(bxInstruction_c *i)
|
|
||||||
{
|
|
||||||
RMAddr(i) = (Bit32s) i->displ32u();
|
|
||||||
}
|
|
||||||
|
|
||||||
void BX_CPP_AttrRegparmN(1)
|
void BX_CPP_AttrRegparmN(1)
|
||||||
BX_CPU_C::BxResolve64Base(bxInstruction_c *i)
|
BX_CPU_C::BxResolve64Base(bxInstruction_c *i)
|
||||||
{
|
{
|
||||||
@ -56,4 +44,4 @@ BX_CPU_C::BxResolve64BaseIndex(bxInstruction_c *i)
|
|||||||
RMAddr(i) = BX_READ_64BIT_REG(i->sibBase()) + (BX_READ_64BIT_REG(i->sibIndex()) << i->sibScale()) + (Bit32s) i->displ32u();
|
RMAddr(i) = BX_READ_64BIT_REG(i->sibBase()) + (BX_READ_64BIT_REG(i->sibIndex()) << i->sibScale()) + (Bit32s) i->displ32u();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* if BX_SUPPORT_X86_64 */
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user