pal.isa revision 7799
16019SN/A// -*- mode:c++ -*-
26019SN/A
37134Sgblack@eecs.umich.edu// Copyright (c) 2003-2005 The Regents of The University of Michigan
47134Sgblack@eecs.umich.edu// All rights reserved.
57134Sgblack@eecs.umich.edu//
67134Sgblack@eecs.umich.edu// Redistribution and use in source and binary forms, with or without
77134Sgblack@eecs.umich.edu// modification, are permitted provided that the following conditions are
87134Sgblack@eecs.umich.edu// met: redistributions of source code must retain the above copyright
97134Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer;
107134Sgblack@eecs.umich.edu// redistributions in binary form must reproduce the above copyright
117134Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer in the
127134Sgblack@eecs.umich.edu// documentation and/or other materials provided with the distribution;
137134Sgblack@eecs.umich.edu// neither the name of the copyright holders nor the names of its
147134Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from
156019SN/A// this software without specific prior written permission.
166019SN/A//
176019SN/A// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
186019SN/A// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
196019SN/A// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
206019SN/A// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
216019SN/A// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
226019SN/A// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
236019SN/A// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
246019SN/A// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
256019SN/A// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
266019SN/A// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
276019SN/A// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
286019SN/A//
296019SN/A// Authors: Steve Reinhardt
306019SN/A
316019SN/A////////////////////////////////////////////////////////////////////
326019SN/A//
336019SN/A// PAL calls & PAL-specific instructions
346019SN/A//
356019SN/A
366019SN/Aoutput header {{
376019SN/A    /**
386019SN/A     * Base class for emulated call_pal calls (used only in
396019SN/A     * non-full-system mode).
406019SN/A     */
416019SN/A    class EmulatedCallPal : public AlphaStaticInst
426308SN/A    {
436308SN/A      protected:
446309SN/A
456309SN/A        /// Constructor.
466309SN/A        EmulatedCallPal(const char *mnem, ExtMachInst _machInst,
476309SN/A                        OpClass __opClass)
486309SN/A            : AlphaStaticInst(mnem, _machInst, __opClass)
497134Sgblack@eecs.umich.edu        {
507296Sgblack@eecs.umich.edu        }
516309SN/A
526309SN/A        std::string
537296Sgblack@eecs.umich.edu        generateDisassembly(Addr pc, const SymbolTable *symtab) const;
548139SMatt.Horsnell@arm.com    };
556309SN/A}};
566309SN/A
576309SN/Aoutput decoder {{
587342Sgblack@eecs.umich.edu    std::string
597174Sgblack@eecs.umich.edu    EmulatedCallPal::generateDisassembly(Addr pc,
607639Sgblack@eecs.umich.edu                                         const SymbolTable *symtab) const
617639Sgblack@eecs.umich.edu    {
627644Sali.saidi@arm.com#ifdef SS_COMPATIBLE_DISASSEMBLY
638139SMatt.Horsnell@arm.com        return csprintf("%s %s", "call_pal", mnemonic);
647639Sgblack@eecs.umich.edu#else
657639Sgblack@eecs.umich.edu        return csprintf("%-10s %s", "call_pal", mnemonic);
667639Sgblack@eecs.umich.edu#endif
677639Sgblack@eecs.umich.edu    }
687639Sgblack@eecs.umich.edu}};
697639Sgblack@eecs.umich.edu
707639Sgblack@eecs.umich.edudef format EmulatedCallPal(code, *flags) {{
717644Sali.saidi@arm.com    iop = InstObjParams(name, Name, 'EmulatedCallPal', code, flags)
728139SMatt.Horsnell@arm.com    header_output = BasicDeclare.subst(iop)
737639Sgblack@eecs.umich.edu    decoder_output = BasicConstructor.subst(iop)
747639Sgblack@eecs.umich.edu    decode_block = BasicDecode.subst(iop)
757639Sgblack@eecs.umich.edu    exec_output = BasicExecute.subst(iop)
767639Sgblack@eecs.umich.edu}};
777639Sgblack@eecs.umich.edu
787639Sgblack@eecs.umich.eduoutput header {{
797639Sgblack@eecs.umich.edu    /**
807639Sgblack@eecs.umich.edu     * Base class for full-system-mode call_pal instructions.
817639Sgblack@eecs.umich.edu     * Probably could turn this into a leaf class and get rid of the
827644Sali.saidi@arm.com     * parser template.
838139SMatt.Horsnell@arm.com     */
847639Sgblack@eecs.umich.edu    class CallPalBase : public AlphaStaticInst
857639Sgblack@eecs.umich.edu    {
867639Sgblack@eecs.umich.edu      protected:
877639Sgblack@eecs.umich.edu        int palFunc;    ///< Function code part of instruction
887174Sgblack@eecs.umich.edu        int palOffset;  ///< Target PC, offset from IPR_PAL_BASE
898148SAli.Saidi@ARM.com        bool palValid;  ///< is the function code valid?
907296Sgblack@eecs.umich.edu        bool palPriv;   ///< is this call privileged?
917400SAli.Saidi@ARM.com
927134Sgblack@eecs.umich.edu        /// Constructor.
937400SAli.Saidi@ARM.com        CallPalBase(const char *mnem, ExtMachInst _machInst,
947134Sgblack@eecs.umich.edu                    OpClass __opClass);
957134Sgblack@eecs.umich.edu
968148SAli.Saidi@ARM.com        std::string
978205SAli.Saidi@ARM.com        generateDisassembly(Addr pc, const SymbolTable *symtab) const;
987858SMatt.Horsnell@arm.com    };
996754SN/A}};
1008148SAli.Saidi@ARM.com
1016754SN/Aoutput decoder {{
1026754SN/A    inline
1038148SAli.Saidi@ARM.com    CallPalBase::CallPalBase(const char *mnem, ExtMachInst _machInst,
1048148SAli.Saidi@ARM.com                             OpClass __opClass)
1056754SN/A        : AlphaStaticInst(mnem, _machInst, __opClass),
1068139SMatt.Horsnell@arm.com        palFunc(PALFUNC)
1077422Sgblack@eecs.umich.edu    {
1088148SAli.Saidi@ARM.com        // From the 21164 HRM (paraphrased):
1098148SAli.Saidi@ARM.com        // Bit 7 of the function code (mask 0x80) indicates
1106754SN/A        // whether the call is privileged (bit 7 == 0) or
1118139SMatt.Horsnell@arm.com        // unprivileged (bit 7 == 1).  The privileged call table
1126309SN/A        // starts at 0x2000, the unprivielged call table starts at
1136309SN/A        // 0x3000.  Bits 5-0 (mask 0x3f) are used to calculate the
1147296Sgblack@eecs.umich.edu        // offset.
1157303Sgblack@eecs.umich.edu        const int palPrivMask = 0x80;
1168139SMatt.Horsnell@arm.com        const int palOffsetMask = 0x3f;
1176309SN/A
1186309SN/A        // Pal call is invalid unless all other bits are 0
1196309SN/A        palValid = ((machInst & ~(palPrivMask | palOffsetMask)) == 0);
1207296Sgblack@eecs.umich.edu        palPriv = ((machInst & palPrivMask) == 0);
1217174Sgblack@eecs.umich.edu        int shortPalFunc = (machInst & palOffsetMask);
1227174Sgblack@eecs.umich.edu        // Add 1 to base to set pal-mode bit
1237296Sgblack@eecs.umich.edu        palOffset = (palPriv ? 0x2001 : 0x3001) + (shortPalFunc << 6);
1247303Sgblack@eecs.umich.edu    }
1257644Sali.saidi@arm.com
1268139SMatt.Horsnell@arm.com    std::string
1277174Sgblack@eecs.umich.edu    CallPalBase::generateDisassembly(Addr pc, const SymbolTable *symtab) const
1287174Sgblack@eecs.umich.edu    {
1297174Sgblack@eecs.umich.edu        return csprintf("%-10s %#x", "call_pal", palFunc);
1307639Sgblack@eecs.umich.edu    }
1317639Sgblack@eecs.umich.edu}};
1327639Sgblack@eecs.umich.edu
1337639Sgblack@eecs.umich.edudef format CallPal(code, *flags) {{
1347639Sgblack@eecs.umich.edu    iop = InstObjParams(name, Name, 'CallPalBase', code, flags)
1357644Sali.saidi@arm.com    header_output = BasicDeclare.subst(iop)
1368139SMatt.Horsnell@arm.com    decoder_output = BasicConstructor.subst(iop)
1377639Sgblack@eecs.umich.edu    decode_block = BasicDecode.subst(iop)
1387639Sgblack@eecs.umich.edu    exec_output = BasicExecute.subst(iop)
1397639Sgblack@eecs.umich.edu}};
1407639Sgblack@eecs.umich.edu
1417639Sgblack@eecs.umich.edu////////////////////////////////////////////////////////////////////
1427639Sgblack@eecs.umich.edu//
1437639Sgblack@eecs.umich.edu// hw_ld, hw_st
1447639Sgblack@eecs.umich.edu//
1457639Sgblack@eecs.umich.edu
1467639Sgblack@eecs.umich.eduoutput header {{
1477644Sali.saidi@arm.com    /**
1488139SMatt.Horsnell@arm.com     * Base class for hw_ld and hw_st.
1497639Sgblack@eecs.umich.edu     */
1507639Sgblack@eecs.umich.edu    class HwLoadStore : public Memory
1517639Sgblack@eecs.umich.edu    {
1527639Sgblack@eecs.umich.edu      protected:
1537639Sgblack@eecs.umich.edu
1547174Sgblack@eecs.umich.edu        /// Displacement for EA calculation (signed).
1557174Sgblack@eecs.umich.edu        int16_t disp;
1567639Sgblack@eecs.umich.edu
1577639Sgblack@eecs.umich.edu        /// Constructor
1587639Sgblack@eecs.umich.edu        HwLoadStore(const char *mnem, ExtMachInst _machInst, OpClass __opClass);
1597639Sgblack@eecs.umich.edu
1607174Sgblack@eecs.umich.edu        std::string
1617174Sgblack@eecs.umich.edu        generateDisassembly(Addr pc, const SymbolTable *symtab) const;
1627174Sgblack@eecs.umich.edu    };
1637174Sgblack@eecs.umich.edu}};
1647174Sgblack@eecs.umich.edu
1657174Sgblack@eecs.umich.edu
1667174Sgblack@eecs.umich.eduoutput decoder {{
1677174Sgblack@eecs.umich.edu    inline
1687174Sgblack@eecs.umich.edu    HwLoadStore::HwLoadStore(const char *mnem, ExtMachInst _machInst,
1697174Sgblack@eecs.umich.edu                             OpClass __opClass)
1707174Sgblack@eecs.umich.edu        : Memory(mnem, _machInst, __opClass), disp(HW_LDST_DISP)
1716309SN/A    {
1726308SN/A        memAccessFlags.clear();
1737639Sgblack@eecs.umich.edu        if (HW_LDST_PHYS) memAccessFlags.set(Request::PHYSICAL);
1747639Sgblack@eecs.umich.edu        if (HW_LDST_ALT)  memAccessFlags.set(Request::ALTMODE);
1757639Sgblack@eecs.umich.edu        if (HW_LDST_VPTE) memAccessFlags.set(Request::VPTE);
1768139SMatt.Horsnell@arm.com        if (HW_LDST_LOCK) memAccessFlags.set(Request::LLSC);
1777639Sgblack@eecs.umich.edu    }
1787639Sgblack@eecs.umich.edu
1797639Sgblack@eecs.umich.edu    std::string
1807639Sgblack@eecs.umich.edu    HwLoadStore::generateDisassembly(Addr pc, const SymbolTable *symtab) const
1817639Sgblack@eecs.umich.edu    {
1827639Sgblack@eecs.umich.edu#ifdef SS_COMPATIBLE_DISASSEMBLY
1837639Sgblack@eecs.umich.edu        return csprintf("%-10s r%d,%d(r%d)", mnemonic, RA, disp, RB);
1847639Sgblack@eecs.umich.edu#else
1857639Sgblack@eecs.umich.edu        // HW_LDST_LOCK and HW_LDST_COND are the same bit.
1867639Sgblack@eecs.umich.edu        const char *lock_str =
1877639Sgblack@eecs.umich.edu            (HW_LDST_LOCK) ? (flags[IsLoad] ? ",LOCK" : ",COND") : "";
1887639Sgblack@eecs.umich.edu
1897639Sgblack@eecs.umich.edu        return csprintf("%-10s r%d,%d(r%d)%s%s%s%s%s",
1907639Sgblack@eecs.umich.edu                        mnemonic, RA, disp, RB,
1917639Sgblack@eecs.umich.edu                        HW_LDST_PHYS ? ",PHYS" : "",
1927639Sgblack@eecs.umich.edu                        HW_LDST_ALT ? ",ALT" : "",
1937639Sgblack@eecs.umich.edu                        HW_LDST_QUAD ? ",QUAD" : "",
1947639Sgblack@eecs.umich.edu                        HW_LDST_VPTE ? ",VPTE" : "",
1957639Sgblack@eecs.umich.edu                        lock_str);
1967639Sgblack@eecs.umich.edu#endif
1977639Sgblack@eecs.umich.edu    }
1987639Sgblack@eecs.umich.edu}};
1997639Sgblack@eecs.umich.edu
2007639Sgblack@eecs.umich.edudef format HwLoad(ea_code, memacc_code, class_ext, *flags) {{
2017639Sgblack@eecs.umich.edu    (header_output, decoder_output, decode_block, exec_output) = \
2027639Sgblack@eecs.umich.edu        LoadStoreBase(name, Name + class_ext, ea_code, memacc_code,
2037639Sgblack@eecs.umich.edu                      mem_flags = [], inst_flags = flags,
2047639Sgblack@eecs.umich.edu                      base_class = 'HwLoadStore', exec_template_base = 'Load')
2057639Sgblack@eecs.umich.edu}};
2067639Sgblack@eecs.umich.edu
2077639Sgblack@eecs.umich.edu
2087639Sgblack@eecs.umich.edudef format HwStore(ea_code, memacc_code, class_ext, *flags) {{
2097639Sgblack@eecs.umich.edu    (header_output, decoder_output, decode_block, exec_output) = \
2107639Sgblack@eecs.umich.edu        LoadStoreBase(name, Name + class_ext, ea_code, memacc_code,
2117639Sgblack@eecs.umich.edu                      mem_flags = [], inst_flags = flags,
2127639Sgblack@eecs.umich.edu                      base_class = 'HwLoadStore', exec_template_base = 'Store')
2137639Sgblack@eecs.umich.edu}};
2147639Sgblack@eecs.umich.edu
2157639Sgblack@eecs.umich.edu
2167639Sgblack@eecs.umich.edudef format HwStoreCond(ea_code, memacc_code, postacc_code, class_ext,
2177639Sgblack@eecs.umich.edu                       *flags) {{
2187639Sgblack@eecs.umich.edu    (header_output, decoder_output, decode_block, exec_output) = \
2197639Sgblack@eecs.umich.edu        LoadStoreBase(name, Name + class_ext, ea_code, memacc_code,
2207639Sgblack@eecs.umich.edu                      postacc_code, mem_flags = [], inst_flags = flags,
2217639Sgblack@eecs.umich.edu                      base_class = 'HwLoadStore')
2227639Sgblack@eecs.umich.edu}};
2237639Sgblack@eecs.umich.edu
2247639Sgblack@eecs.umich.edu
2257639Sgblack@eecs.umich.eduoutput header {{
2267639Sgblack@eecs.umich.edu    /**
2277639Sgblack@eecs.umich.edu     * Base class for hw_mfpr and hw_mtpr.
2287639Sgblack@eecs.umich.edu     */
2297639Sgblack@eecs.umich.edu    class HwMoveIPR : public AlphaStaticInst
2307639Sgblack@eecs.umich.edu    {
2317644Sali.saidi@arm.com      protected:
2327639Sgblack@eecs.umich.edu        /// Index of internal processor register.
2337639Sgblack@eecs.umich.edu        int ipr_index;
2347639Sgblack@eecs.umich.edu
2357639Sgblack@eecs.umich.edu        /// Constructor
2367639Sgblack@eecs.umich.edu        HwMoveIPR(const char *mnem, ExtMachInst _machInst, OpClass __opClass)
2377639Sgblack@eecs.umich.edu            : AlphaStaticInst(mnem, _machInst, __opClass),
2387639Sgblack@eecs.umich.edu              ipr_index(HW_IPR_IDX)
2397639Sgblack@eecs.umich.edu        {
2407644Sali.saidi@arm.com        }
2417639Sgblack@eecs.umich.edu
2427639Sgblack@eecs.umich.edu        std::string
2437639Sgblack@eecs.umich.edu        generateDisassembly(Addr pc, const SymbolTable *symtab) const;
2447639Sgblack@eecs.umich.edu    };
2457639Sgblack@eecs.umich.edu}};
2467639Sgblack@eecs.umich.edu
2477639Sgblack@eecs.umich.eduoutput decoder {{
2487639Sgblack@eecs.umich.edu    std::string
2497639Sgblack@eecs.umich.edu    HwMoveIPR::generateDisassembly(Addr pc, const SymbolTable *symtab) const
2507639Sgblack@eecs.umich.edu    {
2517639Sgblack@eecs.umich.edu        if (_numSrcRegs > 0) {
2527639Sgblack@eecs.umich.edu            // must be mtpr
2537639Sgblack@eecs.umich.edu            return csprintf("%-10s r%d,IPR(%#x)",
2547639Sgblack@eecs.umich.edu                            mnemonic, RA, ipr_index);
2557639Sgblack@eecs.umich.edu        }
2567639Sgblack@eecs.umich.edu        else {
2577639Sgblack@eecs.umich.edu            // must be mfpr
2587639Sgblack@eecs.umich.edu            return csprintf("%-10s IPR(%#x),r%d",
2597639Sgblack@eecs.umich.edu                            mnemonic, ipr_index, RA);
2607639Sgblack@eecs.umich.edu        }
2617639Sgblack@eecs.umich.edu    }
2627639Sgblack@eecs.umich.edu}};
2637639Sgblack@eecs.umich.edu
2647639Sgblack@eecs.umich.edudef format HwMoveIPR(code, *flags) {{
2657639Sgblack@eecs.umich.edu    all_flags = ['IprAccessOp']
2667639Sgblack@eecs.umich.edu    all_flags += flags
2677639Sgblack@eecs.umich.edu    iop = InstObjParams(name, Name, 'HwMoveIPR', code, all_flags)
2687639Sgblack@eecs.umich.edu    header_output = BasicDeclare.subst(iop)
2697639Sgblack@eecs.umich.edu    decoder_output = BasicConstructor.subst(iop)
2707639Sgblack@eecs.umich.edu    decode_block = BasicDecode.subst(iop)
2717639Sgblack@eecs.umich.edu    exec_output = BasicExecute.subst(iop)
2727639Sgblack@eecs.umich.edu}};
2737639Sgblack@eecs.umich.edu
2747639Sgblack@eecs.umich.edu
2757639Sgblack@eecs.umich.edu