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 &section);
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 &reg_file,
21610941Sdavid.guillen@arm.com                               int regnum);
21710941Sdavid.guillen@arm.com
21810941Sdavid.guillen@arm.com    void restoreMachineReg(RegFile &regs, const AnyReg &reg,
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 &regs);
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 &regs);
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