unimp.isa revision 5222:bb733a878f85
112340Szulian@eit.uni-kl.de// -*- mode:c++ -*-
212340Szulian@eit.uni-kl.de
312340Szulian@eit.uni-kl.de// Copyright N) 2007 MIPS Technologies, Inc.  All Rights Reserved
412340Szulian@eit.uni-kl.de
512340Szulian@eit.uni-kl.de//  This software is part of the M5 simulator.
612340Szulian@eit.uni-kl.de
712340Szulian@eit.uni-kl.de//  THIS IS A LEGAL AGREEMENT.  BY DOWNLOADING, USING, COPYING, CREATING
812340Szulian@eit.uni-kl.de//  DERIVATIVE WORKS, AND/OR DISTRIBUTING THIS SOFTWARE YOU ARE AGREEING
912340Szulian@eit.uni-kl.de//  TO THESE TERMS AND CONDITIONS.
1012340Szulian@eit.uni-kl.de
1112340Szulian@eit.uni-kl.de//  Permission is granted to use, copy, create derivative works and
1212340Szulian@eit.uni-kl.de//  distribute this software and such derivative works for any purpose,
1312340Szulian@eit.uni-kl.de//  so long as (1) the copyright notice above, this grant of permission,
1412340Szulian@eit.uni-kl.de//  and the disclaimer below appear in all copies and derivative works
1512340Szulian@eit.uni-kl.de//  made, (2) the copyright notice above is augmented as appropriate to
1612340Szulian@eit.uni-kl.de//  reflect the addition of any new copyrightable work in a derivative
1712340Szulian@eit.uni-kl.de//  work (e.g., Copyright N) <Publication Year> Copyright Owner), and (3)
1812340Szulian@eit.uni-kl.de//  the name of MIPS Technologies, Inc. ($(B!H(BMIPS$(B!I(B) is not used in any
1912340Szulian@eit.uni-kl.de//  advertising or publicity pertaining to the use or distribution of
2012340Szulian@eit.uni-kl.de//  this software without specific, written prior authorization.
2112340Szulian@eit.uni-kl.de
2212340Szulian@eit.uni-kl.de//  THIS SOFTWARE IS PROVIDED $(B!H(BAS IS.$(B!I(B  MIPS MAKES NO WARRANTIES AND
2312340Szulian@eit.uni-kl.de//  DISCLAIMS ALL WARRANTIES, WHETHER EXPRESS, STATUTORY, IMPLIED OR
2412340Szulian@eit.uni-kl.de//  OTHERWISE, INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
2512340Szulian@eit.uni-kl.de//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
2612340Szulian@eit.uni-kl.de//  NON-INFRINGEMENT OF THIRD PARTY RIGHTS, REGARDING THIS SOFTWARE.
2712340Szulian@eit.uni-kl.de//  IN NO EVENT SHALL MIPS BE LIABLE FOR ANY DAMAGES, INCLUDING DIRECT,
2812340Szulian@eit.uni-kl.de//  INDIRECT, INCIDENTAL, CONSEQUENTIAL, SPECIAL, OR PUNITIVE DAMAGES OF
2912340Szulian@eit.uni-kl.de//  ANY KIND OR NATURE, ARISING OUT OF OR IN CONNECTION WITH THIS AGREEMENT,
3012340Szulian@eit.uni-kl.de//  THIS SOFTWARE AND/OR THE USE OF THIS SOFTWARE, WHETHER SUCH LIABILITY
3112340Szulian@eit.uni-kl.de//  IS ASSERTED ON THE BASIS OF CONTRACT, TORT (INCLUDING NEGLIGENCE OR
3212340Szulian@eit.uni-kl.de//  STRICT LIABILITY), OR OTHERWISE, EVEN IF MIPS HAS BEEN WARNED OF THE
3313774Sandreas.sandberg@arm.com//  POSSIBILITY OF ANY SUCH LOSS OR DAMAGE IN ADVANCE.
3413774Sandreas.sandberg@arm.com
3513774Sandreas.sandberg@arm.com//Authors: Korey L. Sewell
3612340Szulian@eit.uni-kl.de
3712340Szulian@eit.uni-kl.de
3812340Szulian@eit.uni-kl.de////////////////////////////////////////////////////////////////////
3912340Szulian@eit.uni-kl.de//
4012340Szulian@eit.uni-kl.de// Unimplemented instructions
4112340Szulian@eit.uni-kl.de//
4212340Szulian@eit.uni-kl.de
4312340Szulian@eit.uni-kl.deoutput header {{
4412340Szulian@eit.uni-kl.de    /**
4512340Szulian@eit.uni-kl.de     * Static instruction class for unimplemented instructions that
4612340Szulian@eit.uni-kl.de     * cause simulator termination.  Note that these are recognized
4712340Szulian@eit.uni-kl.de     * (legal) instructions that the simulator does not support; the
4812340Szulian@eit.uni-kl.de     * 'Unknown' class is used for unrecognized/illegal instructions.
4912340Szulian@eit.uni-kl.de     * This is a leaf class.
5012340Szulian@eit.uni-kl.de     */
5112340Szulian@eit.uni-kl.de    class FailUnimplemented : public MipsStaticInst
5212340Szulian@eit.uni-kl.de    {
5312340Szulian@eit.uni-kl.de      public:
5412340Szulian@eit.uni-kl.de        /// Constructor
5512340Szulian@eit.uni-kl.de        FailUnimplemented(const char *_mnemonic, MachInst _machInst)
5612340Szulian@eit.uni-kl.de            : MipsStaticInst(_mnemonic, _machInst, No_OpClass)
5712340Szulian@eit.uni-kl.de        {
5812340Szulian@eit.uni-kl.de            // don't call execute() (which panics) if we're on a
5912340Szulian@eit.uni-kl.de            // speculative path
6012340Szulian@eit.uni-kl.de            flags[IsNonSpeculative] = true;
6112340Szulian@eit.uni-kl.de        }
6212340Szulian@eit.uni-kl.de
6312340Szulian@eit.uni-kl.de        %(BasicExecDeclare)s
6412340Szulian@eit.uni-kl.de
6512340Szulian@eit.uni-kl.de        std::string
6612340Szulian@eit.uni-kl.de        generateDisassembly(Addr pc, const SymbolTable *symtab) const;
6712340Szulian@eit.uni-kl.de    };
6812340Szulian@eit.uni-kl.de    class CP0Unimplemented : public MipsStaticInst
6912340Szulian@eit.uni-kl.de    {
7012340Szulian@eit.uni-kl.de      public:
7112340Szulian@eit.uni-kl.de        /// Constructor
7212340Szulian@eit.uni-kl.de        CP0Unimplemented(const char *_mnemonic, MachInst _machInst)
7312340Szulian@eit.uni-kl.de            : MipsStaticInst(_mnemonic, _machInst, No_OpClass)
7412340Szulian@eit.uni-kl.de        {
7512340Szulian@eit.uni-kl.de            // don't call execute() (which panics) if we're on a
7612340Szulian@eit.uni-kl.de            // speculative path
7712340Szulian@eit.uni-kl.de            flags[IsNonSpeculative] = true;
7812340Szulian@eit.uni-kl.de        }
7912340Szulian@eit.uni-kl.de
8012340Szulian@eit.uni-kl.de        %(BasicExecDeclare)s
8112340Szulian@eit.uni-kl.de
8212340Szulian@eit.uni-kl.de        std::string
8312340Szulian@eit.uni-kl.de        generateDisassembly(Addr pc, const SymbolTable *symtab) const;
8412340Szulian@eit.uni-kl.de    };
8512340Szulian@eit.uni-kl.de    class CP1Unimplemented : public MipsStaticInst
8612340Szulian@eit.uni-kl.de    {
87      public:
88        /// Constructor
89        CP1Unimplemented(const char *_mnemonic, MachInst _machInst)
90            : MipsStaticInst(_mnemonic, _machInst, No_OpClass)
91        {
92            // don't call execute() (which panics) if we're on a
93            // speculative path
94            flags[IsNonSpeculative] = true;
95        }
96
97        %(BasicExecDeclare)s
98
99        std::string
100        generateDisassembly(Addr pc, const SymbolTable *symtab) const;
101    };
102    class CP2Unimplemented : public MipsStaticInst
103    {
104      public:
105        /// Constructor
106        CP2Unimplemented(const char *_mnemonic, MachInst _machInst)
107            : MipsStaticInst(_mnemonic, _machInst, No_OpClass)
108        {
109            // don't call execute() (which panics) if we're on a
110            // speculative path
111            flags[IsNonSpeculative] = true;
112        }
113
114        %(BasicExecDeclare)s
115
116        std::string
117        generateDisassembly(Addr pc, const SymbolTable *symtab) const;
118    };
119
120    /**
121     * Base class for unimplemented instructions that cause a warning
122     * to be printed (but do not terminate simulation).  This
123     * implementation is a little screwy in that it will print a
124     * warning for each instance of a particular unimplemented machine
125     * instruction, not just for each unimplemented opcode.  Should
126     * probably make the 'warned' flag a static member of the derived
127     * class.
128     */
129    class WarnUnimplemented : public MipsStaticInst
130    {
131      private:
132        /// Have we warned on this instruction yet?
133        mutable bool warned;
134
135      public:
136        /// Constructor
137        WarnUnimplemented(const char *_mnemonic, MachInst _machInst)
138            : MipsStaticInst(_mnemonic, _machInst, No_OpClass), warned(false)
139        {
140            // don't call execute() (which panics) if we're on a
141            // speculative path
142            flags[IsNonSpeculative] = true;
143        }
144
145        %(BasicExecDeclare)s
146
147        std::string
148        generateDisassembly(Addr pc, const SymbolTable *symtab) const;
149    };
150}};
151
152output decoder {{
153    std::string
154    FailUnimplemented::generateDisassembly(Addr pc,
155                                           const SymbolTable *symtab) const
156    {
157        return csprintf("%-10s (unimplemented)", mnemonic);
158    }
159
160    std::string
161    CP0Unimplemented::generateDisassembly(Addr pc,
162                                           const SymbolTable *symtab) const
163    {
164        return csprintf("%-10s (unimplemented)", mnemonic);
165    }
166
167    std::string
168    CP1Unimplemented::generateDisassembly(Addr pc,
169                                           const SymbolTable *symtab) const
170    {
171        return csprintf("%-10s (unimplemented)", mnemonic);
172    }
173    std::string
174    CP2Unimplemented::generateDisassembly(Addr pc,
175                                           const SymbolTable *symtab) const
176    {
177        return csprintf("%-10s (unimplemented)", mnemonic);
178    }
179
180    std::string
181    WarnUnimplemented::generateDisassembly(Addr pc,
182                                           const SymbolTable *symtab) const
183    {
184        return csprintf("%-10s (unimplemented)", mnemonic);
185    }
186}};
187
188output exec {{
189    Fault
190    FailUnimplemented::execute(%(CPU_exec_context)s *xc,
191                               Trace::InstRecord *traceData) const
192    {
193        panic("attempt to execute unimplemented instruction '%s' "
194              "(inst 0x%08x, opcode 0x%x, binary:%s)", mnemonic, machInst, OPCODE,
195              inst2string(machInst));
196        return new UnimplementedOpcodeFault;
197    }
198
199    Fault
200    CP0Unimplemented::execute(%(CPU_exec_context)s *xc,
201                               Trace::InstRecord *traceData) const
202    {
203#if  FULL_SYSTEM
204      if (!isCoprocessorEnabled(xc, 0)) {
205        return new CoprocessorUnusableFault(0);
206      }
207      return new ReservedInstructionFault;
208#else
209        panic("attempt to execute unimplemented instruction '%s' "
210              "(inst 0x%08x, opcode 0x%x, binary:%s)", mnemonic, machInst, OPCODE,
211              inst2string(machInst));
212        return new UnimplementedOpcodeFault;
213#endif
214    }
215
216    Fault
217    CP1Unimplemented::execute(%(CPU_exec_context)s *xc,
218                               Trace::InstRecord *traceData) const
219    {
220#if  FULL_SYSTEM
221      if (!isCoprocessorEnabled(xc, 1)) {
222        return new CoprocessorUnusableFault(1);
223      }
224      return new ReservedInstructionFault;
225#else
226        panic("attempt to execute unimplemented instruction '%s' "
227              "(inst 0x%08x, opcode 0x%x, binary:%s)", mnemonic, machInst, OPCODE,
228              inst2string(machInst));
229        return new UnimplementedOpcodeFault;
230#endif
231    }
232    Fault
233    CP2Unimplemented::execute(%(CPU_exec_context)s *xc,
234                               Trace::InstRecord *traceData) const
235    {
236#if  FULL_SYSTEM
237      if (!isCoprocessorEnabled(xc, 2)) {
238        return new CoprocessorUnusableFault(2);
239      }
240      return new ReservedInstructionFault;
241#else
242        panic("attempt to execute unimplemented instruction '%s' "
243              "(inst 0x%08x, opcode 0x%x, binary:%s)", mnemonic, machInst, OPCODE,
244              inst2string(machInst));
245        return new UnimplementedOpcodeFault;
246#endif
247    }
248
249    Fault
250    WarnUnimplemented::execute(%(CPU_exec_context)s *xc,
251                               Trace::InstRecord *traceData) const
252    {
253        if (!warned) {
254            warn("\tinstruction '%s' unimplemented\n", mnemonic);
255            warned = true;
256        }
257
258        return NoFault;
259    }
260}};
261
262
263def format FailUnimpl() {{
264    iop = InstObjParams(name, 'FailUnimplemented')
265    decode_block = BasicDecodeWithMnemonic.subst(iop)
266
267}};
268def format CP0Unimpl() {{
269    iop = InstObjParams(name, 'CP0Unimplemented')
270    decode_block = BasicDecodeWithMnemonic.subst(iop)
271}};
272def format CP1Unimpl() {{
273    iop = InstObjParams(name, 'CP1Unimplemented')
274    decode_block = BasicDecodeWithMnemonic.subst(iop)
275}};
276def format CP2Unimpl() {{
277    iop = InstObjParams(name, 'CP2Unimplemented')
278    decode_block = BasicDecodeWithMnemonic.subst(iop)
279}};
280def format WarnUnimpl() {{
281    iop = InstObjParams(name, 'WarnUnimplemented')
282    decode_block = BasicDecodeWithMnemonic.subst(iop)
283}};
284
285