tlb.hh revision 10474:799c8ee4ecba
16691Stjones1@inf.ed.ac.uk/*
26691Stjones1@inf.ed.ac.uk * Copyright (c) 2001-2005 The Regents of The University of Michigan
36691Stjones1@inf.ed.ac.uk * Copyright (c) 2007 MIPS Technologies, Inc.
46691Stjones1@inf.ed.ac.uk * All rights reserved.
56691Stjones1@inf.ed.ac.uk *
66691Stjones1@inf.ed.ac.uk * Redistribution and use in source and binary forms, with or without
76691Stjones1@inf.ed.ac.uk * modification, are permitted provided that the following conditions are
86691Stjones1@inf.ed.ac.uk * met: redistributions of source code must retain the above copyright
96691Stjones1@inf.ed.ac.uk * notice, this list of conditions and the following disclaimer;
106691Stjones1@inf.ed.ac.uk * redistributions in binary form must reproduce the above copyright
116691Stjones1@inf.ed.ac.uk * notice, this list of conditions and the following disclaimer in the
126691Stjones1@inf.ed.ac.uk * documentation and/or other materials provided with the distribution;
136691Stjones1@inf.ed.ac.uk * neither the name of the copyright holders nor the names of its
146691Stjones1@inf.ed.ac.uk * contributors may be used to endorse or promote products derived from
156691Stjones1@inf.ed.ac.uk * this software without specific prior written permission.
166691Stjones1@inf.ed.ac.uk *
176691Stjones1@inf.ed.ac.uk * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
186691Stjones1@inf.ed.ac.uk * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
196691Stjones1@inf.ed.ac.uk * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
206691Stjones1@inf.ed.ac.uk * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
216691Stjones1@inf.ed.ac.uk * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
226691Stjones1@inf.ed.ac.uk * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
236691Stjones1@inf.ed.ac.uk * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
246691Stjones1@inf.ed.ac.uk * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
256691Stjones1@inf.ed.ac.uk * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
266691Stjones1@inf.ed.ac.uk * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
276691Stjones1@inf.ed.ac.uk * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
286691Stjones1@inf.ed.ac.uk *
296691Stjones1@inf.ed.ac.uk * Authors: Nathan Binkert
306691Stjones1@inf.ed.ac.uk *          Steve Reinhardt
316691Stjones1@inf.ed.ac.uk *          Jaidev Patwardhan
326691Stjones1@inf.ed.ac.uk *          Korey Sewell
336691Stjones1@inf.ed.ac.uk */
346691Stjones1@inf.ed.ac.uk
356691Stjones1@inf.ed.ac.uk#ifndef __ARCH_MIPS_TLB_HH__
366691Stjones1@inf.ed.ac.uk#define __ARCH_MIPS_TLB_HH__
376691Stjones1@inf.ed.ac.uk
386691Stjones1@inf.ed.ac.uk#include <map>
396691Stjones1@inf.ed.ac.uk
406691Stjones1@inf.ed.ac.uk#include "arch/mips/isa_traits.hh"
416691Stjones1@inf.ed.ac.uk#include "arch/mips/pagetable.hh"
426691Stjones1@inf.ed.ac.uk#include "arch/mips/utility.hh"
436691Stjones1@inf.ed.ac.uk#include "arch/mips/vtophys.hh"
446691Stjones1@inf.ed.ac.uk#include "base/statistics.hh"
456691Stjones1@inf.ed.ac.uk#include "mem/request.hh"
466691Stjones1@inf.ed.ac.uk#include "params/MipsTLB.hh"
476691Stjones1@inf.ed.ac.uk#include "sim/sim_object.hh"
486691Stjones1@inf.ed.ac.uk#include "sim/tlb.hh"
496691Stjones1@inf.ed.ac.uk
506691Stjones1@inf.ed.ac.ukclass ThreadContext;
516691Stjones1@inf.ed.ac.uk
526691Stjones1@inf.ed.ac.uk/* MIPS does not distinguish between a DTLB and an ITLB -> unified TLB
536691Stjones1@inf.ed.ac.uk   However, to maintain compatibility with other architectures, we'll
546691Stjones1@inf.ed.ac.uk   simply create an ITLB and DTLB that will point to the real TLB */
556691Stjones1@inf.ed.ac.uknamespace MipsISA {
566691Stjones1@inf.ed.ac.uk
576691Stjones1@inf.ed.ac.ukclass TLB : public BaseTLB
586691Stjones1@inf.ed.ac.uk{
596691Stjones1@inf.ed.ac.uk  protected:
6012616Sgabeblack@google.com    typedef std::multimap<Addr, int> PageTable;
6112616Sgabeblack@google.com    PageTable lookupTable;      // Quick lookup into page table
626691Stjones1@inf.ed.ac.uk
636691Stjones1@inf.ed.ac.uk    MipsISA::PTE *table;        // the Page Table
646691Stjones1@inf.ed.ac.uk    int size;                   // TLB Size
656691Stjones1@inf.ed.ac.uk    int nlu;                    // not last used entry (for replacement)
666691Stjones1@inf.ed.ac.uk
676691Stjones1@inf.ed.ac.uk    void nextnlu() { if (++nlu >= size) nlu = 0; }
686691Stjones1@inf.ed.ac.uk    MipsISA::PTE *lookup(Addr vpn, uint8_t asn) const;
696691Stjones1@inf.ed.ac.uk
706691Stjones1@inf.ed.ac.uk    mutable Stats::Scalar read_hits;
716691Stjones1@inf.ed.ac.uk    mutable Stats::Scalar read_misses;
726691Stjones1@inf.ed.ac.uk    mutable Stats::Scalar read_acv;
736691Stjones1@inf.ed.ac.uk    mutable Stats::Scalar read_accesses;
746691Stjones1@inf.ed.ac.uk    mutable Stats::Scalar write_hits;
756691Stjones1@inf.ed.ac.uk    mutable Stats::Scalar write_misses;
766691Stjones1@inf.ed.ac.uk    mutable Stats::Scalar write_acv;
776691Stjones1@inf.ed.ac.uk    mutable Stats::Scalar write_accesses;
786691Stjones1@inf.ed.ac.uk    Stats::Formula hits;
796691Stjones1@inf.ed.ac.uk    Stats::Formula misses;
806691Stjones1@inf.ed.ac.uk    Stats::Formula accesses;
816691Stjones1@inf.ed.ac.uk
8212616Sgabeblack@google.com  public:
8312616Sgabeblack@google.com    typedef MipsTLBParams Params;
846691Stjones1@inf.ed.ac.uk    TLB(const Params *p);
856691Stjones1@inf.ed.ac.uk
867811Ssteve.reinhardt@amd.com    int probeEntry(Addr vpn,uint8_t) const;
876691Stjones1@inf.ed.ac.uk    MipsISA::PTE *getEntry(unsigned) const;
886691Stjones1@inf.ed.ac.uk    virtual ~TLB();
89
90    void takeOverFrom(BaseTLB *otlb) {}
91
92    int smallPages;
93    int getsize() const { return size; }
94
95    MipsISA::PTE &index(bool advance = true);
96    void insert(Addr vaddr, MipsISA::PTE &pte);
97    void insertAt(MipsISA::PTE &pte, unsigned Index, int _smallPages);
98    void flushAll();
99    void demapPage(Addr vaddr, uint64_t asn)
100    {
101        panic("demapPage unimplemented.\n");
102    }
103
104    // static helper functions... really
105    static bool validVirtualAddress(Addr vaddr);
106
107    static Fault checkCacheability(RequestPtr &req);
108
109    // Checkpointing
110    void serialize(std::ostream &os);
111    void unserialize(Checkpoint *cp, const std::string &section);
112
113    void regStats();
114
115    Fault translateAtomic(RequestPtr req, ThreadContext *tc, Mode mode);
116    void translateTiming(RequestPtr req, ThreadContext *tc,
117            Translation *translation, Mode mode);
118
119    /** Function stub for CheckerCPU compilation issues. MIPS does not
120     *  support the Checker model at the moment.
121     */
122    Fault translateFunctional(RequestPtr req, ThreadContext *tc, Mode mode);
123    Fault finalizePhysical(RequestPtr req, ThreadContext *tc, Mode mode) const;
124
125  private:
126    Fault translateInst(RequestPtr req, ThreadContext *tc);
127    Fault translateData(RequestPtr req, ThreadContext *tc, bool write);
128};
129
130}
131
132
133
134#endif // __MIPS_MEMORY_HH__
135