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