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