unimp.isa revision 8738:66bf413b0d5b
13537Sgblack@eecs.umich.edu// -*- mode:c++ -*-
23537Sgblack@eecs.umich.edu
33537Sgblack@eecs.umich.edu// Copyright (c) 2007 MIPS Technologies, Inc.
43537Sgblack@eecs.umich.edu// All rights reserved.
53537Sgblack@eecs.umich.edu//
63537Sgblack@eecs.umich.edu// Redistribution and use in source and binary forms, with or without
73537Sgblack@eecs.umich.edu// modification, are permitted provided that the following conditions are
83537Sgblack@eecs.umich.edu// met: redistributions of source code must retain the above copyright
93537Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer;
103537Sgblack@eecs.umich.edu// redistributions in binary form must reproduce the above copyright
113537Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer in the
123537Sgblack@eecs.umich.edu// documentation and/or other materials provided with the distribution;
133537Sgblack@eecs.umich.edu// neither the name of the copyright holders nor the names of its
143537Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from
153537Sgblack@eecs.umich.edu// this software without specific prior written permission.
163537Sgblack@eecs.umich.edu//
173537Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
183537Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
193537Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
203537Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
213537Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
223537Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
233537Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
243537Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
253537Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
263537Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
274103Ssaidi@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
284103Ssaidi@eecs.umich.edu//
294103Ssaidi@eecs.umich.edu// Authors: Korey Sewell
303537Sgblack@eecs.umich.edu
313537Sgblack@eecs.umich.edu////////////////////////////////////////////////////////////////////
323537Sgblack@eecs.umich.edu//
333537Sgblack@eecs.umich.edu// Unimplemented instructions
343537Sgblack@eecs.umich.edu//
353537Sgblack@eecs.umich.edu
364103Ssaidi@eecs.umich.eduoutput header {{
376335Sgblack@eecs.umich.edu    /**
383827Shsul@eecs.umich.edu     * Static instruction class for unimplemented instructions that
398232Snate@binkert.org     * cause simulator termination.  Note that these are recognized
405647Sgblack@eecs.umich.edu     * (legal) instructions that the simulator does not support; the
415647Sgblack@eecs.umich.edu     * 'Unknown' class is used for unrecognized/illegal instructions.
423827Shsul@eecs.umich.edu     * This is a leaf class.
433537Sgblack@eecs.umich.edu     */
443537Sgblack@eecs.umich.edu    class FailUnimplemented : public MipsStaticInst
453894Shsul@eecs.umich.edu    {
465647Sgblack@eecs.umich.edu      public:
474009Ssaidi@eecs.umich.edu        /// Constructor
485810Sgblack@eecs.umich.edu        FailUnimplemented(const char *_mnemonic, MachInst _machInst)
495810Sgblack@eecs.umich.edu            : MipsStaticInst(_mnemonic, _machInst, No_OpClass)
504009Ssaidi@eecs.umich.edu        {
514103Ssaidi@eecs.umich.edu            // don't call execute() (which panics) if we're on a
524103Ssaidi@eecs.umich.edu            // speculative path
534009Ssaidi@eecs.umich.edu            flags[IsNonSpeculative] = true;
544009Ssaidi@eecs.umich.edu        }
555810Sgblack@eecs.umich.edu
565810Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
575810Sgblack@eecs.umich.edu
585810Sgblack@eecs.umich.edu        std::string
595810Sgblack@eecs.umich.edu        generateDisassembly(Addr pc, const SymbolTable *symtab) const;
605810Sgblack@eecs.umich.edu    };
615810Sgblack@eecs.umich.edu    class CP0Unimplemented : public MipsStaticInst
625647Sgblack@eecs.umich.edu    {
635647Sgblack@eecs.umich.edu      public:
645647Sgblack@eecs.umich.edu        /// Constructor
655647Sgblack@eecs.umich.edu        CP0Unimplemented(const char *_mnemonic, MachInst _machInst)
665647Sgblack@eecs.umich.edu            : MipsStaticInst(_mnemonic, _machInst, No_OpClass)
675647Sgblack@eecs.umich.edu        {
685647Sgblack@eecs.umich.edu            // don't call execute() (which panics) if we're on a
695647Sgblack@eecs.umich.edu            // speculative path
705810Sgblack@eecs.umich.edu            flags[IsNonSpeculative] = true;
714009Ssaidi@eecs.umich.edu        }
725704Snate@binkert.org
734009Ssaidi@eecs.umich.edu        %(BasicExecDeclare)s
744009Ssaidi@eecs.umich.edu
755704Snate@binkert.org        std::string
765704Snate@binkert.org        generateDisassembly(Addr pc, const SymbolTable *symtab) const;
774009Ssaidi@eecs.umich.edu    };
784103Ssaidi@eecs.umich.edu    class CP1Unimplemented : public MipsStaticInst
794103Ssaidi@eecs.umich.edu    {
804103Ssaidi@eecs.umich.edu      public:
814103Ssaidi@eecs.umich.edu        /// Constructor
824103Ssaidi@eecs.umich.edu        CP1Unimplemented(const char *_mnemonic, MachInst _machInst)
834103Ssaidi@eecs.umich.edu            : MipsStaticInst(_mnemonic, _machInst, No_OpClass)
844103Ssaidi@eecs.umich.edu        {
854103Ssaidi@eecs.umich.edu            // don't call execute() (which panics) if we're on a
864103Ssaidi@eecs.umich.edu            // speculative path
874009Ssaidi@eecs.umich.edu            flags[IsNonSpeculative] = true;
884009Ssaidi@eecs.umich.edu        }
895704Snate@binkert.org
905704Snate@binkert.org        %(BasicExecDeclare)s
913537Sgblack@eecs.umich.edu
924103Ssaidi@eecs.umich.edu        std::string
934103Ssaidi@eecs.umich.edu        generateDisassembly(Addr pc, const SymbolTable *symtab) const;
944103Ssaidi@eecs.umich.edu    };
953827Shsul@eecs.umich.edu    class CP2Unimplemented : public MipsStaticInst
964103Ssaidi@eecs.umich.edu    {
974103Ssaidi@eecs.umich.edu      public:
984009Ssaidi@eecs.umich.edu        /// Constructor
993894Shsul@eecs.umich.edu        CP2Unimplemented(const char *_mnemonic, MachInst _machInst)
1005704Snate@binkert.org            : MipsStaticInst(_mnemonic, _machInst, No_OpClass)
1015704Snate@binkert.org        {
1024009Ssaidi@eecs.umich.edu            // don't call execute() (which panics) if we're on a
1034103Ssaidi@eecs.umich.edu            // speculative path
1044103Ssaidi@eecs.umich.edu            flags[IsNonSpeculative] = true;
1054103Ssaidi@eecs.umich.edu        }
1063537Sgblack@eecs.umich.edu
1074103Ssaidi@eecs.umich.edu        %(BasicExecDeclare)s
1084103Ssaidi@eecs.umich.edu
1094103Ssaidi@eecs.umich.edu        std::string
1104009Ssaidi@eecs.umich.edu        generateDisassembly(Addr pc, const SymbolTable *symtab) const;
1113827Shsul@eecs.umich.edu    };
1125704Snate@binkert.org
1135704Snate@binkert.org    /**
1144009Ssaidi@eecs.umich.edu     * Base class for unimplemented instructions that cause a warning
1154103Ssaidi@eecs.umich.edu     * to be printed (but do not terminate simulation).  This
1164103Ssaidi@eecs.umich.edu     * implementation is a little screwy in that it will print a
1174103Ssaidi@eecs.umich.edu     * warning for each instance of a particular unimplemented machine
1184103Ssaidi@eecs.umich.edu     * instruction, not just for each unimplemented opcode.  Should
1194009Ssaidi@eecs.umich.edu     * probably make the 'warned' flag a static member of the derived
1203537Sgblack@eecs.umich.edu     * class.
1215704Snate@binkert.org     */
1225704Snate@binkert.org    class WarnUnimplemented : public MipsStaticInst
1234009Ssaidi@eecs.umich.edu    {
1244103Ssaidi@eecs.umich.edu      private:
1254009Ssaidi@eecs.umich.edu        /// Have we warned on this instruction yet?
1263537Sgblack@eecs.umich.edu        mutable bool warned;
1275704Snate@binkert.org
1285704Snate@binkert.org      public:
1294009Ssaidi@eecs.umich.edu        /// Constructor
1308829Sgblack@eecs.umich.edu        WarnUnimplemented(const char *_mnemonic, MachInst _machInst)
1318829Sgblack@eecs.umich.edu            : MipsStaticInst(_mnemonic, _machInst, No_OpClass), warned(false)
1323827Shsul@eecs.umich.edu        {
1334009Ssaidi@eecs.umich.edu            // don't call execute() (which panics) if we're on a
1344009Ssaidi@eecs.umich.edu            // speculative path
1354009Ssaidi@eecs.umich.edu            flags[IsNonSpeculative] = true;
1364009Ssaidi@eecs.umich.edu        }
1374009Ssaidi@eecs.umich.edu
1388829Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
1398829Sgblack@eecs.umich.edu
1404103Ssaidi@eecs.umich.edu        std::string
1414103Ssaidi@eecs.umich.edu        generateDisassembly(Addr pc, const SymbolTable *symtab) const;
14210474Sandreas.hansson@arm.com    };
1433894Shsul@eecs.umich.edu}};
1444103Ssaidi@eecs.umich.edu
1454103Ssaidi@eecs.umich.eduoutput decoder {{
14610474Sandreas.hansson@arm.com    std::string
1474009Ssaidi@eecs.umich.edu    FailUnimplemented::generateDisassembly(Addr pc,
1484103Ssaidi@eecs.umich.edu                                           const SymbolTable *symtab) const
1494103Ssaidi@eecs.umich.edu    {
1504103Ssaidi@eecs.umich.edu        return csprintf("%-10s (unimplemented)", mnemonic);
1514103Ssaidi@eecs.umich.edu    }
15210474Sandreas.hansson@arm.com
1534103Ssaidi@eecs.umich.edu    std::string
1544103Ssaidi@eecs.umich.edu    CP0Unimplemented::generateDisassembly(Addr pc,
1554103Ssaidi@eecs.umich.edu                                           const SymbolTable *symtab) const
15610474Sandreas.hansson@arm.com    {
1574103Ssaidi@eecs.umich.edu        return csprintf("%-10s (unimplemented)", mnemonic);
1584103Ssaidi@eecs.umich.edu    }
1594103Ssaidi@eecs.umich.edu
16010474Sandreas.hansson@arm.com    std::string
1614103Ssaidi@eecs.umich.edu    CP1Unimplemented::generateDisassembly(Addr pc,
1628829Sgblack@eecs.umich.edu                                           const SymbolTable *symtab) const
1634103Ssaidi@eecs.umich.edu    {
16410474Sandreas.hansson@arm.com        return csprintf("%-10s (unimplemented)", mnemonic);
1654103Ssaidi@eecs.umich.edu    }
1664103Ssaidi@eecs.umich.edu    std::string
16710474Sandreas.hansson@arm.com    CP2Unimplemented::generateDisassembly(Addr pc,
1684103Ssaidi@eecs.umich.edu                                           const SymbolTable *symtab) const
1694103Ssaidi@eecs.umich.edu    {
1705704Snate@binkert.org        return csprintf("%-10s (unimplemented)", mnemonic);
17110474Sandreas.hansson@arm.com    }
1724009Ssaidi@eecs.umich.edu
1734009Ssaidi@eecs.umich.edu    std::string
1744103Ssaidi@eecs.umich.edu    WarnUnimplemented::generateDisassembly(Addr pc,
17510474Sandreas.hansson@arm.com                                           const SymbolTable *symtab) const
1763894Shsul@eecs.umich.edu    {
1778829Sgblack@eecs.umich.edu        return csprintf("%-10s (unimplemented)", mnemonic);
1784103Ssaidi@eecs.umich.edu    }
1794009Ssaidi@eecs.umich.edu}};
1804009Ssaidi@eecs.umich.edu
1813537Sgblack@eecs.umich.eduoutput exec {{
1825704Snate@binkert.org    Fault
1835704Snate@binkert.org    FailUnimplemented::execute(%(CPU_exec_context)s *xc,
1847741Sgblack@eecs.umich.edu                               Trace::InstRecord *traceData) const
1853654Shsul@eecs.umich.edu    {
1865704Snate@binkert.org        panic("attempt to execute unimplemented instruction '%s' "
1875704Snate@binkert.org              "(inst 0x%08x, opcode 0x%x, binary:%s)", mnemonic, machInst, OPCODE,
1884103Ssaidi@eecs.umich.edu              inst2string(machInst));
1894103Ssaidi@eecs.umich.edu        return NoFault;
1904103Ssaidi@eecs.umich.edu    }
1914103Ssaidi@eecs.umich.edu
1924103Ssaidi@eecs.umich.edu    Fault
1935704Snate@binkert.org    CP0Unimplemented::execute(%(CPU_exec_context)s *xc,
1945704Snate@binkert.org                               Trace::InstRecord *traceData) const
1954009Ssaidi@eecs.umich.edu    {
1964103Ssaidi@eecs.umich.edu        if (FullSystem) {
1974103Ssaidi@eecs.umich.edu            if (!isCoprocessorEnabled(xc, 0))
1984009Ssaidi@eecs.umich.edu                return new CoprocessorUnusableFault(0);
1993537Sgblack@eecs.umich.edu            else
2005704Snate@binkert.org                return new ReservedInstructionFault;
2015704Snate@binkert.org        } else {
2024009Ssaidi@eecs.umich.edu            panic("attempt to execute unimplemented instruction '%s' "
2034103Ssaidi@eecs.umich.edu                    "(inst %#08x, opcode %#x, binary:%s)",
2044103Ssaidi@eecs.umich.edu                    mnemonic, machInst, OPCODE, inst2string(machInst));
2054009Ssaidi@eecs.umich.edu            return NoFault;
2064009Ssaidi@eecs.umich.edu        }
2074009Ssaidi@eecs.umich.edu    }
2083537Sgblack@eecs.umich.edu
2093537Sgblack@eecs.umich.edu    Fault
210    CP1Unimplemented::execute(%(CPU_exec_context)s *xc,
211                               Trace::InstRecord *traceData) const
212    {
213        if (FullSystem) {
214            if (!isCoprocessorEnabled(xc, 1))
215                return new CoprocessorUnusableFault(1);
216            else
217                return new ReservedInstructionFault;
218        } else {
219            panic("attempt to execute unimplemented instruction '%s' "
220                    "(inst %#08x, opcode %#x, binary:%s)",
221                    mnemonic, machInst, OPCODE, inst2string(machInst));
222            return NoFault;
223        }
224    }
225
226    Fault
227    CP2Unimplemented::execute(%(CPU_exec_context)s *xc,
228                               Trace::InstRecord *traceData) const
229    {
230        if (FullSystem) {
231            if (!isCoprocessorEnabled(xc, 2))
232                return new CoprocessorUnusableFault(2);
233            else
234                return new ReservedInstructionFault;
235        } else {
236            panic("attempt to execute unimplemented instruction '%s' "
237                    "(inst %#08x, opcode %#x, binary:%s)",
238                    mnemonic, machInst, OPCODE, inst2string(machInst));
239            return NoFault;
240        }
241    }
242
243    Fault
244    WarnUnimplemented::execute(%(CPU_exec_context)s *xc,
245                               Trace::InstRecord *traceData) const
246    {
247        if (!warned) {
248            warn("\tinstruction '%s' unimplemented\n", mnemonic);
249            warned = true;
250        }
251
252        return NoFault;
253    }
254}};
255
256
257def format FailUnimpl() {{
258    iop = InstObjParams(name, 'FailUnimplemented')
259    decode_block = BasicDecodeWithMnemonic.subst(iop)
260
261}};
262def format CP0Unimpl() {{
263    iop = InstObjParams(name, 'CP0Unimplemented')
264    decode_block = BasicDecodeWithMnemonic.subst(iop)
265}};
266def format CP1Unimpl() {{
267    iop = InstObjParams(name, 'CP1Unimplemented')
268    decode_block = BasicDecodeWithMnemonic.subst(iop)
269}};
270def format CP2Unimpl() {{
271    iop = InstObjParams(name, 'CP2Unimplemented')
272    decode_block = BasicDecodeWithMnemonic.subst(iop)
273}};
274def format WarnUnimpl() {{
275    iop = InstObjParams(name, 'WarnUnimplemented')
276    decode_block = BasicDecodeWithMnemonic.subst(iop)
277}};
278
279