debug.isa revision 7620
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,
537620Sgblack@eecs.umich.edu                const char * instMnem, uint64_t setFlags,
545425Sgblack@eecs.umich.edu                std::string _message, uint8_t _cc);
555425Sgblack@eecs.umich.edu
565425Sgblack@eecs.umich.edu        MicroDebugBase(ExtMachInst _machInst, const char * mnem,
575425Sgblack@eecs.umich.edu                const char * instMnem, std::string _message, uint8_t _cc);
585425Sgblack@eecs.umich.edu
595425Sgblack@eecs.umich.edu        std::string generateDisassembly(Addr pc,
605425Sgblack@eecs.umich.edu                const SymbolTable *symtab) const;
615425Sgblack@eecs.umich.edu    };
625425Sgblack@eecs.umich.edu}};
635425Sgblack@eecs.umich.edu
645425Sgblack@eecs.umich.edudef template MicroDebugDeclare {{
655425Sgblack@eecs.umich.edu    class %(class_name)s : public %(base_class)s
665425Sgblack@eecs.umich.edu    {
675425Sgblack@eecs.umich.edu      private:
685425Sgblack@eecs.umich.edu        void buildMe();
695425Sgblack@eecs.umich.edu      public:
705425Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst _machInst, const char * instMnem,
717620Sgblack@eecs.umich.edu                uint64_t setFlags, std::string _message, uint8_t _cc);
725425Sgblack@eecs.umich.edu
735425Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst _machInst, const char * instMnem,
745425Sgblack@eecs.umich.edu                std::string _message, uint8_t _cc);
755425Sgblack@eecs.umich.edu
765425Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
775425Sgblack@eecs.umich.edu    };
785425Sgblack@eecs.umich.edu}};
795425Sgblack@eecs.umich.edu
805425Sgblack@eecs.umich.edudef template MicroDebugExecute {{
815425Sgblack@eecs.umich.edu        Fault %(class_name)s::execute(%(CPU_exec_context)s *xc,
825425Sgblack@eecs.umich.edu                Trace::InstRecord *traceData) const
835425Sgblack@eecs.umich.edu        {
845425Sgblack@eecs.umich.edu            %(op_decl)s
855425Sgblack@eecs.umich.edu            %(op_rd)s
865425Sgblack@eecs.umich.edu            if (%(cond_test)s) {
875591Sgblack@eecs.umich.edu                %(func)s("%s\n", message);
885425Sgblack@eecs.umich.edu            }
895425Sgblack@eecs.umich.edu            return NoFault;
905425Sgblack@eecs.umich.edu        }
915425Sgblack@eecs.umich.edu}};
925425Sgblack@eecs.umich.edu
935425Sgblack@eecs.umich.eduoutput decoder {{
945425Sgblack@eecs.umich.edu    inline MicroDebugBase::MicroDebugBase(
955425Sgblack@eecs.umich.edu            ExtMachInst machInst, const char * mnem, const char * instMnem,
965425Sgblack@eecs.umich.edu            std::string _message, uint8_t _cc) :
977620Sgblack@eecs.umich.edu        X86MicroopBase(machInst, mnem, instMnem, 0, No_OpClass),
985425Sgblack@eecs.umich.edu        message(_message), cc(_cc)
995425Sgblack@eecs.umich.edu    {
1005425Sgblack@eecs.umich.edu    }
1015425Sgblack@eecs.umich.edu
1025425Sgblack@eecs.umich.edu    inline MicroDebugBase::MicroDebugBase(
1035425Sgblack@eecs.umich.edu            ExtMachInst machInst, const char * mnem, const char * instMnem,
1047620Sgblack@eecs.umich.edu            uint64_t setFlags, std::string _message, uint8_t _cc) :
1055425Sgblack@eecs.umich.edu        X86MicroopBase(machInst, mnem, instMnem,
1067620Sgblack@eecs.umich.edu                setFlags, No_OpClass),
1075425Sgblack@eecs.umich.edu                message(_message), cc(_cc)
1085425Sgblack@eecs.umich.edu    {
1095425Sgblack@eecs.umich.edu    }
1105425Sgblack@eecs.umich.edu}};
1115425Sgblack@eecs.umich.edu
1125425Sgblack@eecs.umich.edudef template MicroDebugConstructor {{
1135425Sgblack@eecs.umich.edu
1145425Sgblack@eecs.umich.edu    inline void %(class_name)s::buildMe()
1155425Sgblack@eecs.umich.edu    {
1165425Sgblack@eecs.umich.edu        %(constructor)s;
1175425Sgblack@eecs.umich.edu    }
1185425Sgblack@eecs.umich.edu
1195425Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(
1205425Sgblack@eecs.umich.edu            ExtMachInst machInst, const char * instMnem,
1215425Sgblack@eecs.umich.edu            std::string _message, uint8_t _cc) :
1225425Sgblack@eecs.umich.edu        %(base_class)s(machInst, "%(func)s", instMnem, _message, _cc)
1235425Sgblack@eecs.umich.edu    {
1245425Sgblack@eecs.umich.edu        buildMe();
1255425Sgblack@eecs.umich.edu    }
1265425Sgblack@eecs.umich.edu
1275425Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(
1287620Sgblack@eecs.umich.edu            ExtMachInst machInst, const char * instMnem, uint64_t setFlags,
1295425Sgblack@eecs.umich.edu            std::string _message, uint8_t _cc) :
1305425Sgblack@eecs.umich.edu        %(base_class)s(machInst, "%(func)s", instMnem,
1317620Sgblack@eecs.umich.edu                setFlags, _message, _cc)
1325425Sgblack@eecs.umich.edu    {
1335425Sgblack@eecs.umich.edu        buildMe();
1345425Sgblack@eecs.umich.edu    }
1355425Sgblack@eecs.umich.edu}};
1365425Sgblack@eecs.umich.edu
1375425Sgblack@eecs.umich.eduoutput decoder {{
1385425Sgblack@eecs.umich.edu    std::string MicroDebugBase::generateDisassembly(Addr pc,
1395425Sgblack@eecs.umich.edu            const SymbolTable *symtab) const
1405425Sgblack@eecs.umich.edu    {
1415425Sgblack@eecs.umich.edu        std::stringstream response;
1425425Sgblack@eecs.umich.edu
1435425Sgblack@eecs.umich.edu        printMnemonic(response, instMnem, mnemonic);
1445425Sgblack@eecs.umich.edu        response << "\"" << message << "\"";
1455425Sgblack@eecs.umich.edu
1465425Sgblack@eecs.umich.edu        return response.str();
1475425Sgblack@eecs.umich.edu    }
1485425Sgblack@eecs.umich.edu}};
1495425Sgblack@eecs.umich.edu
1505425Sgblack@eecs.umich.edulet {{
1515425Sgblack@eecs.umich.edu    class MicroDebug(X86Microop):
1525425Sgblack@eecs.umich.edu        def __init__(self, message, flags=None):
1535425Sgblack@eecs.umich.edu            self.message = message
1545425Sgblack@eecs.umich.edu            if flags:
1555425Sgblack@eecs.umich.edu                if not isinstance(flags, (list, tuple)):
1565425Sgblack@eecs.umich.edu                    raise Exception, "flags must be a list or tuple of flags"
1575425Sgblack@eecs.umich.edu                self.cond = " | ".join(flags)
1585425Sgblack@eecs.umich.edu                self.className += "Flags"
1595425Sgblack@eecs.umich.edu            else:
1605425Sgblack@eecs.umich.edu                self.cond = "0"
1615425Sgblack@eecs.umich.edu
1627620Sgblack@eecs.umich.edu        def getAllocator(self, microFlags):
1637620Sgblack@eecs.umich.edu            allocator = '''new %(class_name)s(machInst, macrocodeBlock,
1645425Sgblack@eecs.umich.edu                    %(flags)s, "%(message)s", %(cc)s)''' % {
1655425Sgblack@eecs.umich.edu                "class_name" : self.className,
1665425Sgblack@eecs.umich.edu                "flags" : self.microFlagsText(microFlags),
1675425Sgblack@eecs.umich.edu                "message" : self.message,
1685425Sgblack@eecs.umich.edu                "cc" : self.cond}
1695425Sgblack@eecs.umich.edu            return allocator
1705425Sgblack@eecs.umich.edu
1715425Sgblack@eecs.umich.edu    exec_output = ""
1725425Sgblack@eecs.umich.edu    header_output = ""
1735425Sgblack@eecs.umich.edu    decoder_output = ""
1745425Sgblack@eecs.umich.edu
1755425Sgblack@eecs.umich.edu    def buildDebugMicro(func):
1765425Sgblack@eecs.umich.edu        global exec_output, header_output, decoder_output
1775425Sgblack@eecs.umich.edu
1785425Sgblack@eecs.umich.edu        iop = InstObjParams(func, "Micro%sFlags" % func.capitalize(),
1795425Sgblack@eecs.umich.edu                "MicroDebugBase",
1805425Sgblack@eecs.umich.edu                {"code": "",
1815425Sgblack@eecs.umich.edu                 "func": func,
1825425Sgblack@eecs.umich.edu                 "cond_test": "checkCondition(ccFlagBits, cc)"})
1835425Sgblack@eecs.umich.edu        exec_output += MicroDebugExecute.subst(iop)
1845425Sgblack@eecs.umich.edu        header_output += MicroDebugDeclare.subst(iop)
1855425Sgblack@eecs.umich.edu        decoder_output += MicroDebugConstructor.subst(iop)
1865425Sgblack@eecs.umich.edu
1875425Sgblack@eecs.umich.edu        iop = InstObjParams(func, "Micro%s" % func.capitalize(),
1885425Sgblack@eecs.umich.edu                "MicroDebugBase",
1895425Sgblack@eecs.umich.edu                {"code": "",
1905425Sgblack@eecs.umich.edu                 "func": func,
1915425Sgblack@eecs.umich.edu                 "cond_test": "true"})
1925425Sgblack@eecs.umich.edu        exec_output += MicroDebugExecute.subst(iop)
1935425Sgblack@eecs.umich.edu        header_output += MicroDebugDeclare.subst(iop)
1945425Sgblack@eecs.umich.edu        decoder_output += MicroDebugConstructor.subst(iop)
1955425Sgblack@eecs.umich.edu
1965425Sgblack@eecs.umich.edu        class MicroDebugChild(MicroDebug):
1975425Sgblack@eecs.umich.edu            className = "Micro%s" % func.capitalize()
1985425Sgblack@eecs.umich.edu
1995425Sgblack@eecs.umich.edu        global microopClasses
2005425Sgblack@eecs.umich.edu        microopClasses[func] = MicroDebugChild
2015425Sgblack@eecs.umich.edu
2025425Sgblack@eecs.umich.edu    buildDebugMicro("panic")
2035425Sgblack@eecs.umich.edu    buildDebugMicro("fatal")
2045425Sgblack@eecs.umich.edu    buildDebugMicro("warn")
2055425Sgblack@eecs.umich.edu    buildDebugMicro("warn_once")
2065425Sgblack@eecs.umich.edu}};
207