debug.isa revision 7620:3d8a23caa1ef
16019Shines@cs.fsu.edu// Copyright (c) 2008 The Hewlett-Packard Development Company
211496Sandreas.sandberg@arm.com// All rights reserved.
37093Sgblack@eecs.umich.edu//
47093Sgblack@eecs.umich.edu// The license below extends only to copyright in the software and shall
57093Sgblack@eecs.umich.edu// not be construed as granting a license to any other intellectual
67093Sgblack@eecs.umich.edu// property including but not limited to intellectual property relating
77093Sgblack@eecs.umich.edu// to a hardware implementation of the functionality of the software
87093Sgblack@eecs.umich.edu// licensed hereunder.  You may use the software subject to the license
97093Sgblack@eecs.umich.edu// terms below provided that you ensure that this notice is replicated
107093Sgblack@eecs.umich.edu// unmodified and in its entirety in all distributions of the software,
117093Sgblack@eecs.umich.edu// modified or unmodified, in source code or in binary form.
127093Sgblack@eecs.umich.edu//
137093Sgblack@eecs.umich.edu// Redistribution and use in source and binary forms, with or without
146019Shines@cs.fsu.edu// modification, are permitted provided that the following conditions are
156019Shines@cs.fsu.edu// met: redistributions of source code must retain the above copyright
166019Shines@cs.fsu.edu// notice, this list of conditions and the following disclaimer;
176019Shines@cs.fsu.edu// redistributions in binary form must reproduce the above copyright
186019Shines@cs.fsu.edu// notice, this list of conditions and the following disclaimer in the
196019Shines@cs.fsu.edu// documentation and/or other materials provided with the distribution;
206019Shines@cs.fsu.edu// neither the name of the copyright holders nor the names of its
216019Shines@cs.fsu.edu// contributors may be used to endorse or promote products derived from
226019Shines@cs.fsu.edu// this software without specific prior written permission.
236019Shines@cs.fsu.edu//
246019Shines@cs.fsu.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
256019Shines@cs.fsu.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
266019Shines@cs.fsu.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
276019Shines@cs.fsu.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
286019Shines@cs.fsu.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
296019Shines@cs.fsu.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
306019Shines@cs.fsu.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
316019Shines@cs.fsu.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
326019Shines@cs.fsu.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
336019Shines@cs.fsu.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
346019Shines@cs.fsu.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
356019Shines@cs.fsu.edu//
366019Shines@cs.fsu.edu// Authors: Gabe Black
376019Shines@cs.fsu.edu
386019Shines@cs.fsu.edu//////////////////////////////////////////////////////////////////////////
396019Shines@cs.fsu.edu//
406019Shines@cs.fsu.edu// Debug Microops
416735Sgblack@eecs.umich.edu//
426735Sgblack@eecs.umich.edu//////////////////////////////////////////////////////////////////////////
4310037SARM gem5 Developers
4410037SARM gem5 Developersoutput header {{
456019Shines@cs.fsu.edu    class MicroDebugBase : public X86ISA::X86MicroopBase
466019Shines@cs.fsu.edu    {
476019Shines@cs.fsu.edu      protected:
4811793Sbrandon.potter@amd.com        std::string message;
4911793Sbrandon.potter@amd.com        uint8_t cc;
5010037SARM gem5 Developers
5110037SARM gem5 Developers      public:
5210037SARM gem5 Developers        MicroDebugBase(ExtMachInst _machInst, const char * mnem,
538229Snate@binkert.org                const char * instMnem, uint64_t setFlags,
548229Snate@binkert.org                std::string _message, uint8_t _cc);
556019Shines@cs.fsu.edu
568232Snate@binkert.org        MicroDebugBase(ExtMachInst _machInst, const char * mnem,
578782Sgblack@eecs.umich.edu                const char * instMnem, std::string _message, uint8_t _cc);
586019Shines@cs.fsu.edu
596019Shines@cs.fsu.edu        std::string generateDisassembly(Addr pc,
606019Shines@cs.fsu.edu                const SymbolTable *symtab) const;
616019Shines@cs.fsu.edu    };
6210037SARM gem5 Developers}};
6310037SARM gem5 Developers
6410037SARM gem5 Developersdef template MicroDebugDeclare {{
6510037SARM gem5 Developers    class %(class_name)s : public %(base_class)s
6610037SARM gem5 Developers    {
6710037SARM gem5 Developers      private:
6810037SARM gem5 Developers        void buildMe();
6910037SARM gem5 Developers      public:
7010037SARM gem5 Developers        %(class_name)s(ExtMachInst _machInst, const char * instMnem,
7110037SARM gem5 Developers                uint64_t setFlags, std::string _message, uint8_t _cc);
7210037SARM gem5 Developers
7310037SARM gem5 Developers        %(class_name)s(ExtMachInst _machInst, const char * instMnem,
7410037SARM gem5 Developers                std::string _message, uint8_t _cc);
7510037SARM gem5 Developers
7610037SARM gem5 Developers        %(BasicExecDeclare)s
7710037SARM gem5 Developers    };
7810037SARM gem5 Developers}};
7910037SARM gem5 Developers
8010037SARM gem5 Developersdef template MicroDebugExecute {{
8110037SARM gem5 Developers        Fault %(class_name)s::execute(%(CPU_exec_context)s *xc,
8210037SARM gem5 Developers                Trace::InstRecord *traceData) const
8310037SARM gem5 Developers        {
8410037SARM gem5 Developers            %(op_decl)s
8510037SARM gem5 Developers            %(op_rd)s
8610037SARM gem5 Developers            if (%(cond_test)s) {
8710037SARM gem5 Developers                %(func)s("%s\n", message);
8810037SARM gem5 Developers            }
8910037SARM gem5 Developers            return NoFault;
9010037SARM gem5 Developers        }
9110037SARM gem5 Developers}};
9210037SARM gem5 Developers
9310037SARM gem5 Developersoutput decoder {{
9410037SARM gem5 Developers    inline MicroDebugBase::MicroDebugBase(
9510037SARM gem5 Developers            ExtMachInst machInst, const char * mnem, const char * instMnem,
9610037SARM gem5 Developers            std::string _message, uint8_t _cc) :
9710037SARM gem5 Developers        X86MicroopBase(machInst, mnem, instMnem, 0, No_OpClass),
9810037SARM gem5 Developers        message(_message), cc(_cc)
9910037SARM gem5 Developers    {
10010037SARM gem5 Developers    }
10110037SARM gem5 Developers
1026019Shines@cs.fsu.edu    inline MicroDebugBase::MicroDebugBase(
10310037SARM gem5 Developers            ExtMachInst machInst, const char * mnem, const char * instMnem,
10410037SARM gem5 Developers            uint64_t setFlags, std::string _message, uint8_t _cc) :
10510037SARM gem5 Developers        X86MicroopBase(machInst, mnem, instMnem,
1066019Shines@cs.fsu.edu                setFlags, No_OpClass),
10710037SARM gem5 Developers                message(_message), cc(_cc)
10810037SARM gem5 Developers    {
10910037SARM gem5 Developers    }
11010037SARM gem5 Developers}};
11110037SARM gem5 Developers
11210037SARM gem5 Developersdef template MicroDebugConstructor {{
11310037SARM gem5 Developers
11410037SARM gem5 Developers    inline void %(class_name)s::buildMe()
11510037SARM gem5 Developers    {
11610037SARM gem5 Developers        %(constructor)s;
11710037SARM gem5 Developers    }
11810037SARM gem5 Developers
11910037SARM gem5 Developers    inline %(class_name)s::%(class_name)s(
12010037SARM gem5 Developers            ExtMachInst machInst, const char * instMnem,
12110037SARM gem5 Developers            std::string _message, uint8_t _cc) :
12210037SARM gem5 Developers        %(base_class)s(machInst, "%(func)s", instMnem, _message, _cc)
12310037SARM gem5 Developers    {
12410037SARM gem5 Developers        buildMe();
12510037SARM gem5 Developers    }
12610037SARM gem5 Developers
12710037SARM gem5 Developers    inline %(class_name)s::%(class_name)s(
12810037SARM gem5 Developers            ExtMachInst machInst, const char * instMnem, uint64_t setFlags,
12910037SARM gem5 Developers            std::string _message, uint8_t _cc) :
13010037SARM gem5 Developers        %(base_class)s(machInst, "%(func)s", instMnem,
13110037SARM gem5 Developers                setFlags, _message, _cc)
13210037SARM gem5 Developers    {
13310037SARM gem5 Developers        buildMe();
13410037SARM gem5 Developers    }
13510037SARM gem5 Developers}};
13610037SARM gem5 Developers
13710037SARM gem5 Developersoutput decoder {{
13810037SARM gem5 Developers    std::string MicroDebugBase::generateDisassembly(Addr pc,
13910037SARM gem5 Developers            const SymbolTable *symtab) const
14010037SARM gem5 Developers    {
14110037SARM gem5 Developers        std::stringstream response;
14210037SARM gem5 Developers
14310037SARM gem5 Developers        printMnemonic(response, instMnem, mnemonic);
14410037SARM gem5 Developers        response << "\"" << message << "\"";
14510037SARM gem5 Developers
14610037SARM gem5 Developers        return response.str();
1476019Shines@cs.fsu.edu    }
14810037SARM gem5 Developers}};
14910037SARM gem5 Developers
15010037SARM gem5 Developerslet {{
1516019Shines@cs.fsu.edu    class MicroDebug(X86Microop):
15210037SARM gem5 Developers        def __init__(self, message, flags=None):
15310037SARM gem5 Developers            self.message = message
15410037SARM gem5 Developers            if flags:
15510037SARM gem5 Developers                if not isinstance(flags, (list, tuple)):
15610037SARM gem5 Developers                    raise Exception, "flags must be a list or tuple of flags"
15710037SARM gem5 Developers                self.cond = " | ".join(flags)
15810037SARM gem5 Developers                self.className += "Flags"
15910037SARM gem5 Developers            else:
16010037SARM gem5 Developers                self.cond = "0"
16110037SARM gem5 Developers
16210037SARM gem5 Developers        def getAllocator(self, microFlags):
16310037SARM gem5 Developers            allocator = '''new %(class_name)s(machInst, macrocodeBlock,
16410037SARM gem5 Developers                    %(flags)s, "%(message)s", %(cc)s)''' % {
16510037SARM gem5 Developers                "class_name" : self.className,
16610037SARM gem5 Developers                "flags" : self.microFlagsText(microFlags),
16710037SARM gem5 Developers                "message" : self.message,
16810037SARM gem5 Developers                "cc" : self.cond}
16910037SARM gem5 Developers            return allocator
17010037SARM gem5 Developers
17110037SARM gem5 Developers    exec_output = ""
17210037SARM gem5 Developers    header_output = ""
17310037SARM gem5 Developers    decoder_output = ""
17410037SARM gem5 Developers
17510037SARM gem5 Developers    def buildDebugMicro(func):
17610037SARM gem5 Developers        global exec_output, header_output, decoder_output
17710037SARM gem5 Developers
17810037SARM gem5 Developers        iop = InstObjParams(func, "Micro%sFlags" % func.capitalize(),
17910037SARM gem5 Developers                "MicroDebugBase",
18010037SARM gem5 Developers                {"code": "",
18110037SARM gem5 Developers                 "func": func,
18210037SARM gem5 Developers                 "cond_test": "checkCondition(ccFlagBits, cc)"})
18310037SARM gem5 Developers        exec_output += MicroDebugExecute.subst(iop)
18410037SARM gem5 Developers        header_output += MicroDebugDeclare.subst(iop)
18510037SARM gem5 Developers        decoder_output += MicroDebugConstructor.subst(iop)
18610037SARM gem5 Developers
18710037SARM gem5 Developers        iop = InstObjParams(func, "Micro%s" % func.capitalize(),
18810037SARM gem5 Developers                "MicroDebugBase",
18910037SARM gem5 Developers                {"code": "",
19010037SARM gem5 Developers                 "func": func,
19110037SARM gem5 Developers                 "cond_test": "true"})
19210037SARM gem5 Developers        exec_output += MicroDebugExecute.subst(iop)
1936019Shines@cs.fsu.edu        header_output += MicroDebugDeclare.subst(iop)
19410037SARM gem5 Developers        decoder_output += MicroDebugConstructor.subst(iop)
19510037SARM gem5 Developers
19610037SARM gem5 Developers        class MicroDebugChild(MicroDebug):
1976019Shines@cs.fsu.edu            className = "Micro%s" % func.capitalize()
19810037SARM gem5 Developers
19910037SARM gem5 Developers        global microopClasses
20010037SARM gem5 Developers        microopClasses[func] = MicroDebugChild
20110037SARM gem5 Developers
20210037SARM gem5 Developers    buildDebugMicro("panic")
20310037SARM gem5 Developers    buildDebugMicro("fatal")
20410037SARM gem5 Developers    buildDebugMicro("warn")
20510037SARM gem5 Developers    buildDebugMicro("warn_once")
20610037SARM gem5 Developers}};
20710037SARM gem5 Developers