Changeset 60664 in vbox
- Timestamp:
- Apr 22, 2016 11:35:07 PM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 106832
- Location:
- trunk/src/VBox
- Files:
-
- 5 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp
r60509 r60664 989 989 * dead wrong on 8086 (see http://www.os2museum.com/wp/undocumented-8086-opcodes/). 990 990 */ 991 if ( bstr.equals("Intel 80286") 991 if ( bstr.equals("Intel 80386") /* just for now */ 992 || bstr.equals("Intel 80286") 992 993 || bstr.equals("Intel 80186") 993 994 || bstr.equals("Nec V20") -
trunk/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp
r60377 r60664 715 715 PGMCr0WpEnabled(pVCpu); 716 716 717 pVCpu->cpum.s.Guest.cr0 = cr0 | X86_CR0_ET; 717 /* The ET flag is settable on a 386 and hardwired on 486+. */ 718 if ( !(cr0 & X86_CR0_ET) 719 && pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.enmMicroarch != kCpumMicroarch_Intel_80386) 720 cr0 |= X86_CR0_ET; 721 722 pVCpu->cpum.s.Guest.cr0 = cr0; 718 723 return VINF_SUCCESS; 719 724 } -
trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h
r60415 r60664 625 625 } 626 626 627 fEflNew &= X86_EFL_POPF_BITS & ~(X86_EFL_IOPL); 628 fEflNew |= ~(X86_EFL_POPF_BITS & ~(X86_EFL_IOPL)) & fEflOld; 627 const uint32_t fPopfBits = IEMCPU_TO_VM(pIemCpu)->cpum.ro.GuestFeatures.enmMicroarch != kCpumMicroarch_Intel_80386 628 ? X86_EFL_POPF_BITS : X86_EFL_POPF_BITS_386; 629 fEflNew &= fPopfBits & ~(X86_EFL_IOPL); 630 fEflNew |= ~(fPopfBits & ~(X86_EFL_IOPL)) & fEflOld; 629 631 } 630 632 /* … … 711 713 712 714 /* Merge them with the current flags. */ 715 const uint32_t fPopfBits = IEMCPU_TO_VM(pIemCpu)->cpum.ro.GuestFeatures.enmMicroarch != kCpumMicroarch_Intel_80386 716 ? X86_EFL_POPF_BITS : X86_EFL_POPF_BITS_386; 713 717 if ( (fEflNew & (X86_EFL_IOPL | X86_EFL_IF)) == (fEflOld & (X86_EFL_IOPL | X86_EFL_IF)) 714 718 || pIemCpu->uCpl == 0) 715 719 { 716 fEflNew &= X86_EFL_POPF_BITS;717 fEflNew |= ~ X86_EFL_POPF_BITS& fEflOld;720 fEflNew &= fPopfBits; 721 fEflNew |= ~fPopfBits & fEflOld; 718 722 } 719 723 else if (pIemCpu->uCpl <= X86_EFL_GET_IOPL(fEflOld)) 720 724 { 721 fEflNew &= X86_EFL_POPF_BITS& ~(X86_EFL_IOPL);722 fEflNew |= ~( X86_EFL_POPF_BITS& ~(X86_EFL_IOPL)) & fEflOld;725 fEflNew &= fPopfBits & ~(X86_EFL_IOPL); 726 fEflNew |= ~(fPopfBits & ~(X86_EFL_IOPL)) & fEflOld; 723 727 } 724 728 else 725 729 { 726 fEflNew &= X86_EFL_POPF_BITS& ~(X86_EFL_IOPL | X86_EFL_IF);727 fEflNew |= ~( X86_EFL_POPF_BITS& ~(X86_EFL_IOPL | X86_EFL_IF)) & fEflOld;730 fEflNew &= fPopfBits & ~(X86_EFL_IOPL | X86_EFL_IF); 731 fEflNew |= ~(fPopfBits & ~(X86_EFL_IOPL | X86_EFL_IF)) & fEflOld; 728 732 } 729 733 } … … 2772 2776 | X86_EFL_RF /*| X86_EFL_VM*/ | X86_EFL_AC /*|X86_EFL_VIF*/ /*|X86_EFL_VIP*/ 2773 2777 | X86_EFL_ID; 2778 #if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC 2779 if (pIemCpu->uTargetCpu <= IEMTARGETCPU_386) 2780 uNewFlags &= ~(X86_EFL_AC | X86_EFL_ID | X86_EFL_VIF | X86_EFL_VIP); 2781 #endif 2774 2782 uNewFlags |= Efl.u & (X86_EFL_VM | X86_EFL_VIF | X86_EFL_VIP | X86_EFL_1); 2775 2783 } … … 3255 3263 else if (pIemCpu->uCpl <= pCtx->eflags.Bits.u2IOPL) 3256 3264 fEFlagsMask |= X86_EFL_IF; 3265 #if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC 3266 if (pIemCpu->uTargetCpu <= IEMTARGETCPU_386) 3267 fEFlagsMask &= ~(X86_EFL_AC | X86_EFL_ID | X86_EFL_VIF | X86_EFL_VIP); 3268 #endif 3257 3269 uint32_t fEFlagsNew = IEMMISC_GET_EFL(pIemCpu, pCtx); 3258 3270 fEFlagsNew &= ~fEFlagsMask; … … 3327 3339 else if (pIemCpu->uCpl <= NewEfl.Bits.u2IOPL) 3328 3340 fEFlagsMask |= X86_EFL_IF; 3341 #if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC 3342 if (pIemCpu->uTargetCpu <= IEMTARGETCPU_386) 3343 fEFlagsMask &= ~(X86_EFL_AC | X86_EFL_ID | X86_EFL_VIF | X86_EFL_VIP); 3344 #endif 3329 3345 NewEfl.u &= ~fEFlagsMask; 3330 3346 NewEfl.u |= fEFlagsMask & uNewFlags; … … 4790 4806 switch (iCrReg) 4791 4807 { 4792 case 0: crX = pCtx->cr0; break; 4808 case 0: 4809 crX = pCtx->cr0; 4810 #if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC 4811 if (pIemCpu->uTargetCpu <= IEMTARGETCPU_386) 4812 crX |= UINT32_C(0x7fffffe0); /* All reserved CR0 flags are set on a 386, just like MSW on 286. */ 4813 #endif 4814 break; 4793 4815 case 2: crX = pCtx->cr2; break; 4794 4816 case 3: crX = pCtx->cr3; break; … … 4843 4865 */ 4844 4866 uint64_t const uOldCrX = pCtx->cr0; 4845 uNewCrX |= X86_CR0_ET; /* hardcoded */ 4867 4868 /* ET is hardcoded on 486 and later. */ 4869 #if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC 4870 if (pIemCpu->uTargetCpu >= IEMTARGETCPU_486) 4871 #endif 4872 uNewCrX |= X86_CR0_ET; /* hardcoded on 486+ */ 4873 #if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC 4874 /* The 386 didn't #GP(0) on attempting to set reserved CR0 bits. ET was settable. */ 4875 else 4876 uNewCrX &= X86_CR0_PE | X86_CR0_MP | X86_CR0_EM | X86_CR0_TS | X86_CR0_PG | X86_CR0_ET; 4877 #endif 4846 4878 4847 4879 /* Check for reserved bits. */ -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h
r60659 r60664 977 977 IEM_MC_FETCH_CR0_U16(u16Tmp); 978 978 #if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC 979 if (pIemCpu->uTargetCpu == IEMTARGETCPU_286) 980 IEM_MC_OR_LOCAL_U16(u16Tmp, 0xfff0); /* Reserved bits observed all set on real hw. */ 979 if (pIemCpu->uTargetCpu > IEMTARGETCPU_386) 980 { /* likely */ } 981 else if (pIemCpu->uTargetCpu >= IEMTARGETCPU_386) 982 IEM_MC_OR_LOCAL_U16(u16Tmp, 0xffe0); 983 else 984 IEM_MC_OR_LOCAL_U16(u16Tmp, 0xfff0); 981 985 #endif 982 986 IEM_MC_STORE_GREG_U16((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u16Tmp); … … 1015 1019 IEM_MC_FETCH_CR0_U16(u16Tmp); 1016 1020 #if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC 1017 if (pIemCpu->uTargetCpu == IEMTARGETCPU_286) 1018 IEM_MC_OR_LOCAL_U16(u16Tmp, 0xfff0); /* Reserved bits observed all set on real hw. */ 1021 if (pIemCpu->uTargetCpu > IEMTARGETCPU_386) 1022 { /* likely */ } 1023 else if (pIemCpu->uTargetCpu >= IEMTARGETCPU_386) 1024 IEM_MC_OR_LOCAL_U16(u16Tmp, 0xffe0); 1025 else 1026 IEM_MC_OR_LOCAL_U16(u16Tmp, 0xfff0); 1019 1027 #endif 1020 1028 IEM_MC_STORE_MEM_U16(pIemCpu->iEffSeg, GCPtrEffDst, u16Tmp); -
trunk/src/VBox/VMM/VMMR3/CPUMR3Db.cpp
r60411 r60664 193 193 #include "cpus/Intel_Pentium_4_3_00GHz.h" 194 194 #include "cpus/Intel_Atom_330_1_60GHz.h" 195 #include "cpus/Intel_80386.h" 195 196 #include "cpus/Intel_80286.h" 196 197 #include "cpus/Intel_80186.h" -
trunk/src/VBox/VMM/VMMR3/cpus/Intel_80386.h
r60585 r60664 1 1 /* $Id$ */ 2 2 /** @file 3 * CPU database entry "Intel 80 286".3 * CPU database entry "Intel 80386". 4 4 * Handcrafted. 5 5 */ … … 17 17 */ 18 18 19 #ifndef VBOX_CPUDB_Intel_80 28620 #define VBOX_CPUDB_Intel_80 28619 #ifndef VBOX_CPUDB_Intel_80386 20 #define VBOX_CPUDB_Intel_80386 21 21 22 22 #ifndef CPUM_DB_STANDALONE 23 23 /** 24 * Fake CPUID leaves for Intel(R) 80 286.24 * Fake CPUID leaves for Intel(R) 80386. 25 25 * 26 26 * We fake these to keep the CPUM ignorant of CPUs wihtout CPUID leaves … … 28 28 * CPUMDBENTRY. 29 29 */ 30 static CPUMCPUIDLEAF const g_aCpuIdLeaves_Intel_80 286[] =30 static CPUMCPUIDLEAF const g_aCpuIdLeaves_Intel_80386[] = 31 31 { 32 32 { 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x756e6547, 0x6c65746e, 0x49656e69, 0 }, 33 { 0x00000001, 0x00000000, 0x00000000, 0x00000 200, 0x00000100, 0x00000000, 0x00000000, 0 },33 { 0x00000001, 0x00000000, 0x00000000, 0x00000300, 0x00000100, 0x00000000, 0x00000000, 0 }, 34 34 { 0x80000000, 0x00000000, 0x00000000, 0x80000008, 0x00000000, 0x00000000, 0x00000000, 0 }, 35 35 { 0x80000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0 }, 36 { 0x80000002, 0x00000000, 0x00000000, 0x65746e49, 0x2952286c, 0x3 2303820, 0x20203638, 0 },36 { 0x80000002, 0x00000000, 0x00000000, 0x65746e49, 0x2952286c, 0x33303820, 0x20203638, 0 }, 37 37 { 0x80000003, 0x00000000, 0x00000000, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0 }, 38 38 { 0x80000004, 0x00000000, 0x00000000, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0 }, … … 45 45 46 46 /** 47 * Database entry for Intel(R) 80 286.47 * Database entry for Intel(R) 80386. 48 48 */ 49 static CPUMDBENTRY const g_Entry_Intel_80 286 =49 static CPUMDBENTRY const g_Entry_Intel_80386 = 50 50 { 51 /*.pszName = */ "Intel 80 286",52 /*.pszFullName = */ "Intel(R) 80 286",51 /*.pszName = */ "Intel 80386", 52 /*.pszFullName = */ "Intel(R) 80386", 53 53 /*.enmVendor = */ CPUMCPUVENDOR_INTEL, 54 /*.uFamily = */ 2,54 /*.uFamily = */ 3, 55 55 /*.uModel = */ 0, 56 56 /*.uStepping = */ 0, 57 /*.enmMicroarch = */ kCpumMicroarch_Intel_80 286,57 /*.enmMicroarch = */ kCpumMicroarch_Intel_80386, 58 58 /*.uScalableBusFreq = */ CPUM_SBUSFREQ_UNKNOWN, 59 59 /*.fFlags = */ CPUDB_F_EXECUTE_ALL_IN_IEM, 60 60 /*.cMaxPhysAddrWidth= */ 24, 61 /*.paCpuIdLeaves = */ NULL_ALONE(g_aCpuIdLeaves_Intel_80 286),62 /*.cCpuIdLeaves = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_80 286)),61 /*.paCpuIdLeaves = */ NULL_ALONE(g_aCpuIdLeaves_Intel_80386), 62 /*.cCpuIdLeaves = */ ZERO_ALONE(RT_ELEMENTS(g_aCpuIdLeaves_Intel_80386)), 63 63 /*.enmUnknownCpuId = */ CPUMUNKNOWNCPUID_DEFAULTS, 64 64 /*.DefUnknownCpuId = */ { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, … … 68 68 }; 69 69 70 #endif /* !VBOX_CPUDB_Intel_80 286 */70 #endif /* !VBOX_CPUDB_Intel_80386 */ 71 71
Note:
See TracChangeset
for help on using the changeset viewer.