trap.isa revision 10474:799c8ee4ecba
14120Sgblack@eecs.umich.edu// -*- mode:c++ -*- 24120Sgblack@eecs.umich.edu 37087Snate@binkert.org// Copyright (c) 2007 MIPS Technologies, Inc. 47087Snate@binkert.org// All rights reserved. 57087Snate@binkert.org// 67087Snate@binkert.org// Redistribution and use in source and binary forms, with or without 77087Snate@binkert.org// modification, are permitted provided that the following conditions are 87087Snate@binkert.org// met: redistributions of source code must retain the above copyright 97087Snate@binkert.org// notice, this list of conditions and the following disclaimer; 107087Snate@binkert.org// redistributions in binary form must reproduce the above copyright 117087Snate@binkert.org// notice, this list of conditions and the following disclaimer in the 127087Snate@binkert.org// documentation and/or other materials provided with the distribution; 137087Snate@binkert.org// neither the name of the copyright holders nor the names of its 147087Snate@binkert.org// contributors may be used to endorse or promote products derived from 154120Sgblack@eecs.umich.edu// this software without specific prior written permission. 164120Sgblack@eecs.umich.edu// 174120Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 184120Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 194120Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 204120Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 214120Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 224120Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 234120Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 244120Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 254120Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 264120Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 274120Sgblack@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 284120Sgblack@eecs.umich.edu// 294120Sgblack@eecs.umich.edu// Authors: Korey Sewell 304120Sgblack@eecs.umich.edu// Jaidev Patwardhan 314120Sgblack@eecs.umich.edu 324120Sgblack@eecs.umich.edu//////////////////////////////////////////////////////////////////// 334120Sgblack@eecs.umich.edu// 344120Sgblack@eecs.umich.edu// Trap instructions 354120Sgblack@eecs.umich.edu// 364120Sgblack@eecs.umich.edu 374120Sgblack@eecs.umich.eduoutput header {{ 384120Sgblack@eecs.umich.edu /** 394120Sgblack@eecs.umich.edu * Base class for integer operations. 404120Sgblack@eecs.umich.edu */ 414120Sgblack@eecs.umich.edu class Trap : public MipsStaticInst 424120Sgblack@eecs.umich.edu { 434202Sbinkertn@umich.edu protected: 445069Sgblack@eecs.umich.edu 454202Sbinkertn@umich.edu /// Constructor 465659Sgblack@eecs.umich.edu Trap(const char *mnem, MachInst _machInst, OpClass __opClass) : MipsStaticInst(mnem, _machInst, __opClass) 474601Sgblack@eecs.umich.edu { 485124Sgblack@eecs.umich.edu } 497966Sgblack@eecs.umich.edu 505083Sgblack@eecs.umich.edu std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const; 514679Sgblack@eecs.umich.edu }; 526515Sgblack@eecs.umich.edu class TrapImm : public MipsStaticInst 535083Sgblack@eecs.umich.edu { 544679Sgblack@eecs.umich.edu protected: 554679Sgblack@eecs.umich.edu 566313Sgblack@eecs.umich.edu int16_t imm; 576365Sgblack@eecs.umich.edu 585124Sgblack@eecs.umich.edu /// Constructor 594249Sgblack@eecs.umich.edu TrapImm(const char *mnem, MachInst _machInst, OpClass __opClass) : 604240Sgblack@eecs.umich.edu MipsStaticInst(mnem, _machInst, __opClass),imm(INTIMM) 614202Sbinkertn@umich.edu { 624997Sgblack@eecs.umich.edu } 637624Sgblack@eecs.umich.edu 645135Sgblack@eecs.umich.edu std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const; 654997Sgblack@eecs.umich.edu 666365Sgblack@eecs.umich.edu 676365Sgblack@eecs.umich.edu }; 684997Sgblack@eecs.umich.edu 695800Snate@binkert.org}}; 705800Snate@binkert.org 714120Sgblack@eecs.umich.eduoutput decoder {{ 724202Sbinkertn@umich.edu std::string Trap::generateDisassembly(Addr pc, const SymbolTable *symtab) const 735800Snate@binkert.org { 745904Sgblack@eecs.umich.edu return "Disassembly of trap instruction\n"; 755904Sgblack@eecs.umich.edu } 765909Sgblack@eecs.umich.edu std::string TrapImm::generateDisassembly(Addr pc, const SymbolTable *symtab) const 775649Sgblack@eecs.umich.edu { 785647Sgblack@eecs.umich.edu return "Disassembly of trap instruction\n"; 795132Sgblack@eecs.umich.edu } 805132Sgblack@eecs.umich.edu}}; 814202Sbinkertn@umich.edu 825647Sgblack@eecs.umich.edudef template TrapExecute {{ 835299Sgblack@eecs.umich.edu //Edit This Template When Traps Are Implemented 845245Sgblack@eecs.umich.edu Fault %(class_name)s::execute(CPU_EXEC_CONTEXT *xc, Trace::InstRecord *traceData) const 855132Sgblack@eecs.umich.edu { 865086Sgblack@eecs.umich.edu //Write the resulting state to the execution context 875086Sgblack@eecs.umich.edu %(op_wb)s; 884202Sbinkertn@umich.edu 894202Sbinkertn@umich.edu //Call into the trap handler with the appropriate fault 904120Sgblack@eecs.umich.edu return No_Fault; 914202Sbinkertn@umich.edu } 924202Sbinkertn@umich.edu}}; 934202Sbinkertn@umich.edudef format Trap(code, *flags) {{ 944120Sgblack@eecs.umich.edu 955069Sgblack@eecs.umich.edu code ='bool cond;\n' + code 965081Sgblack@eecs.umich.edu code += 'if (cond) {\n' 975081Sgblack@eecs.umich.edu code += 'fault = std::make_shared<TrapFault>();\n};' 985081Sgblack@eecs.umich.edu 995081Sgblack@eecs.umich.edu iop = InstObjParams(name, Name, 'MipsStaticInst', code, flags) 1005081Sgblack@eecs.umich.edu header_output = BasicDeclare.subst(iop) 1015081Sgblack@eecs.umich.edu decoder_output = BasicConstructor.subst(iop) 1025081Sgblack@eecs.umich.edu decode_block = BasicDecode.subst(iop) 1035081Sgblack@eecs.umich.edu exec_output = BasicExecute.subst(iop) 1045081Sgblack@eecs.umich.edu}}; 1055081Sgblack@eecs.umich.edudef format TrapImm(code, *flags) {{ 1065081Sgblack@eecs.umich.edu 1075081Sgblack@eecs.umich.edu code ='bool cond;\n' + code 1085081Sgblack@eecs.umich.edu code += 'if (cond) {\n' 1095081Sgblack@eecs.umich.edu code += 'fault = std::make_shared<TrapFault>();\n};' 1105081Sgblack@eecs.umich.edu iop = InstObjParams(name, Name, 'MipsStaticInst', code, flags) 1115081Sgblack@eecs.umich.edu header_output = BasicDeclare.subst(iop) 1125081Sgblack@eecs.umich.edu decoder_output = BasicConstructor.subst(iop) 1135081Sgblack@eecs.umich.edu decode_block = BasicDecode.subst(iop) 1145081Sgblack@eecs.umich.edu exec_output = BasicExecute.subst(iop) 1155081Sgblack@eecs.umich.edu}}; 1165081Sgblack@eecs.umich.edu