isa_traits.hh revision 2431
12810Srdreslin@umich.edu/* 211870Snikos.nikoleris@arm.com * Copyright (c) 2003-2005 The Regents of The University of Michigan 39347SAndreas.Sandberg@arm.com * All rights reserved. 49347SAndreas.Sandberg@arm.com * 59347SAndreas.Sandberg@arm.com * Redistribution and use in source and binary forms, with or without 69347SAndreas.Sandberg@arm.com * modification, are permitted provided that the following conditions are 79347SAndreas.Sandberg@arm.com * met: redistributions of source code must retain the above copyright 89347SAndreas.Sandberg@arm.com * notice, this list of conditions and the following disclaimer; 99347SAndreas.Sandberg@arm.com * redistributions in binary form must reproduce the above copyright 109347SAndreas.Sandberg@arm.com * notice, this list of conditions and the following disclaimer in the 119347SAndreas.Sandberg@arm.com * documentation and/or other materials provided with the distribution; 129347SAndreas.Sandberg@arm.com * neither the name of the copyright holders nor the names of its 139347SAndreas.Sandberg@arm.com * contributors may be used to endorse or promote products derived from 142810Srdreslin@umich.edu * this software without specific prior written permission. 152810Srdreslin@umich.edu * 162810Srdreslin@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172810Srdreslin@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182810Srdreslin@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192810Srdreslin@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202810Srdreslin@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212810Srdreslin@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222810Srdreslin@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232810Srdreslin@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242810Srdreslin@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252810Srdreslin@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262810Srdreslin@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272810Srdreslin@umich.edu */ 282810Srdreslin@umich.edu 292810Srdreslin@umich.edu#ifndef __ARCH_ALPHA_ISA_TRAITS_HH__ 302810Srdreslin@umich.edu#define __ARCH_ALPHA_ISA_TRAITS_HH__ 312810Srdreslin@umich.edu 322810Srdreslin@umich.edunamespace LittleEndianGuest {} 332810Srdreslin@umich.eduusing namespace LittleEndianGuest; 342810Srdreslin@umich.edu 352810Srdreslin@umich.edu#include "arch/alpha/types.hh" 362810Srdreslin@umich.edu#include "arch/alpha/constants.hh" 372810Srdreslin@umich.edu#include "base/misc.hh" 382810Srdreslin@umich.edu#include "config/full_system.hh" 392810Srdreslin@umich.edu#include "sim/host.hh" 402810Srdreslin@umich.edu#include "sim/faults.hh" 412810Srdreslin@umich.edu 422810Srdreslin@umich.educlass ExecContext; 432810Srdreslin@umich.educlass FastCPU; 442810Srdreslin@umich.educlass FullCPU; 452810Srdreslin@umich.educlass Checkpoint; 462810Srdreslin@umich.edu 472810Srdreslin@umich.educlass StaticInst; 486216Snate@binkert.orgclass StaticInstPtr; 496216Snate@binkert.org 502810Srdreslin@umich.edu#if !FULL_SYSTEM 512810Srdreslin@umich.educlass SyscallReturn { 5211168Sandreas.hansson@arm.com public: 532810Srdreslin@umich.edu template <class T> 5411722Ssophiane.senni@gmail.com SyscallReturn(T v, bool s) 5511486Snikos.nikoleris@arm.com { 568229Snate@binkert.org retval = (uint64_t)v; 572810Srdreslin@umich.edu success = s; 589796Sprakash.ramrakhyani@arm.com } 592810Srdreslin@umich.edu 602810Srdreslin@umich.edu template <class T> 612810Srdreslin@umich.edu SyscallReturn(T v) 622810Srdreslin@umich.edu { 632810Srdreslin@umich.edu success = (v >= 0); 642810Srdreslin@umich.edu retval = (uint64_t)v; 652810Srdreslin@umich.edu } 662810Srdreslin@umich.edu 672810Srdreslin@umich.edu ~SyscallReturn() {} 682810Srdreslin@umich.edu 692810Srdreslin@umich.edu SyscallReturn& operator=(const SyscallReturn& s) { 702810Srdreslin@umich.edu retval = s.retval; 712810Srdreslin@umich.edu success = s.success; 722810Srdreslin@umich.edu return *this; 732810Srdreslin@umich.edu } 742810Srdreslin@umich.edu 752810Srdreslin@umich.edu bool successful() { return success; } 762810Srdreslin@umich.edu uint64_t value() { return retval; } 772810Srdreslin@umich.edu 782810Srdreslin@umich.edu 792810Srdreslin@umich.edu private: 802810Srdreslin@umich.edu uint64_t retval; 812810Srdreslin@umich.edu bool success; 822810Srdreslin@umich.edu}; 832810Srdreslin@umich.edu 842810Srdreslin@umich.edu#endif 852810Srdreslin@umich.edu 862810Srdreslin@umich.edunamespace AlphaISA 872810Srdreslin@umich.edu{ 882810Srdreslin@umich.edu 892810Srdreslin@umich.edu typedef IntReg IntRegFile[NumIntRegs]; 902810Srdreslin@umich.edu 912810Srdreslin@umich.edu typedef union { 922810Srdreslin@umich.edu uint64_t q[NumFloatRegs]; // integer qword view 936227Snate@binkert.org double d[NumFloatRegs]; // double-precision floating point view 942810Srdreslin@umich.edu } FloatRegFile; 952810Srdreslin@umich.edu 962810Srdreslin@umich.edu// redirected register map, really only used for the full system case. 972810Srdreslin@umich.eduextern const int reg_redir[NumIntRegs]; 982810Srdreslin@umich.edu 992810Srdreslin@umich.edu#if FULL_SYSTEM 1006227Snate@binkert.org 1012810Srdreslin@umich.edu#include "arch/alpha/isa_fullsys_traits.hh" 1022810Srdreslin@umich.edu 1032810Srdreslin@umich.edu#endif 1042810Srdreslin@umich.edu class MiscRegFile { 1052810Srdreslin@umich.edu protected: 1062810Srdreslin@umich.edu uint64_t fpcr; // floating point condition codes 1072810Srdreslin@umich.edu uint64_t uniq; // process-unique register 1082810Srdreslin@umich.edu bool lock_flag; // lock flag for LL/SC 1092810Srdreslin@umich.edu Addr lock_addr; // lock address for LL/SC 1102810Srdreslin@umich.edu 11111168Sandreas.hansson@arm.com public: 1122810Srdreslin@umich.edu MiscReg readReg(int misc_reg); 1132810Srdreslin@umich.edu 1142810Srdreslin@umich.edu //These functions should be removed once the simplescalar cpu model 1152810Srdreslin@umich.edu //has been replaced. 1162810Srdreslin@umich.edu int getInstAsid(); 1172810Srdreslin@umich.edu int getDataAsid(); 1182810Srdreslin@umich.edu 1192810Srdreslin@umich.edu MiscReg readRegWithEffect(int misc_reg, Fault &fault, ExecContext *xc); 1202810Srdreslin@umich.edu 1212810Srdreslin@umich.edu Fault setReg(int misc_reg, const MiscReg &val); 1222810Srdreslin@umich.edu 1232810Srdreslin@umich.edu Fault setRegWithEffect(int misc_reg, const MiscReg &val, 1242810Srdreslin@umich.edu ExecContext *xc); 1252810Srdreslin@umich.edu 1262810Srdreslin@umich.edu void copyMiscRegs(ExecContext *xc); 1272810Srdreslin@umich.edu 1282810Srdreslin@umich.edu#if FULL_SYSTEM 1292810Srdreslin@umich.edu protected: 1302810Srdreslin@umich.edu typedef uint64_t InternalProcReg; 1312810Srdreslin@umich.edu 1322810Srdreslin@umich.edu InternalProcReg ipr[NumInternalProcRegs]; // Internal processor regs 1332810Srdreslin@umich.edu 1342810Srdreslin@umich.edu private: 1352810Srdreslin@umich.edu InternalProcReg readIpr(int idx, Fault &fault, ExecContext *xc); 1362810Srdreslin@umich.edu 1372810Srdreslin@umich.edu Fault setIpr(int idx, InternalProcReg val, ExecContext *xc); 1382810Srdreslin@umich.edu 1392810Srdreslin@umich.edu void copyIprs(ExecContext *xc); 1402810Srdreslin@umich.edu#endif 1412810Srdreslin@umich.edu friend class RegFile; 1422810Srdreslin@umich.edu }; 1432810Srdreslin@umich.edu 1442810Srdreslin@umich.edu struct RegFile { 1452810Srdreslin@umich.edu IntRegFile intRegFile; // (signed) integer register file 1465999Snate@binkert.org FloatRegFile floatRegFile; // floating point register file 1472810Srdreslin@umich.edu MiscRegFile miscRegs; // control register file 1485999Snate@binkert.org Addr pc; // program counter 1492810Srdreslin@umich.edu Addr npc; // next-cycle program counter 1505999Snate@binkert.org Addr nnpc; 1512810Srdreslin@umich.edu 1522810Srdreslin@umich.edu#if FULL_SYSTEM 1532810Srdreslin@umich.edu int intrflag; // interrupt flag 1542810Srdreslin@umich.edu inline int instAsid() 1552810Srdreslin@umich.edu { return miscRegs.getInstAsid(); } 1562810Srdreslin@umich.edu inline int dataAsid() 1579796Sprakash.ramrakhyani@arm.com { return miscRegs.getDataAsid(); } 1589796Sprakash.ramrakhyani@arm.com#endif // FULL_SYSTEM 1599796Sprakash.ramrakhyani@arm.com 1602810Srdreslin@umich.edu void serialize(std::ostream &os); 1612810Srdreslin@umich.edu void unserialize(Checkpoint *cp, const std::string §ion); 1622810Srdreslin@umich.edu }; 1639796Sprakash.ramrakhyani@arm.com 1649086Sandreas.hansson@arm.com static inline ExtMachInst makeExtMI(MachInst inst, const uint64_t &pc); 1652810Srdreslin@umich.edu 1662810Srdreslin@umich.edu StaticInstPtr decodeInst(ExtMachInst); 1672810Srdreslin@umich.edu 1682810Srdreslin@umich.edu static inline bool isCallerSaveIntegerRegister(unsigned int reg) { 1692810Srdreslin@umich.edu panic("register classification not implemented"); 17011169Sandreas.hansson@arm.com return (reg >= 1 && reg <= 8 || reg >= 22 && reg <= 25 || reg == 27); 1712810Srdreslin@umich.edu } 1722810Srdreslin@umich.edu 1733862Sstever@eecs.umich.edu static inline bool isCalleeSaveIntegerRegister(unsigned int reg) { 1743862Sstever@eecs.umich.edu panic("register classification not implemented"); 1752810Srdreslin@umich.edu return (reg >= 9 && reg <= 15); 17611169Sandreas.hansson@arm.com } 1772810Srdreslin@umich.edu 1782810Srdreslin@umich.edu static inline bool isCallerSaveFloatRegister(unsigned int reg) { 17911483Snikos.nikoleris@arm.com panic("register classification not implemented"); 18011484Snikos.nikoleris@arm.com return false; 18111484Snikos.nikoleris@arm.com } 1825716Shsul@eecs.umich.edu 1832810Srdreslin@umich.edu static inline bool isCalleeSaveFloatRegister(unsigned int reg) { 18410028SGiacomo.Gabrielli@arm.com panic("register classification not implemented"); 1852810Srdreslin@umich.edu return false; 1862810Srdreslin@umich.edu } 1872810Srdreslin@umich.edu 1882810Srdreslin@umich.edu static inline Addr alignAddress(const Addr &addr, 18910815Sdavid.guillen@arm.com unsigned int nbytes) { 19011870Snikos.nikoleris@arm.com return (addr & ~(nbytes - 1)); 19110815Sdavid.guillen@arm.com } 19210815Sdavid.guillen@arm.com 19310815Sdavid.guillen@arm.com // Instruction address compression hooks 19410815Sdavid.guillen@arm.com static inline Addr realPCToFetchPC(const Addr &addr) { 19511870Snikos.nikoleris@arm.com return addr; 1962810Srdreslin@umich.edu } 1972810Srdreslin@umich.edu 1982810Srdreslin@umich.edu static inline Addr fetchPCToRealPC(const Addr &addr) { 1992810Srdreslin@umich.edu return addr; 20010028SGiacomo.Gabrielli@arm.com } 2012810Srdreslin@umich.edu 2022810Srdreslin@umich.edu // the size of "fetched" instructions (not necessarily the size 2032810Srdreslin@umich.edu // of real instructions for PISA) 20411169Sandreas.hansson@arm.com static inline size_t fetchInstSize() { 2052810Srdreslin@umich.edu return sizeof(MachInst); 2062810Srdreslin@umich.edu } 2072810Srdreslin@umich.edu 2082982Sstever@eecs.umich.edu static inline MachInst makeRegisterCopy(int dest, int src) { 2092810Srdreslin@umich.edu panic("makeRegisterCopy not implemented"); 2102810Srdreslin@umich.edu return 0; 21111169Sandreas.hansson@arm.com } 2125717Shsul@eecs.umich.edu 21311169Sandreas.hansson@arm.com // Machine operations 2142810Srdreslin@umich.edu 2152810Srdreslin@umich.edu void saveMachineReg(AnyReg &savereg, const RegFile ®_file, 21610941Sdavid.guillen@arm.com int regnum); 21710941Sdavid.guillen@arm.com 21810941Sdavid.guillen@arm.com void restoreMachineReg(RegFile ®s, const AnyReg ®, 21910941Sdavid.guillen@arm.com int regnum); 22010941Sdavid.guillen@arm.com 22111169Sandreas.hansson@arm.com#if 0 22210941Sdavid.guillen@arm.com static void serializeSpecialRegs(const Serializable::Proxy &proxy, 22310941Sdavid.guillen@arm.com const RegFile ®s); 2242810Srdreslin@umich.edu 2252810Srdreslin@umich.edu static void unserializeSpecialRegs(const IniFile *db, 2262810Srdreslin@umich.edu const std::string &category, 2272810Srdreslin@umich.edu ConfigNode *node, 2282810Srdreslin@umich.edu RegFile ®s); 22911169Sandreas.hansson@arm.com#endif 2302810Srdreslin@umich.edu 2312810Srdreslin@umich.edu /** 2322810Srdreslin@umich.edu * Function to insure ISA semantics about 0 registers. 2332810Srdreslin@umich.edu * @param xc The execution context. 2342810Srdreslin@umich.edu */ 2352810Srdreslin@umich.edu template <class XC> 2362810Srdreslin@umich.edu void zeroRegisters(XC *xc); 2372810Srdreslin@umich.edu 2382810Srdreslin@umich.edu#if !FULL_SYSTEM 23911169Sandreas.hansson@arm.com static inline void setSyscallReturn(SyscallReturn return_value, RegFile *regs) 2402810Srdreslin@umich.edu { 2412810Srdreslin@umich.edu // check for error condition. Alpha syscall convention is to 2422810Srdreslin@umich.edu // indicate success/failure in reg a3 (r19) and put the 2432810Srdreslin@umich.edu // return value itself in the standard return value reg (v0). 2442810Srdreslin@umich.edu if (return_value.successful()) { 24512574Sodanrc@yahoo.com.br // no error 24612574Sodanrc@yahoo.com.br regs->intRegFile[SyscallSuccessReg] = 0; 24712574Sodanrc@yahoo.com.br regs->intRegFile[ReturnValueReg] = return_value.value(); 2482810Srdreslin@umich.edu } else { 2492810Srdreslin@umich.edu // got an error, return details 25012574Sodanrc@yahoo.com.br regs->intRegFile[SyscallSuccessReg] = (IntReg) -1; 2512810Srdreslin@umich.edu regs->intRegFile[ReturnValueReg] = -return_value.value(); 25212574Sodanrc@yahoo.com.br } 2532810Srdreslin@umich.edu } 2547612SGene.Wu@arm.com#endif 2557612SGene.Wu@arm.com}; 2569663Suri.wiener@arm.com 2579663Suri.wiener@arm.comstatic inline AlphaISA::ExtMachInst 25811169Sandreas.hansson@arm.comAlphaISA::makeExtMI(AlphaISA::MachInst inst, const uint64_t &pc) { 2599663Suri.wiener@arm.com#if FULL_SYSTEM 2609663Suri.wiener@arm.com AlphaISA::ExtMachInst ext_inst = inst; 2619347SAndreas.Sandberg@arm.com if (pc && 0x1) 2629347SAndreas.Sandberg@arm.com return ext_inst|=(static_cast<AlphaISA::ExtMachInst>(pc & 0x1) << 32); 2639347SAndreas.Sandberg@arm.com else 2649347SAndreas.Sandberg@arm.com return ext_inst; 2659347SAndreas.Sandberg@arm.com#else 2669347SAndreas.Sandberg@arm.com return AlphaISA::ExtMachInst(inst); 2679347SAndreas.Sandberg@arm.com#endif 2689347SAndreas.Sandberg@arm.com} 2699347SAndreas.Sandberg@arm.com 2709347SAndreas.Sandberg@arm.com#endif // __ARCH_ALPHA_ISA_TRAITS_HH__ 2719347SAndreas.Sandberg@arm.com