debug.isa revision 7087
15425Sgblack@eecs.umich.edu// Copyright (c) 2008 The Hewlett-Packard Development Company
25425Sgblack@eecs.umich.edu// All rights reserved.
35425Sgblack@eecs.umich.edu//
47087Snate@binkert.org// The license below extends only to copyright in the software and shall
57087Snate@binkert.org// not be construed as granting a license to any other intellectual
67087Snate@binkert.org// property including but not limited to intellectual property relating
77087Snate@binkert.org// to a hardware implementation of the functionality of the software
87087Snate@binkert.org// licensed hereunder.  You may use the software subject to the license
97087Snate@binkert.org// terms below provided that you ensure that this notice is replicated
107087Snate@binkert.org// unmodified and in its entirety in all distributions of the software,
117087Snate@binkert.org// modified or unmodified, in source code or in binary form.
125425Sgblack@eecs.umich.edu//
137087Snate@binkert.org// Redistribution and use in source and binary forms, with or without
147087Snate@binkert.org// modification, are permitted provided that the following conditions are
157087Snate@binkert.org// met: redistributions of source code must retain the above copyright
167087Snate@binkert.org// notice, this list of conditions and the following disclaimer;
177087Snate@binkert.org// redistributions in binary form must reproduce the above copyright
187087Snate@binkert.org// notice, this list of conditions and the following disclaimer in the
197087Snate@binkert.org// documentation and/or other materials provided with the distribution;
207087Snate@binkert.org// neither the name of the copyright holders nor the names of its
215425Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from
227087Snate@binkert.org// this software without specific prior written permission.
235425Sgblack@eecs.umich.edu//
245425Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
255425Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
265425Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
275425Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
285425Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
295425Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
305425Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
315425Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
325425Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
335425Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
345425Sgblack@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
355425Sgblack@eecs.umich.edu//
365425Sgblack@eecs.umich.edu// Authors: Gabe Black
375425Sgblack@eecs.umich.edu
385425Sgblack@eecs.umich.edu//////////////////////////////////////////////////////////////////////////
395425Sgblack@eecs.umich.edu//
405425Sgblack@eecs.umich.edu// Debug Microops
415425Sgblack@eecs.umich.edu//
425425Sgblack@eecs.umich.edu//////////////////////////////////////////////////////////////////////////
435425Sgblack@eecs.umich.edu
445425Sgblack@eecs.umich.eduoutput header {{
455425Sgblack@eecs.umich.edu    class MicroDebugBase : public X86ISA::X86MicroopBase
465425Sgblack@eecs.umich.edu    {
475425Sgblack@eecs.umich.edu      protected:
485425Sgblack@eecs.umich.edu        std::string message;
495425Sgblack@eecs.umich.edu        uint8_t cc;
505425Sgblack@eecs.umich.edu
515425Sgblack@eecs.umich.edu      public:
525425Sgblack@eecs.umich.edu        MicroDebugBase(ExtMachInst _machInst, const char * mnem,
535425Sgblack@eecs.umich.edu                const char * instMnem,
545425Sgblack@eecs.umich.edu                bool isMicro, bool isDelayed, bool isFirst, bool isLast,
555425Sgblack@eecs.umich.edu                std::string _message, uint8_t _cc);
565425Sgblack@eecs.umich.edu
575425Sgblack@eecs.umich.edu        MicroDebugBase(ExtMachInst _machInst, const char * mnem,
585425Sgblack@eecs.umich.edu                const char * instMnem, std::string _message, uint8_t _cc);
595425Sgblack@eecs.umich.edu
605425Sgblack@eecs.umich.edu        std::string generateDisassembly(Addr pc,
615425Sgblack@eecs.umich.edu                const SymbolTable *symtab) const;
625425Sgblack@eecs.umich.edu    };
635425Sgblack@eecs.umich.edu}};
645425Sgblack@eecs.umich.edu
655425Sgblack@eecs.umich.edudef template MicroDebugDeclare {{
665425Sgblack@eecs.umich.edu    class %(class_name)s : public %(base_class)s
675425Sgblack@eecs.umich.edu    {
685425Sgblack@eecs.umich.edu      private:
695425Sgblack@eecs.umich.edu        void buildMe();
705425Sgblack@eecs.umich.edu      public:
715425Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst _machInst, const char * instMnem,
725425Sgblack@eecs.umich.edu                bool isMicro, bool isDelayed, bool isFirst, bool isLast,
735425Sgblack@eecs.umich.edu                std::string _message, uint8_t _cc);
745425Sgblack@eecs.umich.edu
755425Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst _machInst, const char * instMnem,
765425Sgblack@eecs.umich.edu                std::string _message, uint8_t _cc);
775425Sgblack@eecs.umich.edu
785425Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
795425Sgblack@eecs.umich.edu    };
805425Sgblack@eecs.umich.edu}};
815425Sgblack@eecs.umich.edu
825425Sgblack@eecs.umich.edudef template MicroDebugExecute {{
835425Sgblack@eecs.umich.edu        Fault %(class_name)s::execute(%(CPU_exec_context)s *xc,
845425Sgblack@eecs.umich.edu                Trace::InstRecord *traceData) const
855425Sgblack@eecs.umich.edu        {
865425Sgblack@eecs.umich.edu            %(op_decl)s
875425Sgblack@eecs.umich.edu            %(op_rd)s
885425Sgblack@eecs.umich.edu            if (%(cond_test)s) {
895591Sgblack@eecs.umich.edu                %(func)s("%s\n", message);
905425Sgblack@eecs.umich.edu            }
915425Sgblack@eecs.umich.edu            return NoFault;
925425Sgblack@eecs.umich.edu        }
935425Sgblack@eecs.umich.edu}};
945425Sgblack@eecs.umich.edu
955425Sgblack@eecs.umich.eduoutput decoder {{
965425Sgblack@eecs.umich.edu    inline MicroDebugBase::MicroDebugBase(
975425Sgblack@eecs.umich.edu            ExtMachInst machInst, const char * mnem, const char * instMnem,
985425Sgblack@eecs.umich.edu            std::string _message, uint8_t _cc) :
995425Sgblack@eecs.umich.edu        X86MicroopBase(machInst, mnem, instMnem,
1005425Sgblack@eecs.umich.edu                false, false, false, false, No_OpClass),
1015425Sgblack@eecs.umich.edu        message(_message), cc(_cc)
1025425Sgblack@eecs.umich.edu    {
1035425Sgblack@eecs.umich.edu    }
1045425Sgblack@eecs.umich.edu
1055425Sgblack@eecs.umich.edu    inline MicroDebugBase::MicroDebugBase(
1065425Sgblack@eecs.umich.edu            ExtMachInst machInst, const char * mnem, const char * instMnem,
1075425Sgblack@eecs.umich.edu            bool isMicro, bool isDelayed, bool isFirst, bool isLast,
1085425Sgblack@eecs.umich.edu            std::string _message, uint8_t _cc) :
1095425Sgblack@eecs.umich.edu        X86MicroopBase(machInst, mnem, instMnem,
1105425Sgblack@eecs.umich.edu                isMicro, isDelayed, isFirst, isLast, No_OpClass),
1115425Sgblack@eecs.umich.edu                message(_message), cc(_cc)
1125425Sgblack@eecs.umich.edu    {
1135425Sgblack@eecs.umich.edu    }
1145425Sgblack@eecs.umich.edu}};
1155425Sgblack@eecs.umich.edu
1165425Sgblack@eecs.umich.edudef template MicroDebugConstructor {{
1175425Sgblack@eecs.umich.edu
1185425Sgblack@eecs.umich.edu    inline void %(class_name)s::buildMe()
1195425Sgblack@eecs.umich.edu    {
1205425Sgblack@eecs.umich.edu        %(constructor)s;
1215425Sgblack@eecs.umich.edu    }
1225425Sgblack@eecs.umich.edu
1235425Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(
1245425Sgblack@eecs.umich.edu            ExtMachInst machInst, const char * instMnem,
1255425Sgblack@eecs.umich.edu            std::string _message, uint8_t _cc) :
1265425Sgblack@eecs.umich.edu        %(base_class)s(machInst, "%(func)s", instMnem, _message, _cc)
1275425Sgblack@eecs.umich.edu    {
1285425Sgblack@eecs.umich.edu        buildMe();
1295425Sgblack@eecs.umich.edu    }
1305425Sgblack@eecs.umich.edu
1315425Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(
1325425Sgblack@eecs.umich.edu            ExtMachInst machInst, const char * instMnem,
1335425Sgblack@eecs.umich.edu            bool isMicro, bool isDelayed, bool isFirst, bool isLast,
1345425Sgblack@eecs.umich.edu            std::string _message, uint8_t _cc) :
1355425Sgblack@eecs.umich.edu        %(base_class)s(machInst, "%(func)s", instMnem,
1365425Sgblack@eecs.umich.edu                isMicro, isDelayed, isFirst, isLast, _message, _cc)
1375425Sgblack@eecs.umich.edu    {
1385425Sgblack@eecs.umich.edu        buildMe();
1395425Sgblack@eecs.umich.edu    }
1405425Sgblack@eecs.umich.edu}};
1415425Sgblack@eecs.umich.edu
1425425Sgblack@eecs.umich.eduoutput decoder {{
1435425Sgblack@eecs.umich.edu    std::string MicroDebugBase::generateDisassembly(Addr pc,
1445425Sgblack@eecs.umich.edu            const SymbolTable *symtab) const
1455425Sgblack@eecs.umich.edu    {
1465425Sgblack@eecs.umich.edu        std::stringstream response;
1475425Sgblack@eecs.umich.edu
1485425Sgblack@eecs.umich.edu        printMnemonic(response, instMnem, mnemonic);
1495425Sgblack@eecs.umich.edu        response << "\"" << message << "\"";
1505425Sgblack@eecs.umich.edu
1515425Sgblack@eecs.umich.edu        return response.str();
1525425Sgblack@eecs.umich.edu    }
1535425Sgblack@eecs.umich.edu}};
1545425Sgblack@eecs.umich.edu
1555425Sgblack@eecs.umich.edulet {{
1565425Sgblack@eecs.umich.edu    class MicroDebug(X86Microop):
1575425Sgblack@eecs.umich.edu        def __init__(self, message, flags=None):
1585425Sgblack@eecs.umich.edu            self.message = message
1595425Sgblack@eecs.umich.edu            if flags:
1605425Sgblack@eecs.umich.edu                if not isinstance(flags, (list, tuple)):
1615425Sgblack@eecs.umich.edu                    raise Exception, "flags must be a list or tuple of flags"
1625425Sgblack@eecs.umich.edu                self.cond = " | ".join(flags)
1635425Sgblack@eecs.umich.edu                self.className += "Flags"
1645425Sgblack@eecs.umich.edu            else:
1655425Sgblack@eecs.umich.edu                self.cond = "0"
1665425Sgblack@eecs.umich.edu
1675425Sgblack@eecs.umich.edu        def getAllocator(self, *microFlags):
1685788Sgblack@eecs.umich.edu            allocator = '''new %(class_name)s(machInst, macrocodeBlock
1695425Sgblack@eecs.umich.edu                    %(flags)s, "%(message)s", %(cc)s)''' % {
1705425Sgblack@eecs.umich.edu                "class_name" : self.className,
1715425Sgblack@eecs.umich.edu                "flags" : self.microFlagsText(microFlags),
1725425Sgblack@eecs.umich.edu                "message" : self.message,
1735425Sgblack@eecs.umich.edu                "cc" : self.cond}
1745425Sgblack@eecs.umich.edu            return allocator
1755425Sgblack@eecs.umich.edu
1765425Sgblack@eecs.umich.edu    exec_output = ""
1775425Sgblack@eecs.umich.edu    header_output = ""
1785425Sgblack@eecs.umich.edu    decoder_output = ""
1795425Sgblack@eecs.umich.edu
1805425Sgblack@eecs.umich.edu    def buildDebugMicro(func):
1815425Sgblack@eecs.umich.edu        global exec_output, header_output, decoder_output
1825425Sgblack@eecs.umich.edu
1835425Sgblack@eecs.umich.edu        iop = InstObjParams(func, "Micro%sFlags" % func.capitalize(),
1845425Sgblack@eecs.umich.edu                "MicroDebugBase",
1855425Sgblack@eecs.umich.edu                {"code": "",
1865425Sgblack@eecs.umich.edu                 "func": func,
1875425Sgblack@eecs.umich.edu                 "cond_test": "checkCondition(ccFlagBits, cc)"})
1885425Sgblack@eecs.umich.edu        exec_output += MicroDebugExecute.subst(iop)
1895425Sgblack@eecs.umich.edu        header_output += MicroDebugDeclare.subst(iop)
1905425Sgblack@eecs.umich.edu        decoder_output += MicroDebugConstructor.subst(iop)
1915425Sgblack@eecs.umich.edu
1925425Sgblack@eecs.umich.edu        iop = InstObjParams(func, "Micro%s" % func.capitalize(),
1935425Sgblack@eecs.umich.edu                "MicroDebugBase",
1945425Sgblack@eecs.umich.edu                {"code": "",
1955425Sgblack@eecs.umich.edu                 "func": func,
1965425Sgblack@eecs.umich.edu                 "cond_test": "true"})
1975425Sgblack@eecs.umich.edu        exec_output += MicroDebugExecute.subst(iop)
1985425Sgblack@eecs.umich.edu        header_output += MicroDebugDeclare.subst(iop)
1995425Sgblack@eecs.umich.edu        decoder_output += MicroDebugConstructor.subst(iop)
2005425Sgblack@eecs.umich.edu
2015425Sgblack@eecs.umich.edu        class MicroDebugChild(MicroDebug):
2025425Sgblack@eecs.umich.edu            className = "Micro%s" % func.capitalize()
2035425Sgblack@eecs.umich.edu
2045425Sgblack@eecs.umich.edu        global microopClasses
2055425Sgblack@eecs.umich.edu        microopClasses[func] = MicroDebugChild
2065425Sgblack@eecs.umich.edu
2075425Sgblack@eecs.umich.edu    buildDebugMicro("panic")
2085425Sgblack@eecs.umich.edu    buildDebugMicro("fatal")
2095425Sgblack@eecs.umich.edu    buildDebugMicro("warn")
2105425Sgblack@eecs.umich.edu    buildDebugMicro("warn_once")
2115425Sgblack@eecs.umich.edu}};
212