isa.hh revision 10035
16242Sgblack@eecs.umich.edu/*
27093Sgblack@eecs.umich.edu * Copyright (c) 2009 The Regents of The University of Michigan
37093Sgblack@eecs.umich.edu * All rights reserved.
47093Sgblack@eecs.umich.edu *
57093Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
67093Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
77093Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
87093Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
97093Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
107093Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
117093Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
127093Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
137093Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
146242Sgblack@eecs.umich.edu * this software without specific prior written permission.
156242Sgblack@eecs.umich.edu *
166242Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
176242Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
186242Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
196242Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
206242Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
216242Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
226242Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
236242Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
246242Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
256242Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
266242Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276242Sgblack@eecs.umich.edu *
286242Sgblack@eecs.umich.edu * Authors: Gabe Black
296242Sgblack@eecs.umich.edu */
306242Sgblack@eecs.umich.edu
316242Sgblack@eecs.umich.edu#ifndef __ARCH_MIPS_ISA_HH__
326242Sgblack@eecs.umich.edu#define __ARCH_MIPS_ISA_HH__
336242Sgblack@eecs.umich.edu
346242Sgblack@eecs.umich.edu#include <queue>
356242Sgblack@eecs.umich.edu#include <string>
366242Sgblack@eecs.umich.edu#include <vector>
376242Sgblack@eecs.umich.edu
386242Sgblack@eecs.umich.edu#include "arch/mips/registers.hh"
396242Sgblack@eecs.umich.edu#include "arch/mips/types.hh"
406242Sgblack@eecs.umich.edu#include "sim/eventq.hh"
416242Sgblack@eecs.umich.edu#include "sim/fault_fwd.hh"
426242Sgblack@eecs.umich.edu#include "sim/sim_object.hh"
436242Sgblack@eecs.umich.edu
446242Sgblack@eecs.umich.educlass BaseCPU;
456242Sgblack@eecs.umich.educlass Checkpoint;
466242Sgblack@eecs.umich.educlass EventManager;
476242Sgblack@eecs.umich.edustruct MipsISAParams;
486242Sgblack@eecs.umich.educlass ThreadContext;
496242Sgblack@eecs.umich.edu
506242Sgblack@eecs.umich.edunamespace MipsISA
516242Sgblack@eecs.umich.edu{
526242Sgblack@eecs.umich.edu    class ISA : public SimObject
536242Sgblack@eecs.umich.edu    {
546242Sgblack@eecs.umich.edu      public:
556242Sgblack@eecs.umich.edu        // The MIPS name for this file is CP0 or Coprocessor 0
566242Sgblack@eecs.umich.edu        typedef ISA CP0;
576242Sgblack@eecs.umich.edu
586242Sgblack@eecs.umich.edu        typedef MipsISAParams Params;
596242Sgblack@eecs.umich.edu
606242Sgblack@eecs.umich.edu      protected:
616242Sgblack@eecs.umich.edu        // Number of threads and vpes an individual ISA state can handle
626242Sgblack@eecs.umich.edu        uint8_t numThreads;
636242Sgblack@eecs.umich.edu        uint8_t numVpes;
646242Sgblack@eecs.umich.edu
657111Sgblack@eecs.umich.edu        enum BankType {
666242Sgblack@eecs.umich.edu            perProcessor,
676242Sgblack@eecs.umich.edu            perThreadContext,
686242Sgblack@eecs.umich.edu            perVirtProcessor
696242Sgblack@eecs.umich.edu        };
707408Sgblack@eecs.umich.edu
716735Sgblack@eecs.umich.edu        std::vector<std::vector<MiscReg> > miscRegFile;
726242Sgblack@eecs.umich.edu        std::vector<std::vector<MiscReg> > miscRegFile_WriteMask;
736242Sgblack@eecs.umich.edu        std::vector<BankType> bankType;
746242Sgblack@eecs.umich.edu
756723Sgblack@eecs.umich.edu      public:
766242Sgblack@eecs.umich.edu        void clear();
776242Sgblack@eecs.umich.edu
786261Sgblack@eecs.umich.edu        void configCP();
796403Sgblack@eecs.umich.edu
806403Sgblack@eecs.umich.edu        unsigned getVPENum(ThreadID tid);
816403Sgblack@eecs.umich.edu
827325Sgblack@eecs.umich.edu        //////////////////////////////////////////////////////////
837325Sgblack@eecs.umich.edu        //
847400SAli.Saidi@ARM.com        // READ/WRITE CP0 STATE
857350SAli.Saidi@ARM.com        //
867259Sgblack@eecs.umich.edu        //
877259Sgblack@eecs.umich.edu        //////////////////////////////////////////////////////////
887259Sgblack@eecs.umich.edu        //@TODO: MIPS MT's register view automatically connects
897259Sgblack@eecs.umich.edu        //       Status to TCStatus depending on current thread
907264Sgblack@eecs.umich.edu        void updateCP0ReadView(int misc_reg, ThreadID tid) { }
917267Sgblack@eecs.umich.edu        MiscReg readMiscRegNoEffect(int misc_reg, ThreadID tid = 0);
927285Sgblack@eecs.umich.edu
937265Sgblack@eecs.umich.edu        //template <class TC>
947266Sgblack@eecs.umich.edu        MiscReg readMiscReg(int misc_reg,
957266Sgblack@eecs.umich.edu                            ThreadContext *tc, ThreadID tid = 0);
967266Sgblack@eecs.umich.edu
977268Sgblack@eecs.umich.edu        MiscReg filterCP0Write(int misc_reg, int reg_sel, const MiscReg &val);
987272Sgblack@eecs.umich.edu        void setRegMask(int misc_reg, const MiscReg &val, ThreadID tid = 0);
997272Sgblack@eecs.umich.edu        void setMiscRegNoEffect(int misc_reg, const MiscReg &val,
1007271Sgblack@eecs.umich.edu                                ThreadID tid = 0);
1017273Sgblack@eecs.umich.edu
1027287Sgblack@eecs.umich.edu        //template <class TC>
1037287Sgblack@eecs.umich.edu        void setMiscReg(int misc_reg, const MiscReg &val,
1047274Sgblack@eecs.umich.edu                        ThreadContext *tc, ThreadID tid = 0);
1057275Sgblack@eecs.umich.edu
1067276Sgblack@eecs.umich.edu        //////////////////////////////////////////////////////////
1077286Sgblack@eecs.umich.edu        //
1087297Sgblack@eecs.umich.edu        // DECLARE INTERFACE THAT WILL ALLOW A MiscRegFile (Cop0)
1097297Sgblack@eecs.umich.edu        // TO SCHEDULE EVENTS
1107298Sgblack@eecs.umich.edu        //
1117352Sgblack@eecs.umich.edu        //////////////////////////////////////////////////////////
1127352Sgblack@eecs.umich.edu
1137354Sgblack@eecs.umich.edu        // Flag that is set when CP0 state has been written to.
1147353Sgblack@eecs.umich.edu        bool cp0Updated;
1157355Sgblack@eecs.umich.edu
1167355Sgblack@eecs.umich.edu        // Enumerated List of CP0 Event Types
1177355Sgblack@eecs.umich.edu        enum CP0EventType {
1187355Sgblack@eecs.umich.edu            UpdateCP0
1197355Sgblack@eecs.umich.edu        };
1207355Sgblack@eecs.umich.edu
1217355Sgblack@eecs.umich.edu        // Declare A CP0Event Class for scheduling
1227355Sgblack@eecs.umich.edu        class CP0Event : public Event
1237355Sgblack@eecs.umich.edu        {
1247355Sgblack@eecs.umich.edu          protected:
1257355Sgblack@eecs.umich.edu            ISA::CP0 *cp0;
1267355Sgblack@eecs.umich.edu            BaseCPU *cpu;
1277355Sgblack@eecs.umich.edu            CP0EventType cp0EventType;
1287355Sgblack@eecs.umich.edu            Fault fault;
1297362Sgblack@eecs.umich.edu
1307362Sgblack@eecs.umich.edu          public:
1317362Sgblack@eecs.umich.edu            /** Constructs a CP0 event. */
1327362Sgblack@eecs.umich.edu            CP0Event(CP0 *_cp0, BaseCPU *_cpu, CP0EventType e_type);
1337390Sgblack@eecs.umich.edu
1347404SAli.Saidi@ARM.com            /** Process this event. */
1357404SAli.Saidi@ARM.com            virtual void process();
1367404SAli.Saidi@ARM.com
1377404SAli.Saidi@ARM.com            /** Returns the description of this event. */
1387406SAli.Saidi@ARM.com            const char *description() const;
1397406SAli.Saidi@ARM.com
1407406SAli.Saidi@ARM.com            /** Schedule This Event */
1417436Sdam.sunwoo@arm.com            void scheduleEvent(Cycles delay);
1427436Sdam.sunwoo@arm.com
1437436Sdam.sunwoo@arm.com            /** Unschedule This Event */
1447436Sdam.sunwoo@arm.com            void unscheduleEvent();
1457436Sdam.sunwoo@arm.com        };
1467436Sdam.sunwoo@arm.com
1477436Sdam.sunwoo@arm.com        // Schedule a CP0 Update Event
1487436Sdam.sunwoo@arm.com        void scheduleCP0Update(BaseCPU *cpu, Cycles delay = Cycles(0));
1497436Sdam.sunwoo@arm.com
1507583SAli.Saidi@arm.com        // If any changes have been made, then check the state for changes
1517583SAli.Saidi@arm.com        // and if necessary alert the CPU
1527583SAli.Saidi@arm.com        void updateCPU(BaseCPU *cpu);
1537583SAli.Saidi@arm.com
1547583SAli.Saidi@arm.com        // Keep a List of CPU Events that need to be deallocated
1557583SAli.Saidi@arm.com        std::queue<CP0Event*> cp0EventRemoveList;
1567583SAli.Saidi@arm.com
1577583SAli.Saidi@arm.com        static std::string miscRegNames[NumMiscRegs];
1587583SAli.Saidi@arm.com
1597583SAli.Saidi@arm.com      public:
1607583SAli.Saidi@arm.com        void startup(ThreadContext *tc) {}
1617583SAli.Saidi@arm.com
1627583SAli.Saidi@arm.com        /// Explicitly import the otherwise hidden startup
1637583SAli.Saidi@arm.com        using SimObject::startup;
1647583SAli.Saidi@arm.com
1657583SAli.Saidi@arm.com        const Params *params() const;
1667259Sgblack@eecs.umich.edu
1677406SAli.Saidi@ARM.com        ISA(Params *p);
1687259Sgblack@eecs.umich.edu
1697259Sgblack@eecs.umich.edu        int
1707259Sgblack@eecs.umich.edu        flattenIntIndex(int reg) const
1717259Sgblack@eecs.umich.edu        {
1727259Sgblack@eecs.umich.edu            return reg;
1737259Sgblack@eecs.umich.edu        }
1747259Sgblack@eecs.umich.edu
1757259Sgblack@eecs.umich.edu        int
1767259Sgblack@eecs.umich.edu        flattenFloatIndex(int reg) const
1777259Sgblack@eecs.umich.edu        {
1787259Sgblack@eecs.umich.edu            return reg;
1797259Sgblack@eecs.umich.edu        }
1807259Sgblack@eecs.umich.edu
1817259Sgblack@eecs.umich.edu        // dummy
1827259Sgblack@eecs.umich.edu        int
1837259Sgblack@eecs.umich.edu        flattenCCIndex(int reg) const
1847259Sgblack@eecs.umich.edu        {
1857259Sgblack@eecs.umich.edu            return reg;
1867259Sgblack@eecs.umich.edu        }
1877351Sgblack@eecs.umich.edu
1887351Sgblack@eecs.umich.edu        int
1897351Sgblack@eecs.umich.edu        flattenMiscIndex(int reg) const
1907351Sgblack@eecs.umich.edu        {
1917351Sgblack@eecs.umich.edu            return reg;
1927351Sgblack@eecs.umich.edu        }
1937259Sgblack@eecs.umich.edu
1947259Sgblack@eecs.umich.edu    };
1957259Sgblack@eecs.umich.edu}
1967259Sgblack@eecs.umich.edu
1977259Sgblack@eecs.umich.edu#endif
1987259Sgblack@eecs.umich.edu