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