Changeset 1078 in vbox
- Timestamp:
- Feb 28, 2007 8:24:49 AM (18 years ago)
- Location:
- trunk/src/recompiler
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/recompiler/VBoxRecompiler.c
r1057 r1078 55 55 #include <iprt/string.h> 56 56 57 ////#define VBOX_RAW_V8658 57 59 58 /* Don't wanna include everything. */ … … 1755 1754 { 1756 1755 Log2(("REMR3State: SS changed from %04x to %04x!\n", pVM->rem.s.Env.segs[R_SS].selector, pCtx->ss)); 1757 if (pCtx->eflags.Bits.u1VM == 1) 1756 1757 cpu_x86_set_cpl(&pVM->rem.s.Env, (pCtx->eflags.Bits.u1VM) ? 3 : (pCtx->ss & 3)); 1758 sync_seg(&pVM->rem.s.Env, R_SS, pCtx->ss); 1759 #ifdef VBOX_WITH_STATISTICS 1760 if (pVM->rem.s.Env.segs[R_SS].newselector) 1758 1761 { 1759 cpu_x86_set_cpl(&pVM->rem.s.Env, 3); 1760 pVM->rem.s.Env.segs[R_SS].selector = (uint16_t)pCtx->ss; 1762 STAM_COUNTER_INC(&gStatSelOutOfSync[R_SS]); 1761 1763 } 1762 else1763 {1764 cpu_x86_set_cpl(&pVM->rem.s.Env, pCtx->ss & 3);1765 sync_seg(&pVM->rem.s.Env, R_SS, pCtx->ss);1766 #ifdef VBOX_WITH_STATISTICS1767 if (pVM->rem.s.Env.segs[R_SS].newselector)1768 {1769 STAM_COUNTER_INC(&gStatSelOutOfSync[R_SS]);1770 }1771 1764 #endif 1772 }1773 1765 } 1774 1766 else … … 1778 1770 { 1779 1771 Log2(("REMR3State: ES changed from %04x to %04x!\n", pVM->rem.s.Env.segs[R_ES].selector, pCtx->es)); 1780 if (pCtx->eflags.Bits.u1VM == 1) 1772 sync_seg(&pVM->rem.s.Env, R_ES, pCtx->es); 1773 #ifdef VBOX_WITH_STATISTICS 1774 if (pVM->rem.s.Env.segs[R_ES].newselector) 1781 1775 { 1782 pVM->rem.s.Env.segs[R_ES].selector = (uint16_t)pCtx->es;1776 STAM_COUNTER_INC(&gStatSelOutOfSync[R_ES]); 1783 1777 } 1784 else1785 {1786 sync_seg(&pVM->rem.s.Env, R_ES, pCtx->es);1787 #ifdef VBOX_WITH_STATISTICS1788 if (pVM->rem.s.Env.segs[R_ES].newselector)1789 {1790 STAM_COUNTER_INC(&gStatSelOutOfSync[R_ES]);1791 }1792 1778 #endif 1793 }1794 1779 } 1795 1780 else … … 1799 1784 { 1800 1785 Log2(("REMR3State: CS changed from %04x to %04x!\n", pVM->rem.s.Env.segs[R_CS].selector, pCtx->cs)); 1801 if (pCtx->eflags.Bits.u1VM == 1) 1786 sync_seg(&pVM->rem.s.Env, R_CS, pCtx->cs); 1787 #ifdef VBOX_WITH_STATISTICS 1788 if (pVM->rem.s.Env.segs[R_CS].newselector) 1802 1789 { 1803 pVM->rem.s.Env.segs[R_CS].selector = (uint16_t)pCtx->cs;1790 STAM_COUNTER_INC(&gStatSelOutOfSync[R_CS]); 1804 1791 } 1805 else1806 {1807 sync_seg(&pVM->rem.s.Env, R_CS, pCtx->cs);1808 #ifdef VBOX_WITH_STATISTICS1809 if (pVM->rem.s.Env.segs[R_CS].newselector)1810 {1811 STAM_COUNTER_INC(&gStatSelOutOfSync[R_CS]);1812 }1813 1792 #endif 1814 }1815 1793 } 1816 1794 else … … 1820 1798 { 1821 1799 Log2(("REMR3State: DS changed from %04x to %04x!\n", pVM->rem.s.Env.segs[R_DS].selector, pCtx->ds)); 1822 if (pCtx->eflags.Bits.u1VM == 1) 1800 sync_seg(&pVM->rem.s.Env, R_DS, pCtx->ds); 1801 #ifdef VBOX_WITH_STATISTICS 1802 if (pVM->rem.s.Env.segs[R_DS].newselector) 1823 1803 { 1824 pVM->rem.s.Env.segs[R_DS].selector = (uint16_t)pCtx->ds;1804 STAM_COUNTER_INC(&gStatSelOutOfSync[R_DS]); 1825 1805 } 1826 else1827 {1828 sync_seg(&pVM->rem.s.Env, R_DS, pCtx->ds);1829 #ifdef VBOX_WITH_STATISTICS1830 if (pVM->rem.s.Env.segs[R_DS].newselector)1831 {1832 STAM_COUNTER_INC(&gStatSelOutOfSync[R_DS]);1833 }1834 1806 #endif 1835 }1836 1807 } 1837 1808 else … … 1843 1814 { 1844 1815 Log2(("REMR3State: FS changed from %04x to %04x!\n", pVM->rem.s.Env.segs[R_FS].selector, pCtx->fs)); 1845 if (pCtx->eflags.Bits.u1VM == 1) 1816 sync_seg(&pVM->rem.s.Env, R_FS, pCtx->fs); 1817 #ifdef VBOX_WITH_STATISTICS 1818 if (pVM->rem.s.Env.segs[R_FS].newselector) 1846 1819 { 1847 pVM->rem.s.Env.segs[R_FS].selector = (uint16_t)pCtx->fs;1820 STAM_COUNTER_INC(&gStatSelOutOfSync[R_FS]); 1848 1821 } 1849 else1850 {1851 sync_seg(&pVM->rem.s.Env, R_FS, pCtx->fs);1852 #ifdef VBOX_WITH_STATISTICS1853 if (pVM->rem.s.Env.segs[R_FS].newselector)1854 {1855 STAM_COUNTER_INC(&gStatSelOutOfSync[R_FS]);1856 }1857 1822 #endif 1858 }1859 1823 } 1860 1824 else … … 1864 1828 { 1865 1829 Log2(("REMR3State: GS changed from %04x to %04x!\n", pVM->rem.s.Env.segs[R_GS].selector, pCtx->gs)); 1866 if (pCtx->eflags.Bits.u1VM == 1) 1830 sync_seg(&pVM->rem.s.Env, R_GS, pCtx->gs); 1831 #ifdef VBOX_WITH_STATISTICS 1832 if (pVM->rem.s.Env.segs[R_GS].newselector) 1867 1833 { 1868 pVM->rem.s.Env.segs[R_GS].selector = (uint16_t)pCtx->gs;1834 STAM_COUNTER_INC(&gStatSelOutOfSync[R_GS]); 1869 1835 } 1870 else1871 {1872 sync_seg(&pVM->rem.s.Env, R_GS, pCtx->gs);1873 #ifdef VBOX_WITH_STATISTICS1874 if (pVM->rem.s.Env.segs[R_GS].newselector)1875 {1876 STAM_COUNTER_INC(&gStatSelOutOfSync[R_GS]);1877 }1878 1836 #endif 1879 }1880 1837 } 1881 1838 else -
trunk/src/recompiler/target-i386/helper.c
r1 r1078 3730 3730 CPUX86State *savedenv = env; 3731 3731 env = env1; 3732 #ifdef VBOX 3733 if ( setjmp(env1->jmp_env) == 0)3732 3733 if (env->eflags & X86_EFL_VM) 3734 3734 { 3735 #endif 3736 if (seg_reg == R_CS) 3737 { 3738 uint32_t e1, e2; 3739 load_segment(&e1, &e2, selector); 3740 cpu_x86_load_seg_cache(env, R_CS, selector, 3741 get_seg_base(e1, e2), 3742 get_seg_limit(e1, e2), 3743 e2); 3744 } 3745 else 3746 load_seg(seg_reg, selector); 3747 env = savedenv; 3748 3749 #ifdef VBOX 3735 load_seg_vm(seg_reg, selector); 3736 3737 env = savedenv; 3738 3750 3739 /* Successful sync. */ 3751 3740 env1->segs[seg_reg].newselector = 0; 3752 3741 } 3753 else 3742 else 3754 3743 { 3755 env = savedenv; 3756 3757 /* Postpone sync until the guest uses the selector. */ 3758 env1->segs[seg_reg].selector = selector; /* hidden values are now incorrect, but will be resynced when this register is accessed. */ 3759 env1->segs[seg_reg].newselector = selector; 3744 if (setjmp(env1->jmp_env) == 0) 3745 { 3746 if (seg_reg == R_CS) 3747 { 3748 uint32_t e1, e2; 3749 load_segment(&e1, &e2, selector); 3750 cpu_x86_load_seg_cache(env, R_CS, selector, 3751 get_seg_base(e1, e2), 3752 get_seg_limit(e1, e2), 3753 e2); 3754 } 3755 else 3756 load_seg(seg_reg, selector); 3757 env = savedenv; 3758 3759 /* Successful sync. */ 3760 env1->segs[seg_reg].newselector = 0; 3761 } 3762 else 3763 { 3764 env = savedenv; 3765 3766 /* Postpone sync until the guest uses the selector. */ 3767 env1->segs[seg_reg].selector = selector; /* hidden values are now incorrect, but will be resynced when this register is accessed. */ 3768 env1->segs[seg_reg].newselector = selector; 3760 3769 #ifdef VBOX_STRICT 3761 printf("sync_seg: out of sync seg_reg=%d selector=%#x\n", seg_reg, selector);3762 #endif 3763 }3764 #endif 3770 printf("sync_seg: out of sync seg_reg=%d selector=%#x\n", seg_reg, selector); 3771 #endif 3772 } 3773 } 3765 3774 3766 3775 } … … 3777 3786 CPUX86State *saved_env = env; 3778 3787 target_ulong saved_T0 = T0; 3779 #ifdef VBOX3780 3788 if (setjmp(env1->jmp_env) == 0) 3781 3789 { 3782 #endif3783 3790 env = env1; 3784 3791 T0 = selector; … … 3786 3793 T0 = saved_T0; 3787 3794 env = saved_env; 3788 #ifdef VBOX3789 3795 } 3790 3796 else … … 3796 3802 #endif 3797 3803 } 3798 #endif3799 3804 } 3800 3805 … … 4169 4174 //***************************************************************************** 4170 4175 4171 #endif 4172 4176 #endif /* VBOX */ 4177
Note:
See TracChangeset
for help on using the changeset viewer.