unimp.isa revision 2649:2fb859a457a2
1// -*- mode:c++ -*-
2
3// Copyright (c) 2003-2005 The Regents of The University of Michigan
4// All rights reserved.
5//
6// Redistribution and use in source and binary forms, with or without
7// modification, are permitted provided that the following conditions are
8// met: redistributions of source code must retain the above copyright
9// notice, this list of conditions and the following disclaimer;
10// redistributions in binary form must reproduce the above copyright
11// notice, this list of conditions and the following disclaimer in the
12// documentation and/or other materials provided with the distribution;
13// neither the name of the copyright holders nor the names of its
14// contributors may be used to endorse or promote products derived from
15// this software without specific prior written permission.
16//
17// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
29////////////////////////////////////////////////////////////////////
30//
31// Unimplemented instructions
32//
33
34output header {{
35    /**
36     * Static instruction class for unimplemented instructions that
37     * cause simulator termination.  Note that these are recognized
38     * (legal) instructions that the simulator does not support; the
39     * 'Unknown' class is used for unrecognized/illegal instructions.
40     * This is a leaf class.
41     */
42    class FailUnimplemented : public AlphaStaticInst
43    {
44      public:
45        /// Constructor
46        FailUnimplemented(const char *_mnemonic, ExtMachInst _machInst)
47            : AlphaStaticInst(_mnemonic, _machInst, No_OpClass)
48        {
49            // don't call execute() (which panics) if we're on a
50            // speculative path
51            flags[IsNonSpeculative] = true;
52        }
53
54        %(BasicExecDeclare)s
55
56        std::string
57        generateDisassembly(Addr pc, const SymbolTable *symtab) const;
58    };
59
60    /**
61     * Base class for unimplemented instructions that cause a warning
62     * to be printed (but do not terminate simulation).  This
63     * implementation is a little screwy in that it will print a
64     * warning for each instance of a particular unimplemented machine
65     * instruction, not just for each unimplemented opcode.  Should
66     * probably make the 'warned' flag a static member of the derived
67     * class.
68     */
69    class WarnUnimplemented : public AlphaStaticInst
70    {
71      private:
72        /// Have we warned on this instruction yet?
73        mutable bool warned;
74
75      public:
76        /// Constructor
77        WarnUnimplemented(const char *_mnemonic, ExtMachInst _machInst)
78            : AlphaStaticInst(_mnemonic, _machInst, No_OpClass), warned(false)
79        {
80            // don't call execute() (which panics) if we're on a
81            // speculative path
82            flags[IsNonSpeculative] = true;
83        }
84
85        %(BasicExecDeclare)s
86
87        std::string
88        generateDisassembly(Addr pc, const SymbolTable *symtab) const;
89    };
90}};
91
92output decoder {{
93    std::string
94    FailUnimplemented::generateDisassembly(Addr pc,
95                                           const SymbolTable *symtab) const
96    {
97        return csprintf("%-10s (unimplemented)", mnemonic);
98    }
99
100    std::string
101    WarnUnimplemented::generateDisassembly(Addr pc,
102                                           const SymbolTable *symtab) const
103    {
104#ifdef SS_COMPATIBLE_DISASSEMBLY
105        return csprintf("%-10s", mnemonic);
106#else
107        return csprintf("%-10s (unimplemented)", mnemonic);
108#endif
109    }
110}};
111
112output exec {{
113    Fault
114    FailUnimplemented::execute(%(CPU_exec_context)s *xc,
115                               Trace::InstRecord *traceData) const
116    {
117        panic("attempt to execute unimplemented instruction '%s' "
118              "(inst 0x%08x, opcode 0x%x)", mnemonic, machInst, OPCODE);
119        return new UnimplementedOpcodeFault;
120    }
121
122    Fault
123    WarnUnimplemented::execute(%(CPU_exec_context)s *xc,
124                               Trace::InstRecord *traceData) const
125    {
126        if (!warned) {
127            warn("instruction '%s' unimplemented\n", mnemonic);
128            warned = true;
129        }
130
131        return NoFault;
132    }
133}};
134
135
136def format FailUnimpl() {{
137    iop = InstObjParams(name, 'FailUnimplemented')
138    decode_block = BasicDecodeWithMnemonic.subst(iop)
139}};
140
141def format WarnUnimpl() {{
142    iop = InstObjParams(name, 'WarnUnimplemented')
143    decode_block = BasicDecodeWithMnemonic.subst(iop)
144}};
145
146output header {{
147    /**
148     * Static instruction class for unknown (illegal) instructions.
149     * These cause simulator termination if they are executed in a
150     * non-speculative mode.  This is a leaf class.
151     */
152    class Unknown : public AlphaStaticInst
153    {
154      public:
155        /// Constructor
156        Unknown(ExtMachInst _machInst)
157            : AlphaStaticInst("unknown", _machInst, No_OpClass)
158        {
159            // don't call execute() (which panics) if we're on a
160            // speculative path
161            flags[IsNonSpeculative] = true;
162        }
163
164        %(BasicExecDeclare)s
165
166        std::string
167        generateDisassembly(Addr pc, const SymbolTable *symtab) const;
168    };
169}};
170
171