From 6451356d2bcb68e03eee42c4912821855d62dc87 Mon Sep 17 00:00:00 2001 From: Stanislav Shwartsman Date: Sat, 10 Jan 2009 10:37:23 +0000 Subject: [PATCH] make function to calculate allowed bits in cr4 --- bochs/cpu/crregs.h | 8 +++++--- bochs/cpu/flag_ctrl.cc | 14 +++++++------- bochs/cpu/proc_ctrl.cc | 15 +++++++++++---- bochs/cpu/vm8086.cc | 6 +++--- 4 files changed, 26 insertions(+), 17 deletions(-) diff --git a/bochs/cpu/crregs.h b/bochs/cpu/crregs.h index a3bc6390b..1eb76a98a 100755 --- a/bochs/cpu/crregs.h +++ b/bochs/cpu/crregs.h @@ -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 diff --git a/bochs/cpu/flag_ctrl.cc b/bochs/cpu/flag_ctrl.cc index f73d45146..97c8521f7 100644 --- a/bochs/cpu/flag_ctrl.cc +++ b/bochs/cpu/flag_ctrl.cc @@ -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)) { diff --git a/bochs/cpu/proc_ctrl.cc b/bochs/cpu/proc_ctrl.cc index 9567b0386..f7a910edd 100644 --- a/bochs/cpu/proc_ctrl.cc +++ b/bochs/cpu/proc_ctrl.cc @@ -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()) diff --git a/bochs/cpu/vm8086.cc b/bochs/cpu/vm8086.cc index 6f75a2bb7..39d2df7e2 100644 --- a/bochs/cpu/vm8086.cc +++ b/bochs/cpu/vm8086.cc @@ -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))