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