debug.isa revision 9010:7891b96e1526
19538Satgutier@umich.edu// Copyright (c) 2008 The Hewlett-Packard Development Company
29538Satgutier@umich.edu// All rights reserved.
39538Satgutier@umich.edu//
49538Satgutier@umich.edu// The license below extends only to copyright in the software and shall
59538Satgutier@umich.edu// not be construed as granting a license to any other intellectual
69538Satgutier@umich.edu// property including but not limited to intellectual property relating
79538Satgutier@umich.edu// to a hardware implementation of the functionality of the software
89538Satgutier@umich.edu// licensed hereunder.  You may use the software subject to the license
99538Satgutier@umich.edu// terms below provided that you ensure that this notice is replicated
109538Satgutier@umich.edu// unmodified and in its entirety in all distributions of the software,
119538Satgutier@umich.edu// modified or unmodified, in source code or in binary form.
129538Satgutier@umich.edu//
139538Satgutier@umich.edu// Redistribution and use in source and binary forms, with or without
149538Satgutier@umich.edu// modification, are permitted provided that the following conditions are
159538Satgutier@umich.edu// met: redistributions of source code must retain the above copyright
169538Satgutier@umich.edu// notice, this list of conditions and the following disclaimer;
179538Satgutier@umich.edu// redistributions in binary form must reproduce the above copyright
189538Satgutier@umich.edu// notice, this list of conditions and the following disclaimer in the
199538Satgutier@umich.edu// documentation and/or other materials provided with the distribution;
209538Satgutier@umich.edu// neither the name of the copyright holders nor the names of its
219538Satgutier@umich.edu// contributors may be used to endorse or promote products derived from
229538Satgutier@umich.edu// this software without specific prior written permission.
239538Satgutier@umich.edu//
249538Satgutier@umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
259538Satgutier@umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
269538Satgutier@umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
279538Satgutier@umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
289538Satgutier@umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
299538Satgutier@umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
309538Satgutier@umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
319538Satgutier@umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
329538Satgutier@umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
339538Satgutier@umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
349538Satgutier@umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
359538Satgutier@umich.edu//
369538Satgutier@umich.edu// Authors: Gabe Black
379538Satgutier@umich.edu
3810508SAli.Saidi@ARM.com//////////////////////////////////////////////////////////////////////////
399538Satgutier@umich.edu//
409538Satgutier@umich.edu// Debug Microops
419538Satgutier@umich.edu//
429538Satgutier@umich.edu//////////////////////////////////////////////////////////////////////////
4310880SCurtis.Dunham@arm.com
449538Satgutier@umich.eduoutput header {{
459538Satgutier@umich.edu    class MicroDebugBase : public X86ISA::X86MicroopBase
469538Satgutier@umich.edu    {
4710880SCurtis.Dunham@arm.com      protected:
489538Satgutier@umich.edu        typedef GenericISA::M5DebugFault::DebugFunc DebugFunc;
499538Satgutier@umich.edu        DebugFunc func;
509538Satgutier@umich.edu        std::string message;
519538Satgutier@umich.edu        uint8_t cc;
529538Satgutier@umich.edu
539538Satgutier@umich.edu      public:
5410880SCurtis.Dunham@arm.com        MicroDebugBase(ExtMachInst machInst, const char * mnem,
559538Satgutier@umich.edu                const char * instMnem, uint64_t setFlags,
5610880SCurtis.Dunham@arm.com                DebugFunc _func, std::string _message, uint8_t _cc) :
579538Satgutier@umich.edu            X86MicroopBase(machInst, mnem, instMnem, setFlags, No_OpClass),
589538Satgutier@umich.edu                    func(_func), message(_message), cc(_cc)
599538Satgutier@umich.edu        {}
609538Satgutier@umich.edu
619538Satgutier@umich.edu        std::string
629538Satgutier@umich.edu        generateDisassembly(Addr pc, const SymbolTable *symtab) const
639538Satgutier@umich.edu        {
649538Satgutier@umich.edu            std::stringstream response;
659538Satgutier@umich.edu
669538Satgutier@umich.edu            printMnemonic(response, instMnem, mnemonic);
679538Satgutier@umich.edu            response << "\"" << message << "\"";
689538Satgutier@umich.edu
699538Satgutier@umich.edu            return response.str();
709538Satgutier@umich.edu        }
719538Satgutier@umich.edu    };
729538Satgutier@umich.edu}};
739538Satgutier@umich.edu
749538Satgutier@umich.edudef template MicroDebugDeclare {{
759538Satgutier@umich.edu    class %(class_name)s : public %(base_class)s
769538Satgutier@umich.edu    {
779538Satgutier@umich.edu      public:
789538Satgutier@umich.edu        %(class_name)s(ExtMachInst _machInst, const char * instMnem,
799538Satgutier@umich.edu                uint64_t setFlags, std::string _message, uint8_t _cc);
809538Satgutier@umich.edu
819538Satgutier@umich.edu        %(BasicExecDeclare)s
829538Satgutier@umich.edu    };
839538Satgutier@umich.edu}};
849538Satgutier@umich.edu
859538Satgutier@umich.edudef template MicroDebugExecute {{
869538Satgutier@umich.edu        Fault
879538Satgutier@umich.edu        %(class_name)s::execute(%(CPU_exec_context)s *xc,
889538Satgutier@umich.edu                Trace::InstRecord *traceData) const
899538Satgutier@umich.edu        {
909538Satgutier@umich.edu            %(op_decl)s
919538Satgutier@umich.edu            %(op_rd)s
929538Satgutier@umich.edu            if (%(cond_test)s) {
939538Satgutier@umich.edu                return new GenericISA::M5DebugFault(func, message);
949538Satgutier@umich.edu            } else {
959538Satgutier@umich.edu                return NoFault;
969538Satgutier@umich.edu            }
979538Satgutier@umich.edu        }
989538Satgutier@umich.edu}};
999538Satgutier@umich.edu
1009538Satgutier@umich.edudef template MicroDebugConstructor {{
1019538Satgutier@umich.edu    %(class_name)s::%(class_name)s(
1029538Satgutier@umich.edu            ExtMachInst machInst, const char * instMnem, uint64_t setFlags,
1039538Satgutier@umich.edu            std::string _message, uint8_t _cc) :
1049538Satgutier@umich.edu        %(base_class)s(machInst, "%(func)s", instMnem,
1059538Satgutier@umich.edu                setFlags, %(func_num)s, _message, _cc)
1069538Satgutier@umich.edu    {
1079538Satgutier@umich.edu        %(constructor)s;
1089538Satgutier@umich.edu    }
1099538Satgutier@umich.edu}};
1109538Satgutier@umich.edu
1119538Satgutier@umich.edulet {{
1129538Satgutier@umich.edu    class MicroDebug(X86Microop):
1139538Satgutier@umich.edu        def __init__(self, message, flags=None):
1149538Satgutier@umich.edu            self.message = message
1159538Satgutier@umich.edu            if flags:
1169538Satgutier@umich.edu                if not isinstance(flags, (list, tuple)):
1179538Satgutier@umich.edu                    raise Exception, "flags must be a list or tuple of flags"
1189538Satgutier@umich.edu                self.cond = " | ".join(flags)
1199538Satgutier@umich.edu                self.className += "Flags"
1209538Satgutier@umich.edu            else:
1219538Satgutier@umich.edu                self.cond = "0"
1229538Satgutier@umich.edu
1239538Satgutier@umich.edu        def getAllocator(self, microFlags):
1249538Satgutier@umich.edu            allocator = '''new %(class_name)s(machInst, macrocodeBlock,
1259538Satgutier@umich.edu                    %(flags)s, "%(message)s", %(cc)s)''' % {
1269538Satgutier@umich.edu                "class_name" : self.className,
1279538Satgutier@umich.edu                "flags" : self.microFlagsText(microFlags),
1289538Satgutier@umich.edu                "message" : self.message,
1299538Satgutier@umich.edu                "cc" : self.cond}
1309538Satgutier@umich.edu            return allocator
1319538Satgutier@umich.edu
1329538Satgutier@umich.edu    exec_output = ""
1339538Satgutier@umich.edu    header_output = ""
1349538Satgutier@umich.edu    decoder_output = ""
1359538Satgutier@umich.edu
1369538Satgutier@umich.edu    def buildDebugMicro(func, func_num):
1379538Satgutier@umich.edu        global exec_output, header_output, decoder_output
1389538Satgutier@umich.edu
1399538Satgutier@umich.edu        iop = InstObjParams(func, "Micro%sFlags" % func.capitalize(),
1409538Satgutier@umich.edu                "MicroDebugBase",
1419538Satgutier@umich.edu                {"code": "",
1429538Satgutier@umich.edu                 "func": func,
1439538Satgutier@umich.edu                 "func_num": "GenericISA::M5DebugFault::%s" % func_num,
1449538Satgutier@umich.edu                 "cond_test": "checkCondition(ccFlagBits | cfofBits | \
1459538Satgutier@umich.edu                                              ecfBit | ezfBit, cc)"})
1469538Satgutier@umich.edu        exec_output += MicroDebugExecute.subst(iop)
1479538Satgutier@umich.edu        header_output += MicroDebugDeclare.subst(iop)
1489538Satgutier@umich.edu        decoder_output += MicroDebugConstructor.subst(iop)
1499538Satgutier@umich.edu
1509538Satgutier@umich.edu        iop = InstObjParams(func, "Micro%s" % func.capitalize(),
1519538Satgutier@umich.edu                "MicroDebugBase",
15210508SAli.Saidi@ARM.com                {"code": "",
15310508SAli.Saidi@ARM.com                 "func": func,
15410508SAli.Saidi@ARM.com                 "func_num": "GenericISA::M5DebugFault::%s" % func_num,
15510508SAli.Saidi@ARM.com                 "cond_test": "true"})
15610508SAli.Saidi@ARM.com        exec_output += MicroDebugExecute.subst(iop)
15710508SAli.Saidi@ARM.com        header_output += MicroDebugDeclare.subst(iop)
15810508SAli.Saidi@ARM.com        decoder_output += MicroDebugConstructor.subst(iop)
15910508SAli.Saidi@ARM.com
16010508SAli.Saidi@ARM.com        class MicroDebugChild(MicroDebug):
16110508SAli.Saidi@ARM.com            className = "Micro%s" % func.capitalize()
16210508SAli.Saidi@ARM.com
16310508SAli.Saidi@ARM.com        global microopClasses
16410508SAli.Saidi@ARM.com        microopClasses[func] = MicroDebugChild
16510508SAli.Saidi@ARM.com
16610508SAli.Saidi@ARM.com    buildDebugMicro("panic", "PanicFunc")
16710508SAli.Saidi@ARM.com    buildDebugMicro("fatal", "FatalFunc")
16810508SAli.Saidi@ARM.com    buildDebugMicro("warn", "WarnFunc")
16910508SAli.Saidi@ARM.com    buildDebugMicro("warn_once", "WarnOnceFunc")
17010508SAli.Saidi@ARM.com}};
17110508SAli.Saidi@ARM.com