16691Stjones1@inf.ed.ac.uk// -*- mode:c++ -*-
26691Stjones1@inf.ed.ac.uk
36691Stjones1@inf.ed.ac.uk// Copyright (c) 2007-2008 The Florida State University
46691Stjones1@inf.ed.ac.uk// Copyright (c) 2009 The University of Edinburgh
56691Stjones1@inf.ed.ac.uk// All rights reserved.
66691Stjones1@inf.ed.ac.uk//
76691Stjones1@inf.ed.ac.uk// Redistribution and use in source and binary forms, with or without
86691Stjones1@inf.ed.ac.uk// modification, are permitted provided that the following conditions are
96691Stjones1@inf.ed.ac.uk// met: redistributions of source code must retain the above copyright
106691Stjones1@inf.ed.ac.uk// notice, this list of conditions and the following disclaimer;
116691Stjones1@inf.ed.ac.uk// redistributions in binary form must reproduce the above copyright
126691Stjones1@inf.ed.ac.uk// notice, this list of conditions and the following disclaimer in the
136691Stjones1@inf.ed.ac.uk// documentation and/or other materials provided with the distribution;
146691Stjones1@inf.ed.ac.uk// neither the name of the copyright holders nor the names of its
156691Stjones1@inf.ed.ac.uk// contributors may be used to endorse or promote products derived from
166691Stjones1@inf.ed.ac.uk// this software without specific prior written permission.
176691Stjones1@inf.ed.ac.uk//
186691Stjones1@inf.ed.ac.uk// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
196691Stjones1@inf.ed.ac.uk// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
206691Stjones1@inf.ed.ac.uk// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
216691Stjones1@inf.ed.ac.uk// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
226691Stjones1@inf.ed.ac.uk// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
236691Stjones1@inf.ed.ac.uk// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
246691Stjones1@inf.ed.ac.uk// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
256691Stjones1@inf.ed.ac.uk// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
266691Stjones1@inf.ed.ac.uk// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
276691Stjones1@inf.ed.ac.uk// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
286691Stjones1@inf.ed.ac.uk// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
296691Stjones1@inf.ed.ac.uk//
306691Stjones1@inf.ed.ac.uk// Authors: Stephen Hines
316691Stjones1@inf.ed.ac.uk//          Timothy M. Jones
326691Stjones1@inf.ed.ac.uk
336691Stjones1@inf.ed.ac.uk////////////////////////////////////////////////////////////////////
346691Stjones1@inf.ed.ac.uk//
356691Stjones1@inf.ed.ac.uk// Unknown instructions
366691Stjones1@inf.ed.ac.uk//
376691Stjones1@inf.ed.ac.uk
386691Stjones1@inf.ed.ac.ukoutput header {{
396691Stjones1@inf.ed.ac.uk    /**
406691Stjones1@inf.ed.ac.uk     * Static instruction class for unknown (illegal) instructions.
416691Stjones1@inf.ed.ac.uk     * These cause simulator termination if they are executed in a
426691Stjones1@inf.ed.ac.uk     * non-speculative mode.  This is a leaf class.
436691Stjones1@inf.ed.ac.uk     */
446691Stjones1@inf.ed.ac.uk    class Unknown : public PowerStaticInst
456691Stjones1@inf.ed.ac.uk    {
466691Stjones1@inf.ed.ac.uk      public:
476691Stjones1@inf.ed.ac.uk        /// Constructor
486691Stjones1@inf.ed.ac.uk        Unknown(ExtMachInst _machInst)
496691Stjones1@inf.ed.ac.uk            : PowerStaticInst("unknown", _machInst, No_OpClass)
506691Stjones1@inf.ed.ac.uk        {
516691Stjones1@inf.ed.ac.uk            // don't call execute() (which panics) if we're on a
526691Stjones1@inf.ed.ac.uk            // speculative path
536691Stjones1@inf.ed.ac.uk            flags[IsNonSpeculative] = true;
546691Stjones1@inf.ed.ac.uk        }
556691Stjones1@inf.ed.ac.uk
5612616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
576691Stjones1@inf.ed.ac.uk
5812616Sgabeblack@google.com        std::string generateDisassembly(
5912616Sgabeblack@google.com                Addr pc, const SymbolTable *symtab) const override;
606691Stjones1@inf.ed.ac.uk    };
616691Stjones1@inf.ed.ac.uk}};
626691Stjones1@inf.ed.ac.uk
636691Stjones1@inf.ed.ac.ukoutput decoder {{
646691Stjones1@inf.ed.ac.uk    std::string
656691Stjones1@inf.ed.ac.uk    Unknown::generateDisassembly(Addr pc, const SymbolTable *symtab) const
666691Stjones1@inf.ed.ac.uk    {
676691Stjones1@inf.ed.ac.uk        return csprintf("%-10s (inst 0x%x, opcode 0x%x, binary:%s)",
686691Stjones1@inf.ed.ac.uk                        "unknown", machInst, OPCODE, inst2string(machInst));
696691Stjones1@inf.ed.ac.uk    }
706691Stjones1@inf.ed.ac.uk}};
716691Stjones1@inf.ed.ac.uk
726691Stjones1@inf.ed.ac.ukoutput exec {{
736691Stjones1@inf.ed.ac.uk    Fault
7412234Sgabeblack@google.com    Unknown::execute(ExecContext *xc, Trace::InstRecord *traceData) const
756691Stjones1@inf.ed.ac.uk    {
766691Stjones1@inf.ed.ac.uk        panic("attempt to execute unknown instruction at %#x"
776691Stjones1@inf.ed.ac.uk              "(inst 0x%08x, opcode 0x%x, binary: %s)",
787720Sgblack@eecs.umich.edu              xc->pcState().pc(), machInst, OPCODE, inst2string(machInst));
7910474Sandreas.hansson@arm.com        return std::make_shared<UnimplementedOpcodeFault>();
806691Stjones1@inf.ed.ac.uk    }
816691Stjones1@inf.ed.ac.uk}};
826691Stjones1@inf.ed.ac.uk
836691Stjones1@inf.ed.ac.ukdef format Unknown() {{
846691Stjones1@inf.ed.ac.uk    decode_block = 'return new Unknown(machInst);\n'
856691Stjones1@inf.ed.ac.uk}};
866691Stjones1@inf.ed.ac.uk
87