class CDebugTlb; class CTLB_CB { public: virtual void TLB_Mapped ( DWORD VAddr, DWORD Len, DWORD PAddr, bool bReadOnly ) = 0; virtual void TLB_Unmaped ( DWORD VAddr, DWORD Len ) = 0; virtual void TLB_Changed ( void ) = 0; }; class CTLB : protected CSystemRegisters { public: typedef struct { bool EntryDefined; union { unsigned long Value; unsigned char A[4]; struct { unsigned zero : 13; unsigned Mask : 12; unsigned zero2 : 7; } ; } PageMask; union { unsigned long Value; unsigned char A[4]; struct { unsigned ASID : 8; unsigned Zero : 4; unsigned G : 1; unsigned VPN2 : 19; }; } EntryHi; union { unsigned long Value; unsigned char A[4]; struct { unsigned GLOBAL: 1; unsigned V : 1; unsigned D : 1; unsigned C : 3; unsigned PFN : 20; unsigned ZERO: 6; } ; } EntryLo0; union { unsigned long Value; unsigned char A[4]; struct { unsigned GLOBAL: 1; unsigned V : 1; unsigned D : 1; unsigned C : 3; unsigned PFN : 20; unsigned ZERO: 6; } ; } EntryLo1; } TLB_ENTRY; public: CTLB ( CTLB_CB * CallBack ); ~CTLB ( void ); void Reset ( bool InvalidateTLB ); //Used by opcodes of the same name to manipulate the tlb (reads the registers) void Probe ( void ); void ReadEntry ( void ); void WriteEntry ( int index, bool Random ); //See if a VAddr has an entry to translate to a PAddr bool AddressDefined ( DWORD VAddr ); const TLB_ENTRY & TlbEntry ( int Entry) const { return m_tlb[Entry]; } bool PAddrToVAddr ( DWORD PAddr, DWORD & VAddr, DWORD & Index ); void RecordDifference ( CLog &LogFile, const CTLB& rTLB); bool operator == (const CTLB& rTLB) const; bool operator != (const CTLB& rTLB) const; private: typedef struct { DWORD VSTART; DWORD VEND; DWORD PHYSSTART; DWORD PHYSEND; DWORD Length; bool VALID; bool DIRTY; bool GLOBAL; bool ValidEntry; bool Random; bool Probed; } FASTTLB; friend CDebugTlb; // enable debug window to read class CTLB_CB * const m_CB; TLB_ENTRY m_tlb[32]; FASTTLB m_FastTlb[64]; void SetupTLB_Entry ( int index, bool Random ); };