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