unknown.isa revision 12616
112726Snikos.nikoleris@arm.com// -*- mode:c++ -*-
212726Snikos.nikoleris@arm.com
312726Snikos.nikoleris@arm.com// Copyright (c) 2006 The Regents of The University of Michigan
412726Snikos.nikoleris@arm.com// All rights reserved.
512726Snikos.nikoleris@arm.com//
612726Snikos.nikoleris@arm.com// Redistribution and use in source and binary forms, with or without
712726Snikos.nikoleris@arm.com// modification, are permitted provided that the following conditions are
812726Snikos.nikoleris@arm.com// met: redistributions of source code must retain the above copyright
912726Snikos.nikoleris@arm.com// notice, this list of conditions and the following disclaimer;
1012726Snikos.nikoleris@arm.com// redistributions in binary form must reproduce the above copyright
1112726Snikos.nikoleris@arm.com// notice, this list of conditions and the following disclaimer in the
1212726Snikos.nikoleris@arm.com// documentation and/or other materials provided with the distribution;
1312726Snikos.nikoleris@arm.com// neither the name of the copyright holders nor the names of its
1412726Snikos.nikoleris@arm.com// contributors may be used to endorse or promote products derived from
1512726Snikos.nikoleris@arm.com// this software without specific prior written permission.
1612726Snikos.nikoleris@arm.com//
1712726Snikos.nikoleris@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1812726Snikos.nikoleris@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1912726Snikos.nikoleris@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2012726Snikos.nikoleris@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2112726Snikos.nikoleris@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2212726Snikos.nikoleris@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2312726Snikos.nikoleris@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2412726Snikos.nikoleris@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2512726Snikos.nikoleris@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2612726Snikos.nikoleris@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2712726Snikos.nikoleris@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2812726Snikos.nikoleris@arm.com//
2912726Snikos.nikoleris@arm.com// Authors: Korey Sewell
3012726Snikos.nikoleris@arm.com
3112726Snikos.nikoleris@arm.com////////////////////////////////////////////////////////////////////
3212726Snikos.nikoleris@arm.com//
3312726Snikos.nikoleris@arm.com// Unknown instructions
3412726Snikos.nikoleris@arm.com//
3512726Snikos.nikoleris@arm.com
3612726Snikos.nikoleris@arm.comoutput header {{
3712726Snikos.nikoleris@arm.com    /**
3812726Snikos.nikoleris@arm.com     * Static instruction class for unknown (illegal) instructions.
3912726Snikos.nikoleris@arm.com     * These cause simulator termination if they are executed in a
4012726Snikos.nikoleris@arm.com     * non-speculative mode.  This is a leaf class.
4112726Snikos.nikoleris@arm.com     */
4212726Snikos.nikoleris@arm.com    class Unknown : public MipsStaticInst
4312726Snikos.nikoleris@arm.com    {
4412726Snikos.nikoleris@arm.com      public:
4512726Snikos.nikoleris@arm.com        /// Constructor
4612726Snikos.nikoleris@arm.com        Unknown(MachInst _machInst)
4712726Snikos.nikoleris@arm.com            : MipsStaticInst("unknown", _machInst, No_OpClass)
4812726Snikos.nikoleris@arm.com        {
4912726Snikos.nikoleris@arm.com            // don't call execute() (which panics) if we're on a
5012726Snikos.nikoleris@arm.com            // speculative path
5112726Snikos.nikoleris@arm.com            flags[IsNonSpeculative] = true;
5212726Snikos.nikoleris@arm.com        }
5312726Snikos.nikoleris@arm.com
5412726Snikos.nikoleris@arm.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
5512726Snikos.nikoleris@arm.com
5612726Snikos.nikoleris@arm.com        std::string generateDisassembly(
5712726Snikos.nikoleris@arm.com                Addr pc, const SymbolTable *symtab) const override;
5812726Snikos.nikoleris@arm.com    };
5912726Snikos.nikoleris@arm.com}};
6012726Snikos.nikoleris@arm.com
6112726Snikos.nikoleris@arm.comoutput decoder {{
6212726Snikos.nikoleris@arm.com    std::string
6312726Snikos.nikoleris@arm.com    Unknown::generateDisassembly(Addr pc, const SymbolTable *symtab) const
6412726Snikos.nikoleris@arm.com    {
6512726Snikos.nikoleris@arm.com        return csprintf("%-10s (inst 0x%x, opcode 0x%x, binary:%s)",
6612726Snikos.nikoleris@arm.com                        "unknown", machInst, OPCODE, inst2string(machInst));
6712726Snikos.nikoleris@arm.com    }
6812726Snikos.nikoleris@arm.com}};
6912726Snikos.nikoleris@arm.com
7012726Snikos.nikoleris@arm.comoutput exec {{
7112726Snikos.nikoleris@arm.com    Fault
7212726Snikos.nikoleris@arm.com    Unknown::execute(ExecContext *xc, Trace::InstRecord *traceData) const
7312726Snikos.nikoleris@arm.com    {
7412726Snikos.nikoleris@arm.com        return std::make_shared<ReservedInstructionFault>();
7512726Snikos.nikoleris@arm.com    }
7612726Snikos.nikoleris@arm.com}};
7712726Snikos.nikoleris@arm.com
7812726Snikos.nikoleris@arm.comdef format Unknown() {{
7912726Snikos.nikoleris@arm.com    decode_block = 'return new Unknown(machInst);\n'
8012726Snikos.nikoleris@arm.com}};
8112726Snikos.nikoleris@arm.com
8212726Snikos.nikoleris@arm.com