From: Stanislav S. <ssh...@us...> - 2008-09-16 20:57:06
|
Update of /cvsroot/bochs/bochs/cpu In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv26909 Modified Files: access32.cc access64.cc cpu.h fetchdecode.cc load32.cc Log Message: more optimizations after fetchdecode Index: access32.cc =================================================================== RCS file: /cvsroot/bochs/bochs/cpu/access32.cc,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- access32.cc 8 Sep 2008 20:47:33 -0000 1.16 +++ access32.cc 16 Sep 2008 20:57:15 -0000 1.17 @@ -406,9 +406,9 @@ if (! (tlbEntry->accessBits & USER_PL)) { // Read this pl OK. bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 1, BX_READ); Bit8u *hostAddr = (Bit8u*) (hostPageAddr | pageOffset); data = *hostAddr; + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 1, BX_READ); BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 1, CPL, BX_READ, (Bit8u*) &data); return data; @@ -457,9 +457,9 @@ if (! (tlbEntry->accessBits & USER_PL)) { // Read this pl OK. bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 2, BX_READ); Bit16u *hostAddr = (Bit16u*) (hostPageAddr | pageOffset); ReadHostWordFromLittleEndian(hostAddr, data); + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 2, BX_READ); BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 2, CPL, BX_READ, (Bit8u*) &data); return data; @@ -518,9 +518,9 @@ if (! (tlbEntry->accessBits & USER_PL)) { // Read this pl OK. bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 4, BX_READ); Bit32u *hostAddr = (Bit32u*) (hostPageAddr | pageOffset); ReadHostDWordFromLittleEndian(hostAddr, data); + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 4, BX_READ); BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 4, CPL, BX_READ, (Bit8u*) &data); return data; @@ -579,9 +579,9 @@ if (! (tlbEntry->accessBits & USER_PL)) { // Read this pl OK. bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 8, BX_READ); Bit64u *hostAddr = (Bit64u*) (hostPageAddr | pageOffset); ReadHostQWordFromLittleEndian(hostAddr, data); + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 8, BX_READ); BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 8, CPL, BX_READ, (Bit8u*) &data); return data; @@ -639,10 +639,10 @@ if (! (tlbEntry->accessBits & USER_PL)) { // Read this pl OK. bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 16, BX_READ); Bit64u *hostAddr = (Bit64u*) (hostPageAddr | pageOffset); ReadHostQWordFromLittleEndian(hostAddr, data->xmm64u(0)); ReadHostQWordFromLittleEndian(hostAddr+1, data->xmm64u(1)); + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 16, BX_READ); BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 16, CPL, BX_READ, (Bit8u*) data); return; @@ -696,10 +696,10 @@ if (! (tlbEntry->accessBits & USER_PL)) { // Read this pl OK. bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 16, BX_READ); Bit64u *hostAddr = (Bit64u*) (hostPageAddr | pageOffset); ReadHostQWordFromLittleEndian(hostAddr, data->xmm64u(0)); ReadHostQWordFromLittleEndian(hostAddr+1, data->xmm64u(1)); + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 16, BX_READ); BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 16, CPL, BX_READ, (Bit8u*) data); return; @@ -753,13 +753,13 @@ if (! (tlbEntry->accessBits & (0x2 | USER_PL))) { bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 1, BX_RW); Bit8u *hostAddr = (Bit8u*) (hostPageAddr | pageOffset); #if BX_SUPPORT_ICACHE pageWriteStampTable.decWriteStamp(tlbEntry->ppf); #endif data = *hostAddr; BX_CPU_THIS_PTR address_xlation.pages = (bx_ptr_equiv_t) hostAddr; + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 1, BX_RW); BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 1, CPL, BX_READ, (Bit8u*) &data); return data; @@ -808,13 +808,13 @@ if (! (tlbEntry->accessBits & (0x2 | USER_PL))) { bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 2, BX_RW); Bit16u *hostAddr = (Bit16u*) (hostPageAddr | pageOffset); #if BX_SUPPORT_ICACHE pageWriteStampTable.decWriteStamp(tlbEntry->ppf); #endif ReadHostWordFromLittleEndian(hostAddr, data); BX_CPU_THIS_PTR address_xlation.pages = (bx_ptr_equiv_t) hostAddr; + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 2, BX_RW); BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 2, CPL, BX_READ, (Bit8u*) &data); return data; @@ -873,13 +873,13 @@ if (! (tlbEntry->accessBits & (0x2 | USER_PL))) { bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 4, BX_RW); Bit32u *hostAddr = (Bit32u*) (hostPageAddr | pageOffset); #if BX_SUPPORT_ICACHE pageWriteStampTable.decWriteStamp(tlbEntry->ppf); #endif ReadHostDWordFromLittleEndian(hostAddr, data); BX_CPU_THIS_PTR address_xlation.pages = (bx_ptr_equiv_t) hostAddr; + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 4, BX_RW); BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 4, CPL, BX_READ, (Bit8u*) &data); return data; @@ -938,13 +938,13 @@ if (! (tlbEntry->accessBits & (0x2 | USER_PL))) { bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 8, BX_RW); Bit64u *hostAddr = (Bit64u*) (hostPageAddr | pageOffset); #if BX_SUPPORT_ICACHE pageWriteStampTable.decWriteStamp(tlbEntry->ppf); #endif ReadHostQWordFromLittleEndian(hostAddr, data); BX_CPU_THIS_PTR address_xlation.pages = (bx_ptr_equiv_t) hostAddr; + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 8, BX_RW); BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 8, CPL, BX_READ, (Bit8u*) &data); return data; Index: access64.cc =================================================================== RCS file: /cvsroot/bochs/bochs/cpu/access64.cc,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- access64.cc 8 Sep 2008 15:45:56 -0000 1.18 +++ access64.cc 16 Sep 2008 20:57:15 -0000 1.19 @@ -339,9 +339,9 @@ if (! (tlbEntry->accessBits & USER_PL)) { // Read this pl OK. bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 1, BX_READ); Bit8u *hostAddr = (Bit8u*) (hostPageAddr | pageOffset); data = *hostAddr; + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 1, BX_READ); BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 1, CPL, BX_READ, (Bit8u*) &data); return data; @@ -380,9 +380,9 @@ if (! (tlbEntry->accessBits & USER_PL)) { // Read this pl OK. bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 2, BX_READ); Bit16u *hostAddr = (Bit16u*) (hostPageAddr | pageOffset); ReadHostWordFromLittleEndian(hostAddr, data); + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 2, BX_READ); BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 2, CPL, BX_READ, (Bit8u*) &data); return data; @@ -430,9 +430,9 @@ if (! (tlbEntry->accessBits & USER_PL)) { // Read this pl OK. bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 4, BX_READ); Bit32u *hostAddr = (Bit32u*) (hostPageAddr | pageOffset); ReadHostDWordFromLittleEndian(hostAddr, data); + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 4, BX_READ); BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 4, CPL, BX_READ, (Bit8u*) &data); return data; @@ -480,9 +480,9 @@ if (! (tlbEntry->accessBits & USER_PL)) { // Read this pl OK. bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 8, BX_READ); Bit64u *hostAddr = (Bit64u*) (hostPageAddr | pageOffset); ReadHostQWordFromLittleEndian(hostAddr, data); + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 8, BX_READ); BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 8, CPL, BX_READ, (Bit8u*) &data); return data; @@ -528,12 +528,12 @@ if (! (tlbEntry->accessBits & USER_PL)) { // Read this pl OK. bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 16, BX_READ); Bit64u *hostAddr = (Bit64u*) (hostPageAddr | pageOffset); - ReadHostQWordFromLittleEndian(hostAddr, data->xmm64u(0)); - ReadHostQWordFromLittleEndian(hostAddr+1, data->xmm64u(1)); - BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, - tlbEntry->ppf | pageOffset, 16, CPL, BX_READ, (Bit8u*) data); + ReadHostQWordFromLittleEndian(hostAddr, data->xmm64u(0)); + ReadHostQWordFromLittleEndian(hostAddr+1, data->xmm64u(1)); + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 16, BX_READ); + BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, + tlbEntry->ppf | pageOffset, 16, CPL, BX_READ, (Bit8u*) data); return; } } @@ -572,12 +572,12 @@ if (! (tlbEntry->accessBits & USER_PL)) { // Read this pl OK. bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 16, BX_READ); Bit64u *hostAddr = (Bit64u*) (hostPageAddr | pageOffset); - ReadHostQWordFromLittleEndian(hostAddr, data->xmm64u(0)); - ReadHostQWordFromLittleEndian(hostAddr+1, data->xmm64u(1)); - BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, - tlbEntry->ppf | pageOffset, 16, CPL, BX_READ, (Bit8u*) data); + ReadHostQWordFromLittleEndian(hostAddr, data->xmm64u(0)); + ReadHostQWordFromLittleEndian(hostAddr+1, data->xmm64u(1)); + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 16, BX_READ); + BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, + tlbEntry->ppf | pageOffset, 16, CPL, BX_READ, (Bit8u*) data); return; } } @@ -619,13 +619,13 @@ if (! (tlbEntry->accessBits & (0x2 | USER_PL))) { bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 1, BX_RW); Bit8u *hostAddr = (Bit8u*) (hostPageAddr | pageOffset); #if BX_SUPPORT_ICACHE pageWriteStampTable.decWriteStamp(tlbEntry->ppf); #endif data = *hostAddr; BX_CPU_THIS_PTR address_xlation.pages = (bx_ptr_equiv_t) hostAddr; + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 1, BX_RW); BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 1, CPL, BX_READ, (Bit8u*) &data); return data; @@ -664,13 +664,13 @@ if (! (tlbEntry->accessBits & (0x2 | USER_PL))) { bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 2, BX_RW); Bit16u *hostAddr = (Bit16u*) (hostPageAddr | pageOffset); #if BX_SUPPORT_ICACHE pageWriteStampTable.decWriteStamp(tlbEntry->ppf); #endif ReadHostWordFromLittleEndian(hostAddr, data); BX_CPU_THIS_PTR address_xlation.pages = (bx_ptr_equiv_t) hostAddr; + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 2, BX_RW); BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 2, CPL, BX_READ, (Bit8u*) &data); return data; @@ -718,13 +718,13 @@ if (! (tlbEntry->accessBits & (0x2 | USER_PL))) { bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 4, BX_RW); Bit32u *hostAddr = (Bit32u*) (hostPageAddr | pageOffset); #if BX_SUPPORT_ICACHE pageWriteStampTable.decWriteStamp(tlbEntry->ppf); #endif ReadHostDWordFromLittleEndian(hostAddr, data); BX_CPU_THIS_PTR address_xlation.pages = (bx_ptr_equiv_t) hostAddr; + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 4, BX_RW); BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 4, CPL, BX_READ, (Bit8u*) &data); return data; @@ -772,13 +772,13 @@ if (! (tlbEntry->accessBits & (0x2 | USER_PL))) { bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 8, BX_RW); Bit64u *hostAddr = (Bit64u*) (hostPageAddr | pageOffset); #if BX_SUPPORT_ICACHE pageWriteStampTable.decWriteStamp(tlbEntry->ppf); #endif ReadHostQWordFromLittleEndian(hostAddr, data); BX_CPU_THIS_PTR address_xlation.pages = (bx_ptr_equiv_t) hostAddr; + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 8, BX_RW); BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 8, CPL, BX_READ, (Bit8u*) &data); return data; Index: cpu.h =================================================================== RCS file: /cvsroot/bochs/bochs/cpu/cpu.h,v retrieving revision 1.526 retrieving revision 1.527 diff -u -d -r1.526 -r1.527 --- cpu.h 16 Sep 2008 19:20:02 -0000 1.526 +++ cpu.h 16 Sep 2008 20:57:15 -0000 1.527 @@ -1683,6 +1683,9 @@ BX_SMF void LOAD_Eb_Resolve32BaseIndex(bxInstruction_c *) BX_CPP_AttrRegparmN(1); BX_SMF void LOAD_Ew(bxInstruction_c *) BX_CPP_AttrRegparmN(1); + BX_SMF void LOAD_Ew_Resolve16BaseIndex(bxInstruction_c *) BX_CPP_AttrRegparmN(1); + BX_SMF void LOAD_Ew_Resolve32Base(bxInstruction_c *) BX_CPP_AttrRegparmN(1); + BX_SMF void LOAD_Ew_Resolve32BaseIndex(bxInstruction_c *) BX_CPP_AttrRegparmN(1); BX_SMF void LOAD_Ed(bxInstruction_c *) BX_CPP_AttrRegparmN(1); BX_SMF void LOAD_Ed_Resolve16BaseIndex(bxInstruction_c *) BX_CPP_AttrRegparmN(1); Index: fetchdecode.cc =================================================================== RCS file: /cvsroot/bochs/bochs/cpu/fetchdecode.cc,v retrieving revision 1.215 retrieving revision 1.216 diff -u -d -r1.215 -r1.216 --- fetchdecode.cc 16 Sep 2008 19:22:13 -0000 1.215 +++ fetchdecode.cc 16 Sep 2008 20:57:16 -0000 1.216 @@ -2987,9 +2987,9 @@ }; static const BxExecutePtr_tR BxTableLoad32_Ew[3] = { - &BX_CPU_C::LOAD_Ew, - &BX_CPU_C::LOAD_Ew, - &BX_CPU_C::LOAD_Ew + &BX_CPU_C::LOAD_Ew_Resolve16BaseIndex, + &BX_CPU_C::LOAD_Ew_Resolve32Base, + &BX_CPU_C::LOAD_Ew_Resolve32BaseIndex }; static const BxExecutePtr_tR BxTableLoad32_Ed[3] = { Index: load32.cc =================================================================== RCS file: /cvsroot/bochs/bochs/cpu/load32.cc,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- load32.cc 16 Sep 2008 19:20:02 -0000 1.1 +++ load32.cc 16 Sep 2008 20:57:16 -0000 1.2 @@ -57,9 +57,9 @@ // from this CPL. bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 1, BX_READ); Bit8u *hostAddr = (Bit8u*) (hostPageAddr | pageOffset); TMP8L = *hostAddr; + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 1, BX_READ); BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 1, CPL, BX_READ, (Bit8u*) &TMP8L); } @@ -107,9 +107,9 @@ // from this CPL. bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 1, BX_READ); Bit8u *hostAddr = (Bit8u*) (hostPageAddr | pageOffset); TMP8L = *hostAddr; + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 1, BX_READ); BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 1, CPL, BX_READ, (Bit8u*) &TMP8L); } @@ -157,9 +157,9 @@ // from this CPL. bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 1, BX_READ); Bit8u *hostAddr = (Bit8u*) (hostPageAddr | pageOffset); TMP8L = *hostAddr; + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 1, BX_READ); BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 1, CPL, BX_READ, (Bit8u*) &TMP8L); } @@ -190,6 +190,156 @@ BX_CPU_CALL_METHOD(i->execute2, (i)); } +void BX_CPP_AttrRegparmN(1) BX_CPU_C::LOAD_Ew_Resolve16BaseIndex(bxInstruction_c *i) +{ + Bit16u offset = BX_READ_16BIT_REG(i->sibBase()) + BX_READ_16BIT_REG(i->sibIndex()) + (Bit16s) i->displ16u(); + Bit32u laddr; + + unsigned s = i->seg(); + bx_segment_reg_t *seg = &BX_CPU_THIS_PTR sregs[s]; + BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 2, BX_READ); + + BX_ASSERT(BX_CPU_THIS_PTR cpu_mode != BX_MODE_LONG_64); + + if (seg->cache.valid & SegAccessROK) { + if (offset < seg->cache.u.segment.limit_scaled) { +accessOK: + laddr = BX_CPU_THIS_PTR get_laddr32(s, offset); +#if BX_SupportGuest2HostTLB + unsigned tlbIndex = BX_TLB_INDEX_OF(laddr, 1); + Bit32u lpf = LPFOf(laddr); + bx_TLB_entry *tlbEntry = &BX_CPU_THIS_PTR TLB.entry[tlbIndex]; + if (tlbEntry->lpf == lpf && ! (tlbEntry->accessBits & USER_PL)) { + // See if the TLB entry privilege level allows us read access + // from this CPL. + bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; + Bit32u pageOffset = PAGE_OFFSET(laddr); + Bit16u *hostAddr = (Bit16u*) (hostPageAddr | pageOffset); + ReadHostWordFromLittleEndian(hostAddr, TMP16); + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 2, BX_READ); + BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, + tlbEntry->ppf | pageOffset, 2, CPL, BX_READ, (Bit8u*) &TMP16); + } + else +#endif + { + access_read_linear(laddr, 2, CPL, BX_READ, (void *) &TMP16); + } + + BX_CPU_CALL_METHOD(i->execute2, (i)); + return; + } + else { + BX_ERROR(("LOAD_Ew(): segment limit violation")); + exception(int_number(s), 0, 0); + } + } + + if (!read_virtual_checks(seg, offset, 2)) + exception(int_number(s), 0, 0); + goto accessOK; +} + +void BX_CPP_AttrRegparmN(1) BX_CPU_C::LOAD_Ew_Resolve32Base(bxInstruction_c *i) +{ + Bit32u offset = BX_READ_32BIT_REG(i->sibBase()) + (Bit32s) i->displ32u(); + Bit32u laddr; + + unsigned s = i->seg(); + bx_segment_reg_t *seg = &BX_CPU_THIS_PTR sregs[s]; + BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 2, BX_READ); + + BX_ASSERT(BX_CPU_THIS_PTR cpu_mode != BX_MODE_LONG_64); + + if (seg->cache.valid & SegAccessROK) { + if (offset < seg->cache.u.segment.limit_scaled) { +accessOK: + laddr = BX_CPU_THIS_PTR get_laddr32(s, offset); +#if BX_SupportGuest2HostTLB + unsigned tlbIndex = BX_TLB_INDEX_OF(laddr, 1); + Bit32u lpf = LPFOf(laddr); + bx_TLB_entry *tlbEntry = &BX_CPU_THIS_PTR TLB.entry[tlbIndex]; + if (tlbEntry->lpf == lpf && ! (tlbEntry->accessBits & USER_PL)) { + // See if the TLB entry privilege level allows us read access + // from this CPL. + bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; + Bit32u pageOffset = PAGE_OFFSET(laddr); + Bit16u *hostAddr = (Bit16u*) (hostPageAddr | pageOffset); + ReadHostWordFromLittleEndian(hostAddr, TMP16); + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 2, BX_READ); + BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, + tlbEntry->ppf | pageOffset, 2, CPL, BX_READ, (Bit8u*) &TMP16); + } + else +#endif + { + access_read_linear(laddr, 2, CPL, BX_READ, (void *) &TMP16); + } + + BX_CPU_CALL_METHOD(i->execute2, (i)); + return; + } + else { + BX_ERROR(("LOAD_Ew(): segment limit violation")); + exception(int_number(s), 0, 0); + } + } + + if (!read_virtual_checks(seg, offset, 2)) + exception(int_number(s), 0, 0); + goto accessOK; +} + +void BX_CPP_AttrRegparmN(1) BX_CPU_C::LOAD_Ew_Resolve32BaseIndex(bxInstruction_c *i) +{ + Bit32u offset = BX_READ_32BIT_REG(i->sibBase()) + (BX_READ_32BIT_REG(i->sibIndex()) << i->sibScale()) + (Bit32s) i->displ32u(); + Bit32u laddr; + + unsigned s = i->seg(); + bx_segment_reg_t *seg = &BX_CPU_THIS_PTR sregs[s]; + BX_INSTR_MEM_DATA_ACCESS(BX_CPU_ID, s, offset, 2, BX_READ); + + BX_ASSERT(BX_CPU_THIS_PTR cpu_mode != BX_MODE_LONG_64); + + if (seg->cache.valid & SegAccessROK) { + if (offset < seg->cache.u.segment.limit_scaled) { +accessOK: + laddr = BX_CPU_THIS_PTR get_laddr32(s, offset); +#if BX_SupportGuest2HostTLB + unsigned tlbIndex = BX_TLB_INDEX_OF(laddr, 1); + Bit32u lpf = LPFOf(laddr); + bx_TLB_entry *tlbEntry = &BX_CPU_THIS_PTR TLB.entry[tlbIndex]; + if (tlbEntry->lpf == lpf && ! (tlbEntry->accessBits & USER_PL)) { + // See if the TLB entry privilege level allows us read access + // from this CPL. + bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; + Bit32u pageOffset = PAGE_OFFSET(laddr); + Bit16u *hostAddr = (Bit16u*) (hostPageAddr | pageOffset); + ReadHostWordFromLittleEndian(hostAddr, TMP16); + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 2, BX_READ); + BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, + tlbEntry->ppf | pageOffset, 2, CPL, BX_READ, (Bit8u*) &TMP16); + } + else +#endif + { + access_read_linear(laddr, 2, CPL, BX_READ, (void *) &TMP16); + } + + BX_CPU_CALL_METHOD(i->execute2, (i)); + return; + } + else { + BX_ERROR(("LOAD_Ew(): segment limit violation")); + exception(int_number(s), 0, 0); + } + } + + if (!read_virtual_checks(seg, offset, 2)) + exception(int_number(s), 0, 0); + goto accessOK; +} + void BX_CPP_AttrRegparmN(1) BX_CPU_C::LOAD_Ed(bxInstruction_c *i) { bx_address eaddr = BX_CPU_CALL_METHODR(i->ResolveModrm, (i)); @@ -221,9 +371,9 @@ // from this CPL. bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 4, BX_READ); Bit32u *hostAddr = (Bit32u*) (hostPageAddr | pageOffset); ReadHostDWordFromLittleEndian(hostAddr, TMP32); + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 4, BX_READ); BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 4, CPL, BX_READ, (Bit8u*) &TMP32); } @@ -271,9 +421,9 @@ // from this CPL. bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 4, BX_READ); Bit32u *hostAddr = (Bit32u*) (hostPageAddr | pageOffset); ReadHostDWordFromLittleEndian(hostAddr, TMP32); + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 4, BX_READ); BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 4, CPL, BX_READ, (Bit8u*) &TMP32); } @@ -321,9 +471,9 @@ // from this CPL. bx_hostpageaddr_t hostPageAddr = tlbEntry->hostPageAddr; Bit32u pageOffset = PAGE_OFFSET(laddr); - BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 4, BX_READ); Bit32u *hostAddr = (Bit32u*) (hostPageAddr | pageOffset); ReadHostDWordFromLittleEndian(hostAddr, TMP32); + BX_INSTR_LIN_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 4, BX_READ); BX_DBG_LIN_MEMORY_ACCESS(BX_CPU_ID, laddr, tlbEntry->ppf | pageOffset, 4, CPL, BX_READ, (Bit8u*) &TMP32); } @@ -382,3 +532,4 @@ } #endif + |