make function to calculate allowed bits in cr4
This commit is contained in:
parent
836e9649d8
commit
6451356d2b
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: crregs.h,v 1.14 2009-01-02 13:23:06 sshwarts Exp $
|
||||
// $Id: crregs.h,v 1.15 2009-01-10 10:37:23 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2007 Stanislav Shwartsman
|
||||
@ -100,10 +100,12 @@ struct bx_cr4_t {
|
||||
};
|
||||
#endif // #if BX_CPU_LEVEL >= 4
|
||||
|
||||
extern bx_address get_cr4_allow_mask(void);
|
||||
|
||||
#if BX_SUPPORT_VME
|
||||
#define CR4_VME_ENABLED (BX_CPU_THIS_PTR cr4.get_VME())
|
||||
#define BX_CR4_VME_ENABLED (BX_CPU_THIS_PTR cr4.get_VME())
|
||||
#else
|
||||
#define CR4_VME_ENABLED (0)
|
||||
#define BX_CR4_VME_ENABLED (0)
|
||||
#endif
|
||||
|
||||
#if BX_SUPPORT_X86_64
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: flag_ctrl.cc,v 1.40 2008-07-13 14:01:09 sshwarts Exp $
|
||||
// $Id: flag_ctrl.cc,v 1.41 2009-01-10 10:37:23 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2002 MandrakeSoft S.A.
|
||||
@ -86,7 +86,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::CLI(bxInstruction_c *i)
|
||||
{
|
||||
if (IOPL != 3) {
|
||||
#if BX_SUPPORT_VME
|
||||
if (CR4_VME_ENABLED) {
|
||||
if (BX_CR4_VME_ENABLED) {
|
||||
BX_CPU_THIS_PTR clear_VIF();
|
||||
return;
|
||||
}
|
||||
@ -129,7 +129,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::STI(bxInstruction_c *i)
|
||||
{
|
||||
if (IOPL != 3) {
|
||||
#if BX_SUPPORT_VME
|
||||
if (CR4_VME_ENABLED && BX_CPU_THIS_PTR get_VIP() == 0)
|
||||
if (BX_CR4_VME_ENABLED && BX_CPU_THIS_PTR get_VIP() == 0)
|
||||
{
|
||||
BX_CPU_THIS_PTR assert_VIF();
|
||||
return;
|
||||
@ -167,12 +167,12 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::PUSHF_Fw(bxInstruction_c *i)
|
||||
Bit16u flags = (Bit16u) read_eflags();
|
||||
|
||||
if (v8086_mode()) {
|
||||
if ((BX_CPU_THIS_PTR get_IOPL() < 3) && (CR4_VME_ENABLED == 0)) {
|
||||
if ((BX_CPU_THIS_PTR get_IOPL() < 3) && (BX_CR4_VME_ENABLED == 0)) {
|
||||
BX_DEBUG(("PUSHFW: #GP(0) in v8086 (no VME) mode"));
|
||||
exception(BX_GP_EXCEPTION, 0, 0);
|
||||
}
|
||||
#if BX_SUPPORT_VME
|
||||
if (CR4_VME_ENABLED && BX_CPU_THIS_PTR get_IOPL() < 3) {
|
||||
if (BX_CR4_VME_ENABLED && BX_CPU_THIS_PTR get_IOPL() < 3) {
|
||||
flags |= EFlagsIOPLMask;
|
||||
if (BX_CPU_THIS_PTR get_VIF())
|
||||
flags |= EFlagsIFMask;
|
||||
@ -203,7 +203,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::POPF_Fw(bxInstruction_c *i)
|
||||
changeMask |= EFlagsIFMask;
|
||||
}
|
||||
else if (v8086_mode()) {
|
||||
if ((BX_CPU_THIS_PTR get_IOPL() < 3) && (CR4_VME_ENABLED == 0)) {
|
||||
if ((BX_CPU_THIS_PTR get_IOPL() < 3) && (BX_CR4_VME_ENABLED == 0)) {
|
||||
BX_DEBUG(("POPFW: #GP(0) in v8086 (no VME) mode"));
|
||||
exception(BX_GP_EXCEPTION, 0, 0);
|
||||
}
|
||||
@ -212,7 +212,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::POPF_Fw(bxInstruction_c *i)
|
||||
|
||||
flags16 = pop_16();
|
||||
#if BX_SUPPORT_VME
|
||||
if (CR4_VME_ENABLED && BX_CPU_THIS_PTR get_IOPL() < 3) {
|
||||
if (BX_CR4_VME_ENABLED && BX_CPU_THIS_PTR get_IOPL() < 3) {
|
||||
if (((flags16 & EFlagsIFMask) && BX_CPU_THIS_PTR get_VIP()) ||
|
||||
(flags16 & EFlagsTFMask))
|
||||
{
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: proc_ctrl.cc,v 1.269 2009-01-10 10:07:57 sshwarts Exp $
|
||||
// $Id: proc_ctrl.cc,v 1.270 2009-01-10 10:37:23 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||
@ -1247,9 +1247,8 @@ bx_bool BX_CPP_AttrRegparmN(1) BX_CPU_C::SetCR0(Bit32u val_32)
|
||||
}
|
||||
|
||||
#if BX_CPU_LEVEL >= 4
|
||||
bx_bool BX_CPP_AttrRegparmN(1) BX_CPU_C::SetCR4(bx_address val)
|
||||
bx_address get_cr4_allow_mask(void)
|
||||
{
|
||||
Bit32u oldCR4 = BX_CPU_THIS_PTR cr4.get32();
|
||||
bx_address allowMask = 0;
|
||||
|
||||
// CR4 bits definitions:
|
||||
@ -1311,6 +1310,14 @@ bx_bool BX_CPP_AttrRegparmN(1) BX_CPU_C::SetCR4(bx_address val)
|
||||
allowMask |= (1<<18); /* OSXSAVE */
|
||||
#endif
|
||||
|
||||
return allowMask;
|
||||
}
|
||||
|
||||
bx_bool BX_CPP_AttrRegparmN(1) BX_CPU_C::SetCR4(bx_address val)
|
||||
{
|
||||
Bit32u oldCR4 = BX_CPU_THIS_PTR cr4.get32();
|
||||
bx_address allowMask = get_cr4_allow_mask();
|
||||
|
||||
#if BX_SUPPORT_X86_64
|
||||
// need to GP(0) if LMA=1 and PAE=1->0
|
||||
if (BX_CPU_THIS_PTR efer.get_LMA()) {
|
||||
@ -1336,7 +1343,7 @@ bx_bool BX_CPP_AttrRegparmN(1) BX_CPU_C::SetCR4(bx_address val)
|
||||
void BX_CPP_AttrRegparmN(1) BX_CPU_C::RDPMC(bxInstruction_c *i)
|
||||
{
|
||||
/* We need to be Pentium with MMX or later */
|
||||
#if ((BX_CPU_LEVEL >= 6) || (BX_SUPPORT_MMX && BX_CPU_LEVEL == 5))
|
||||
#if (BX_CPU_LEVEL >= 6) || (BX_SUPPORT_MMX && BX_CPU_LEVEL == 5)
|
||||
bx_bool pce = BX_CPU_THIS_PTR cr4.get_PCE();
|
||||
|
||||
if ((pce==1) || (CPL==0) || real_mode())
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: vm8086.cc,v 1.49 2008-09-08 15:45:57 sshwarts Exp $
|
||||
// $Id: vm8086.cc,v 1.50 2009-01-10 10:37:23 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||
@ -100,7 +100,7 @@ void BX_CPU_C::stack_return_to_v86(Bit32u new_eip, Bit32u raw_cs_selector, Bit32
|
||||
|
||||
void BX_CPU_C::iret16_stack_return_from_v86(bxInstruction_c *i)
|
||||
{
|
||||
if ((BX_CPU_THIS_PTR get_IOPL() < 3) && (CR4_VME_ENABLED == 0)) {
|
||||
if ((BX_CPU_THIS_PTR get_IOPL() < 3) && (BX_CR4_VME_ENABLED == 0)) {
|
||||
// trap to virtual 8086 monitor
|
||||
BX_DEBUG(("IRET in vm86 with IOPL != 3, VME = 0"));
|
||||
exception(BX_GP_EXCEPTION, 0, 0);
|
||||
@ -113,7 +113,7 @@ void BX_CPU_C::iret16_stack_return_from_v86(bxInstruction_c *i)
|
||||
flags16 = pop_16();
|
||||
|
||||
#if BX_SUPPORT_VME
|
||||
if (CR4_VME_ENABLED && BX_CPU_THIS_PTR get_IOPL() < 3)
|
||||
if (BX_CR4_VME_ENABLED && BX_CPU_THIS_PTR get_IOPL() < 3)
|
||||
{
|
||||
if (((flags16 & EFlagsIFMask) && BX_CPU_THIS_PTR get_VIP()) ||
|
||||
(flags16 & EFlagsTFMask))
|
||||
|
Loading…
Reference in New Issue
Block a user