debug.isa revision 12234
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:
487965Sgblack@eecs.umich.edu        typedef GenericISA::M5DebugFault::DebugFunc DebugFunc;
497965Sgblack@eecs.umich.edu        DebugFunc func;
505425Sgblack@eecs.umich.edu        std::string message;
515425Sgblack@eecs.umich.edu        uint8_t cc;
525425Sgblack@eecs.umich.edu
535425Sgblack@eecs.umich.edu      public:
547965Sgblack@eecs.umich.edu        MicroDebugBase(ExtMachInst machInst, const char * mnem,
557620Sgblack@eecs.umich.edu                const char * instMnem, uint64_t setFlags,
567965Sgblack@eecs.umich.edu                DebugFunc _func, std::string _message, uint8_t _cc) :
577965Sgblack@eecs.umich.edu            X86MicroopBase(machInst, mnem, instMnem, setFlags, No_OpClass),
587965Sgblack@eecs.umich.edu                    func(_func), message(_message), cc(_cc)
597965Sgblack@eecs.umich.edu        {}
605425Sgblack@eecs.umich.edu
617965Sgblack@eecs.umich.edu        std::string
627965Sgblack@eecs.umich.edu        generateDisassembly(Addr pc, const SymbolTable *symtab) const
637965Sgblack@eecs.umich.edu        {
647965Sgblack@eecs.umich.edu            std::stringstream response;
657965Sgblack@eecs.umich.edu
667965Sgblack@eecs.umich.edu            printMnemonic(response, instMnem, mnemonic);
677965Sgblack@eecs.umich.edu            response << "\"" << message << "\"";
687965Sgblack@eecs.umich.edu
697965Sgblack@eecs.umich.edu            return response.str();
707965Sgblack@eecs.umich.edu        }
715425Sgblack@eecs.umich.edu    };
725425Sgblack@eecs.umich.edu}};
735425Sgblack@eecs.umich.edu
745425Sgblack@eecs.umich.edudef template MicroDebugDeclare {{
755425Sgblack@eecs.umich.edu    class %(class_name)s : public %(base_class)s
765425Sgblack@eecs.umich.edu    {
775425Sgblack@eecs.umich.edu      public:
785425Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst _machInst, const char * instMnem,
797620Sgblack@eecs.umich.edu                uint64_t setFlags, std::string _message, uint8_t _cc);
805425Sgblack@eecs.umich.edu
815425Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
825425Sgblack@eecs.umich.edu    };
835425Sgblack@eecs.umich.edu}};
845425Sgblack@eecs.umich.edu
855425Sgblack@eecs.umich.edudef template MicroDebugExecute {{
867965Sgblack@eecs.umich.edu        Fault
8712234Sgabeblack@google.com        %(class_name)s::execute(ExecContext *xc,
885425Sgblack@eecs.umich.edu                Trace::InstRecord *traceData) const
895425Sgblack@eecs.umich.edu        {
905425Sgblack@eecs.umich.edu            %(op_decl)s
915425Sgblack@eecs.umich.edu            %(op_rd)s
925425Sgblack@eecs.umich.edu            if (%(cond_test)s) {
9310474Sandreas.hansson@arm.com                return std::make_shared<GenericISA::M5DebugFault>(func,
9410474Sandreas.hansson@arm.com                                                                  message);
957965Sgblack@eecs.umich.edu            } else {
967965Sgblack@eecs.umich.edu                return NoFault;
975425Sgblack@eecs.umich.edu            }
985425Sgblack@eecs.umich.edu        }
995425Sgblack@eecs.umich.edu}};
1005425Sgblack@eecs.umich.edu
1015425Sgblack@eecs.umich.edudef template MicroDebugConstructor {{
1027975Sgblack@eecs.umich.edu    %(class_name)s::%(class_name)s(
1037620Sgblack@eecs.umich.edu            ExtMachInst machInst, const char * instMnem, uint64_t setFlags,
1045425Sgblack@eecs.umich.edu            std::string _message, uint8_t _cc) :
1055425Sgblack@eecs.umich.edu        %(base_class)s(machInst, "%(func)s", instMnem,
1067965Sgblack@eecs.umich.edu                setFlags, %(func_num)s, _message, _cc)
1075425Sgblack@eecs.umich.edu    {
1087626Sgblack@eecs.umich.edu        %(constructor)s;
1095425Sgblack@eecs.umich.edu    }
1105425Sgblack@eecs.umich.edu}};
1115425Sgblack@eecs.umich.edu
1125425Sgblack@eecs.umich.edulet {{
1135425Sgblack@eecs.umich.edu    class MicroDebug(X86Microop):
1145425Sgblack@eecs.umich.edu        def __init__(self, message, flags=None):
1155425Sgblack@eecs.umich.edu            self.message = message
1165425Sgblack@eecs.umich.edu            if flags:
1175425Sgblack@eecs.umich.edu                if not isinstance(flags, (list, tuple)):
1185425Sgblack@eecs.umich.edu                    raise Exception, "flags must be a list or tuple of flags"
1195425Sgblack@eecs.umich.edu                self.cond = " | ".join(flags)
1205425Sgblack@eecs.umich.edu                self.className += "Flags"
1215425Sgblack@eecs.umich.edu            else:
1225425Sgblack@eecs.umich.edu                self.cond = "0"
1235425Sgblack@eecs.umich.edu
1247620Sgblack@eecs.umich.edu        def getAllocator(self, microFlags):
1257620Sgblack@eecs.umich.edu            allocator = '''new %(class_name)s(machInst, macrocodeBlock,
1265425Sgblack@eecs.umich.edu                    %(flags)s, "%(message)s", %(cc)s)''' % {
1275425Sgblack@eecs.umich.edu                "class_name" : self.className,
1285425Sgblack@eecs.umich.edu                "flags" : self.microFlagsText(microFlags),
1295425Sgblack@eecs.umich.edu                "message" : self.message,
1305425Sgblack@eecs.umich.edu                "cc" : self.cond}
1315425Sgblack@eecs.umich.edu            return allocator
1325425Sgblack@eecs.umich.edu
1335425Sgblack@eecs.umich.edu    exec_output = ""
1345425Sgblack@eecs.umich.edu    header_output = ""
1355425Sgblack@eecs.umich.edu    decoder_output = ""
1365425Sgblack@eecs.umich.edu
1377965Sgblack@eecs.umich.edu    def buildDebugMicro(func, func_num):
1385425Sgblack@eecs.umich.edu        global exec_output, header_output, decoder_output
1395425Sgblack@eecs.umich.edu
1405425Sgblack@eecs.umich.edu        iop = InstObjParams(func, "Micro%sFlags" % func.capitalize(),
1415425Sgblack@eecs.umich.edu                "MicroDebugBase",
1425425Sgblack@eecs.umich.edu                {"code": "",
1435425Sgblack@eecs.umich.edu                 "func": func,
1447965Sgblack@eecs.umich.edu                 "func_num": "GenericISA::M5DebugFault::%s" % func_num,
1459010Snilay@cs.wisc.edu                 "cond_test": "checkCondition(ccFlagBits | cfofBits | \
1469211Snilay@cs.wisc.edu                                              dfBit | ecfBit | ezfBit, cc)"})
1475425Sgblack@eecs.umich.edu        exec_output += MicroDebugExecute.subst(iop)
1485425Sgblack@eecs.umich.edu        header_output += MicroDebugDeclare.subst(iop)
1495425Sgblack@eecs.umich.edu        decoder_output += MicroDebugConstructor.subst(iop)
1505425Sgblack@eecs.umich.edu
1515425Sgblack@eecs.umich.edu        iop = InstObjParams(func, "Micro%s" % func.capitalize(),
1525425Sgblack@eecs.umich.edu                "MicroDebugBase",
1535425Sgblack@eecs.umich.edu                {"code": "",
1545425Sgblack@eecs.umich.edu                 "func": func,
1557965Sgblack@eecs.umich.edu                 "func_num": "GenericISA::M5DebugFault::%s" % func_num,
1565425Sgblack@eecs.umich.edu                 "cond_test": "true"})
1575425Sgblack@eecs.umich.edu        exec_output += MicroDebugExecute.subst(iop)
1585425Sgblack@eecs.umich.edu        header_output += MicroDebugDeclare.subst(iop)
1595425Sgblack@eecs.umich.edu        decoder_output += MicroDebugConstructor.subst(iop)
1605425Sgblack@eecs.umich.edu
1615425Sgblack@eecs.umich.edu        class MicroDebugChild(MicroDebug):
1625425Sgblack@eecs.umich.edu            className = "Micro%s" % func.capitalize()
1635425Sgblack@eecs.umich.edu
1645425Sgblack@eecs.umich.edu        global microopClasses
1655425Sgblack@eecs.umich.edu        microopClasses[func] = MicroDebugChild
1665425Sgblack@eecs.umich.edu
1677965Sgblack@eecs.umich.edu    buildDebugMicro("panic", "PanicFunc")
1687965Sgblack@eecs.umich.edu    buildDebugMicro("fatal", "FatalFunc")
1697965Sgblack@eecs.umich.edu    buildDebugMicro("warn", "WarnFunc")
1707965Sgblack@eecs.umich.edu    buildDebugMicro("warn_once", "WarnOnceFunc")
1715425Sgblack@eecs.umich.edu}};
172