trap.isa revision 2632
12632Sstever@eecs.umich.edu// Copyright (c) 2006 The Regents of The University of Michigan
22632Sstever@eecs.umich.edu// All rights reserved.
32632Sstever@eecs.umich.edu//
42632Sstever@eecs.umich.edu// Redistribution and use in source and binary forms, with or without
52632Sstever@eecs.umich.edu// modification, are permitted provided that the following conditions are
62632Sstever@eecs.umich.edu// met: redistributions of source code must retain the above copyright
72632Sstever@eecs.umich.edu// notice, this list of conditions and the following disclaimer;
82632Sstever@eecs.umich.edu// redistributions in binary form must reproduce the above copyright
92632Sstever@eecs.umich.edu// notice, this list of conditions and the following disclaimer in the
102632Sstever@eecs.umich.edu// documentation and/or other materials provided with the distribution;
112632Sstever@eecs.umich.edu// neither the name of the copyright holders nor the names of its
122632Sstever@eecs.umich.edu// contributors may be used to endorse or promote products derived from
132632Sstever@eecs.umich.edu// this software without specific prior written permission.
142632Sstever@eecs.umich.edu//
152632Sstever@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
162632Sstever@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
172632Sstever@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
182632Sstever@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
192632Sstever@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
202632Sstever@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
212632Sstever@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
222632Sstever@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
232632Sstever@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
242632Sstever@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
252632Sstever@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
262632Sstever@eecs.umich.edu//
272632Sstever@eecs.umich.edu// Authors: Gabe Black
282632Sstever@eecs.umich.edu//          Steve Reinhardt
292632Sstever@eecs.umich.edu
302022SN/A////////////////////////////////////////////////////////////////////
312022SN/A//
322022SN/A// Trap instructions
332022SN/A//
342022SN/A
352022SN/Aoutput header {{
362022SN/A        /**
372469SN/A         * Base class for trap instructions,
382469SN/A         * or instructions that always fault.
392022SN/A         */
402022SN/A        class Trap : public SparcStaticInst
412022SN/A        {
422224SN/A          protected:
432022SN/A
442224SN/A            // Constructor
452469SN/A            Trap(const char *mnem, ExtMachInst _machInst, OpClass __opClass) :
462561SN/A                SparcStaticInst(mnem, _machInst, __opClass), trapNum(SW_TRAP)
472224SN/A            {
482224SN/A            }
492022SN/A
502224SN/A            std::string generateDisassembly(Addr pc,
512224SN/A                    const SymbolTable *symtab) const;
522561SN/A
532561SN/A            int trapNum;
542022SN/A        };
552022SN/A}};
562022SN/A
572022SN/Aoutput decoder {{
582224SN/A        std::string Trap::generateDisassembly(Addr pc,
592224SN/A                const SymbolTable *symtab) const
602022SN/A        {
612561SN/A            std::stringstream response;
622561SN/A
632561SN/A            printMnemonic(response, mnemonic);
642561SN/A            ccprintf(response, " ");
652561SN/A            printReg(response, _srcRegIdx[0]);
662561SN/A            ccprintf(response, ", 0x%x", trapNum);
672561SN/A            ccprintf(response, ", or ");
682561SN/A            printReg(response, _srcRegIdx[1]);
692561SN/A            return response.str();
702022SN/A        }
712022SN/A}};
722022SN/A
732022SN/Adef template TrapExecute {{
742224SN/A        Fault %(class_name)s::execute(%(CPU_exec_context)s *xc,
752224SN/A                Trace::InstRecord *traceData) const
762022SN/A        {
772469SN/A            Fault fault = NoFault;
782488SN/A            %(op_decl)s;
792488SN/A            %(op_rd)s;
802469SN/A            %(code)s
812469SN/A            return fault;
822022SN/A        }
832022SN/A}};
842022SN/A
852022SN/Adef format Trap(code, *opt_flags) {{
862022SN/A        orig_code = code
872022SN/A        cblk = CodeBlock(code)
882516SN/A        iop = InstObjParams(name, Name, 'Trap', cblk, opt_flags)
892022SN/A        header_output = BasicDeclare.subst(iop)
902022SN/A        decoder_output = BasicConstructor.subst(iop)
912469SN/A        decode_block = BasicDecode.subst(iop)
922022SN/A        exec_output = TrapExecute.subst(iop)
932022SN/A}};
94